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 движке, которые делают это для вас:)

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