Клонирует ли средство визуализации three.js позиции объектов?

Я создал небольшую сцену с 3 сферами и треугольником, соединяющим 3 центра сфер, т.е. положения вершин треугольника являются такими же переменными, как и положения сфер. Теперь я ожидал, что если я изменю положение одной из сфер, вершина треугольника должна быть перемещена вместе с ней (поскольку это один и тот же объект положения) и, следовательно, по-прежнему соединять три сферы. Однако, если я сделаю это изменение координат ПОСЛЕ вызова средства визуализации, треугольник НЕ изменится. (Хотя это меняется, если я перемещаю сферу ДО вызова средства визуализации.) Это, по-видимому, указывает на то, что средство визуализации использует не исходные объекты положения, а их клон.

В: Есть ли способ избежать этого поведения клонирования (или какой-либо другой причины для независимых позиций), чтобы я все еще мог изменить два объекта с одним изменением переменной? Или я что-то не так делаю?

Код:

var width = window.innerWidth;
var height = window.innerHeight;
var renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(width, height);
document.body.appendChild(renderer.domElement);
var scene = new THREE.Scene;

var camera = new THREE.PerspectiveCamera(30, width / height, 0.1, 10000);
camera.position=new THREE.Vector3(50,50,50);
camera.lookAt(new THREE.Vector3(0,0,0));
scene.add(camera);

var pointLight = new THREE.PointLight(0xffffff);
pointLight.position=camera.position;
scene.add(pointLight);

var sphere=[];
var sphereGeometry = new THREE.SphereGeometry(1,8,8);
var sphereMaterial = new THREE.MeshLambertMaterial({ color: 0xff0000 });
var triGeom = new THREE.Geometry();
for (var i=0; i<3; i++) {
    sphere[i] = new THREE.Mesh(sphereGeometry, sphereMaterial);
    sphere[i].position=new THREE.Vector3(10*i,20+5*(i-1)^2,0);
    scene.add(sphere[i]);
    triGeom.vertices.push(sphere[i].position);
}
triGeom.faces.push( new THREE.Face3( 0, 1, 2 ) );
triGeom.computeFaceNormals();
var tri= new THREE.Mesh( triGeom, new THREE.MeshLambertMaterial({side:THREE.DoubleSide, color: 0x00ff00}) );
scene.add(tri);

sphere[0].position.x+=10; // this changes both sphere and triangle vertex
renderer.render(scene, camera);
sphere[1].position.x+=10; // this changes only the sphere
renderer.render(scene, camera);

person user3588673    schedule 30.04.2014    source источник


Ответы (1)


Вероятно, это связано с функцией кэширования геометрии. Вам нужно будет установить triGeom.verticesNeedUpdate = true каждый раз, когда вы меняете положение вершины.

person lot    schedule 30.04.2014