Tôi đang cố gắng viết một chương trình nhỏ trong Three.js hiển thị hai hình cầu, một mặt trong hình kia. Bán kính của sphere2 được cho là dao động giữa 0,5 và 1,5 trong khi bán kính của sphere1 luôn là 1,0. Mỗi hình cầu trong suốt (độ mờ: 0,5) sao cho có thể nhìn thấy quả cầu nhỏ hơn chứa trong hình cầu lớn hơn. Tất nhiên, vai trò của thay đổi "nhỏ hơn" và "lớn hơn" khi bán kính của hình cầu2 thay đổi.Đối tượng trong suốt ở Threejs
Vấn đề bây giờ là Three.js làm cho minh bạch hình cầu đầu tiên tôi xác định trong chương trình của tôi nhưng không phải là hình cầu thứ hai. Nếu tôi định nghĩa hình cầu 1 đầu tiên thì nó trở nên trong suốt nhưng sau đó hình cầu2 hoàn toàn mờ đục. Nếu tôi định nghĩa hình cầu 2 đầu tiên thì đây là hình cầu trong suốt. Thứ tự thêm chúng vào cảnh không có vai trò gì.
Tôi bao gồm bên dưới chương trình tối thiểu cho biết điều gì đang diễn ra (không có hoạt ảnh). Trong trạng thái hiện tại của nó chỉ có hình cầu1 là có thể nhìn thấy và nó không phải là minh bạch. Nếu tôi xác định sphere1 trước sphere2 thì sphere1 trở nên trong suốt nhưng sphere2 không còn trong suốt nữa. Thay đổi bán kính của sphere2 thành 1.2 sẽ ẩn hình cầu1.
Có cách nào để làm cho cả hai hình cầu trong suốt?
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);
Đây là một câu trả lời tuyệt vời, cảm ơn dude !!! –
Vì vậy, cảm ơn bạn –
depthWrite làm gì chính xác? Những hạn chế (perfs, bugs mới, ...?) Là gì? –