Ошибка выравнивания граней в 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();

где: object - мой объект, который будет вращаться, face - выбранная грань этого объекта, 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) или аналогично, в других случаях, если я предварительно вращаю объект, оно просто немного вращается.

Теоретически lookAt использует вектор мира, которым является мой faceRef, и до тех пор, пока я правильно установил 'up', он должен работать, но это не так.

Есть идеи?

1 ответ

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

object.lookAt(worldNormalRef); 

вместо этого нужно изменить, чтобы добавить новые нормали лица к позиции текущего объекта, чтобы 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, установленное выше (я удалю эту часть моего кода).

Другие вопросы по тегам