我正在尝试在 Three.js 中编写一个小程序,它显示两个球体,一个在另一个球体内部。sphere2 的半径应该在 0.5 和 1.5 之间波动,而 sphere1 的半径始终为 1.0。每个球体都是透明的(不透明度:0.5),因此可以看到较大的球体中包含的较小的球体。当然,“更小”和“更大”的角色随着 sphere2 半径的变化而变化。
现在的问题是 Three.js 使我在我的程序中定义的第一个球体变得透明,而不是第二个球体。如果我定义第一个 sphere1 那么它变得透明但 sphere2 完全不透明。如果我定义第一个 sphere2 那么这是透明的。将它们添加到场景中的顺序不起作用。
我在下面包含了一个显示正在发生的事情的最小程序(没有动画)。在其当前状态下,只有 sphere1 可见且不透明。如果我在 sphere2 之前定义 sphere1 则 sphere1 变得透明但 sphere2 不再透明。将 sphere2 的半径更改为 1.2 将隐藏 sphere1。
有没有办法让两个球体都透明?
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);