OpenGl Повернуть объект по оси Y, чтобы посмотреть на другой объект - PullRequest
0 голосов
/ 18 ноября 2018

Так что, как в теме, у меня есть 2 объекта, один из которых я перемещаю (по оси z и x), другой статичен, но должен вращаться вокруг оси y, чтобы всегда выглядеть как другой ... и я борюсь сэто уже неделя

то, что я получил сейчас, это

вектор от 1объекта до 2объекта и фактический взгляд (также вектор) 2объекта, я вычисляю ангела между этими двумя векторами и добавляю это кrotattion.y из 2 объектов, но он не работает должным образом

Есть идеи, как заставить его работать?Кстати, я использую преобразования eular angel

pseudCode:

vectorFrom1to2 = vector1 - vector2;
lookatVectorof2ndObject;

Я нормализую их оба, а затем

float angle = acos(dot(vectorFrom1to2, lookatVectorof2ndObject));
object2.rotateY = angle;

Я не знаю, где я делаю ошибку

1 Ответ

0 голосов
/ 19 ноября 2018

Общее правило, которое оказалось верным во многих ситуациях, которые я наблюдал, таково: как только вы вычисляете углов по векторам, вы, скорее всего, делаете что-то более излишне сложным способом чем необходимо.

Все, что вам нужно, это базовое преобразование, которое преобразует локальную систему координат первого объекта, чтобы его локальная ось Z указывала на второй объект. Вы можете сделать это с помощью простой матрицы вращения (при условии, что у вас есть библиотека матриц / векторов, готовая облегчить это).

Итак, если у вас есть объект 1 с позицией p1 и объект 2 с позицией p2, и вы хотите, чтобы p1 повернулся в направлении p2, тогда матрица вращения может быть получена следующим образом:

(здесь я просто использую псевдосинтаксис GLSL)

vec3 p1 = ... // <- position of first object
vec3 p2 = ... // <- position of second object
vec3 d = normalize(p2 - p1)
vec3 r = cross(vec3(0.0, 1.0, 0.0), d)
       = vec3(d.z, 0, -d.x)
mat3 m = mat3(d.z, 0, -d.x, // <- first column ('right' vector)
              0, 1, 0,      // <- second column (keep Y)
              d.x, 0, d.z)  // <- third column (map Z to point towards p2)

При преобразовании вершин v первого объекта с помощью m с помощью: v' = m * v вы получите ось Z объекта p1, указывающую на положение p2, все сформулированные в одном и том же "мире" "Система координат.

...