Próbuję napisać mały program w Three.js, który wyświetla dwie sfery, jedną w drugiej. Promień sfery2 ma oscylować między 0,5 a 1,5, podczas gdy promień sfery 1 wynosi zawsze 1,0. Każda sfera jest przezroczysta (nieprzezroczystość: 0,5), dzięki czemu możliwe byłoby zobaczenie mniejszej kuli zawartej w większej. Oczywiście role "mniejszych" i "większych" zmieniają się, gdy zmienia się promień sfery2.Przezroczyste obiekty w Threejs
Problem polega na tym, że Three.js czyni przezroczystą pierwszą sferę, którą definiuję w moim programie, ale nie drugą. Jeśli zdefiniuję pierwszą sferę1, wówczas stanie się przezroczysta, ale wtedy sfera2 jest całkowicie nieprzezroczysta. Jeśli zdefiniuję pierwszą sferę2, wówczas jest to przezroczysta. Kolejność dodawania ich do sceny nie odgrywa żadnej roli.
Zamieszczam poniżej minimalny program, który pokazuje, co się dzieje (bez animacji). W obecnym stanie widoczna jest tylko sfera 1 i nie jest ona przezroczysta. Jeśli zdefiniuję sferę 1 przed sferą2, wówczas sfera 1 stanie się przezroczysta, ale sfera2 nie będzie już przezroczysta. Zmiana promienia kuli2 na 1.2 spowoduje ukrycie sfery 1.
Czy jest jakiś sposób, aby uczynić obie kule przejrzystymi?
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);
To jest niesamowita odpowiedź, dzięki koleś !!! –
Bardzo dobrze dziękuję –
Co dokładnie robi deepWrite? Jakie są wady (perfki, nowe błędy, ...?)? –