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