Three.js: создайте объект на поверхности и выровняйте его по нормали к этой поверхности
Я хочу разместить стрелки на объекте, когда я нажимаю на него.
JsFiddle лучше длинного объяснения:
https://jsfiddle.net/p820c246/4/
Мой источник: https://github.com/mrdoob/three.js/issues/1486
Он хорошо работает в верхней части поверхности, но в нижней части он вызывает ошибки, я не понимаю, почему. Кажется, что это ошибки, когда угол нормали слишком мал. Если вы попробуете с такой сферой, она будет работать хорошо:
new T.SphereGeometry(1, 3, 2)
Заранее спасибо
2 ответа
Если вы регистрируете длину вашей оси axis.length()
вы заметите, что оно уменьшается при увеличении угла от up
, Это все еще близко к 1 на 3-м ряду снизу, но что-то вроде 0,7 на втором.
+ Изменить
var axis = new T.Vector3().crossVectors(up, normal)
.normalize(); //add this
и это будет работать
Чтобы быть в безопасности, вы всегда можете нормализовать эти оси, нормали и т. Д. После преобразования, а затем оптимизировать. Величина перекрестного произведения зависит от угла, и вы использовали его далее в операциях, которые ожидают, что это будет длина единицы.
Эта функция orientAlongNormal
делает слишком много математических вещей. Если я заменю это на это:
function orientAlongNormal(object, coords, normal, scalar) {
var up = new T.Vector3(0, 0, 1);
object.up = up;//Z axis up
//create a point to lookAt
var newPoint = new THREE.Vector3(
coords.x + normal.x,
coords.y + normal.y,
coords.z + normal.z
);
//aim object in direction of vector "normal" using lookAt
object.lookAt(newPoint );
//in this case the cone model is a bit wrong so we have to rotate it by 90 degrees
object.rotateX( 0.5*Math.PI );
//put object to coords
object.position.addVectors(coords, normal.clone().multiplyScalar(scalar));
}
Это работает: https://jsfiddle.net/hanalulu/j9Lgeys7/
Этот поток помог мне в этом: проблема выравнивания граней в Three.JS из двух отдельных объектов
Но главное, что вам нужно сделать, - это не делать сложные вещи по векторной математике самостоятельно, а искать методы в 3d движке, которые делают это для вас:)