我正在尝试用Three.js编写一个小程序,显示两个球,其中一个在另一个内部。球2的半径应在0.5和1.5之间振荡,而球1的半径始终为1.0。每个球都是透明的(不透明度:0.5),因此可以看到包含在较大球体中的较小球体。当然,随着球2的半径变化,“较小”和“较大”的角色会改变。
现在的问题是Three.js使第一个球变成了透明。我在我的程序中定义了球1但没有定义第二个球。如果我先定义球1,则它变成透明的,但是球2完全不透明。如果我先定义球2,则这是透明的。将它们添加到场景的顺序并不重要。
我在下面包含了一个最小化的程序,演示了发生了什么情况(没有动画)。在其当前状态下,只有球1可见,而且它不透明。如果我先定义球1再定义球2,那么球1就变成了透明的,但是球2不再透明。将球2的半径更改为1.2,然后将隐藏球1。
有没有办法使两个球都透明?
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
camera.position.set(0, 0, 3);
camera.lookAt(new THREE.Vector3(0, 0, 0));
scene.add(camera);
var ambient = new THREE.AmbientLight( 0x555555 );
scene.add(ambient);
var light = new THREE.DirectionalLight( 0xffffff );
light.position = camera.position;
scene.add(light);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// Definition 2
var geometry2 = new THREE.SphereGeometry(0.8,32,24);
var material2 = new THREE.MeshLambertMaterial({color: 0x0000ff, transparent: true, opacity: 0.5});
var sphere2 = new THREE.Mesh(geometry2, material2);
// Definition 1
var geometry1 = new THREE.SphereGeometry(1.0,32,24);
var material1 = new THREE.MeshLambertMaterial({color: 0x00ff00, transparent: true, opacity: 0.5});
var sphere1 = new THREE.Mesh(geometry1, material1);
scene.add(sphere1);
scene.add(sphere2);
renderer.render(scene, camera);
renderOrder
功能对我有用。注意:您必须在子对象上设置它,设置在父对象上不适用于子对象。 - BriandepthWrite: false
是解决方案,谢谢!现在我正在使用:var material_plane = new THREE.MeshBasicMaterial({color: drawcol, side: THREE.DoubleSide, opacity: 0.5, transparent: true, depthWrite: false});
。 - Avatar