Ich versuche, ein kleines Programm in Three.js zu schreiben, das zwei Kugeln zeigt, eine ineinander. Der Radius von sphere2 soll zwischen 0.5 und 1.5 schwingen, während der Radius von sphere1 immer 1.0 ist. Jede Kugel ist transparent (Opazität: 0,5), so dass es möglich ist, die kleinere Kugel zu sehen, die in der größeren enthalten ist. Natürlich ändern sich die Rollen von "kleiner" und "größer", wenn der Radius der Kugel 2 variiert.Transparente Objekte in Threejs
Das Problem ist jetzt, dass Three.js die erste Sphäre transparent macht, die ich in meinem Programm definiere, aber nicht die zweite. Wenn ich die erste Sphäre1 definiere, wird sie transparent, aber dann ist Sphäre2 vollständig undurchsichtig. Wenn ich die erste Sphäre2 definiere, dann ist dies die transparente Sphäre. Die Reihenfolge, in der sie zur Szene hinzugefügt werden, spielt keine Rolle.
Ich schließe unten ein minimales Programm ein, das zeigt, was vor sich geht (ohne die Animation). In seinem aktuellen Zustand ist nur sphere1 sichtbar und nicht transparent. Wenn ich sphere1 vor sphere2 definiere, wird sphere1 transparent, aber sphere2 ist nicht mehr transparent. Wenn Sie den Radius von sphere2 auf 1,2 ändern, wird sphere1 ausgeblendet.
Gibt es eine Möglichkeit, beide Kugeln transparent zu machen?
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);
Das ist eine tolle Antwort, danke Alter !!! –
Also gut danke –
Was genau tut depthWrite? Was sind die Nachteile (Perfs, neue Bugs, ...?)? –