2014-11-27 6 views
0

У меня проблема в моем коде three.js.Выпуск выравнивающих граней в Three.JS из двух отдельных объектов

Я пытаюсь выровнять два объекта, выбирая две грани и поворачивая вторую грань (и объект), чтобы соответствовать нормальному вектору выбранной стороны объекта.

До сих пор у меня есть:

var normalMatrix = new THREE.Matrix3().getNormalMatrix(object.matrixWorld); 
var worldNormal = face.normal.clone().applyMatrix3(normalMatrix).normalize(); 
var normalMatrixRef = new THREE.Matrix3().getNormalMatrix(objectRef.matrixWorld); 
var worldNormalRef = faceRef.normal.clone().applyMatrix3(normalMatrixRef).normalize(); 

где: объект мой объект, который будет вращаться, лицо выбранного лицом этого объекта, ObjectRef является стационарной ссылкой на объект и faceRef нормальный объекта Я хочу соответствовать.

Перед делать

object.lookAt(worldNormalRef); 

, я пытаюсь либо

object.up = new THREE.Vector3(0,0,1); 
object.up = worldNormal; 
object.up = face.normal; 

и ни работы.

Любые экземпляры object.up не работают должным образом. Когда я выполняю действие, целевой объект (тот, который нужно повернуть) вращается, но не выравнивает грани. Он произволен, но каким-то образом связан с текущим вращением объектов (т. Е. Иногда он вращается вдоль (0,1,0) или simliar, в других случаях, если я предварительно вращу объект, он просто слегка вращается.

В теории lookAt использует мировой вектор, который мой faceRef есть, и до тех пор, как я установил «вверх» правильно, он должен работать, но это dosen't.

Любые идеи?

ответ

1

Я нашел этот вопрос в моем коде, я надеюсь, что это может помочь кому-то в будущем.

object.lookAt(worldNormalRef); 

потребности вместо того, чтобы быть изменена, чтобы добавить новые нормали лицом к postition текущего объекта для LookAt для правильной работы:

//create a point to lookAt 
var newPoint = new THREE.Vector3(
    object.position.x + worldNormalRef.x, 
    object.position.y + worldNormalRef.y, 
    object.position.z + worldNormalRef.z 
); 

object.up = face.normal;//Z axis up 
object.lookAt(newPoint); 

отметить также, что object.up должен быть установлен, как указано выше в face.normal (лицо, которое я хочу выровнять по отношению к лицу ссылочного объекта), а не к указанному выше worldNormal (я удалю эту часть моего кода).

Смежные вопросы