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