Member 13144608 Ответов: 2

Поворот точки вокруг вектора (3D)


Привет,

что мне нужно сделать, так это повернуть точку вокруг вектора.

у меня есть вектор x1 y1 z1 и x2 y2 z2 . у меня также есть точка x y z и угол поворота.

кто-нибудь может мне помочь?

спасибо

Что я уже пробовал:

я пытаюсь использовать код ( http://blog.kjeldby.dk/wp-content/uploads/rotate.txt ) но он отлично работает только тогда, когда Градусы установлены в 0, в противном случае он дает число из любой логики.

Richard MacCutchan

Никто здесь не может догадаться, что этот код делает неправильно.

0x01AA

Скорее всего, вещь (путаница) с rad (0...2pi) против степени (0...360)?

2 Ответов

Рейтинг:
2

bling

Это не очень эффективно, но должно сработать. Вам нужно составить матрицу преобразования-3x3 или - если использовать однородные координаты-4x4.

а. матрицу перевести в (- x1, -y1, - z1) так,чтобы x1, y1, z1 теперь все равны нулю.
б. матрицу повернуть на тета XZ так,чтобы (x2,y2, z2) теперь находилась в плоскости YZ (x2 становится нулем).

Вам нужно будет запомнить некоторую геометрию, чтобы вычислить тета-XZ.

c. матрицу повернуть на тета YZ так,чтобы (x2,y2, z2) теперь была ось Z (x2 и y2 равны нулю).

Вам нужно будет запомнить некоторую геометрию, чтобы вычислить тета-YZ.

d. матрица вращается вокруг оси Z (в плоскости XY) на ваш угол поворота.
e. примените обратную формулу (c) выше.
f. примените обратную формулу (b) выше.
г. примените инверсию (а) выше.

Вы можете объединить вышеприведенные матрицы в единую матрицу и применить ее к вашей точке (x,y,z). Если вы используете матрицу 4x4, не забудьте нормализовать результат.


Рейтинг:
0

0x01AA

Скорее всего, вещь (путаница) с rad (0...2pi) против степени (0...360)?

Читать это: Математика.Потому Что Методом: (Двойной) (Система)[^]

Особое замечание: угол d должен быть в радианах. Умножьте на Math. PI/180, чтобы преобразовать градусы в радианы.

Что это значит:

// Degree will "fail", respectively not deliver the expected result
VectorMath :: Rotate(v, axis, 40.0)
против.
// Rad should work
VectorMath :: Rotate(v, axis, 40.0 * Math.PI/180.0)


Надеюсь, это поможет.