2014-11-28 3 views
0

Я действительно задираю с математикой, которую мне нужны для этой математики, никогда не был моей сильной стороной, как только вы попадаете в «Исчисление и геометрию».DirectX 3D rotate eyePt вокруг lookAt

Так как я вращать Vector3 вокруг другого Vector3

D3DXVECTOR3 lookAt = this->cam->getLookAt(); 
D3DXVECTOR3 eyePt = this->cam->getEyePt(); 

мне нужно повернуть вокруг lookAteyePt, как я это делаю, я знаю, что нужно Матрицу, но то, что я должен заполнить его и как я делаю поворот в нем, я просто не понимаю.

Так что, если кто-нибудь может предоставить код с объяснениями шагов, используемых, чтобы сделать это действительно поможет

Еще одно замечание, что я только хочу, чтобы перевести на X, ось Z, как я вращение вокруг оси Y так вот изображение того, что я пытаюсь сделать rotation around Y axis (top down view)

+0

Вы знаете, как умножить матрицу на вектор, чтобы получить новый вектор? – Beta

+0

Не используйте обычный оператор '*'. –

+0

Подумайте об этом как о переводе by -eyePt, так что точка, в которой вы вращаетесь, находится на (0,0,0), а затем на вращение (теперь легко вы находитесь в начале координат), а затем перевод назад + eyePt, чтобы вернуть точку туда, где вы хотите. Разумеется, все они могут быть объединены в одну матрицу. – Alan

ответ

1

Возьмите единый вектор eyePt, который будет осью вращения. (Я предполагаю, что это единичный вектор, если нет, то я могу показать вам, как превратить его в орт.) Давайте назовем его E:

Ex 
E = Ey 
    Ez 

(Это вектор (Е х, E у, E г), но это трудно сделать математические обозначения здесь.)

Теперь построить три матрицы. Единичная матрица I:

1 0 0 
I = 0 1 0 
    0 0 1 

тензорное произведение E и E, который мы называем T:

 0 -Ez Ey 
T = Ez 0 -Ex 
    -Ey Ex 0 

и матрицу кросс-продуктовую E, который мы будем называть P:

ExEx ExEy ExEz 
P = ExEy EyEy EyEz 
    ExEz EyEz EzEz 

Теперь выберите угол поворота, theta (в радианах). Матрица вращения будет:

R = соз (тета) я + (1-соз (тета)) Т + Sin (тета) Р

Теперь, чтобы вращать вектор v (который в данном случае является lookAt), просто умножить R им:

против после = R v до

+0

Спасибо только одному вопросу, что такое тета? –

+0

@MartinBarker: Извините, я имел в виду угол поворота. Я отредактирую ... – Beta

+0

Большое спасибо, что делает больше внимания, чем что-либо еще, что я прочитал об этом :) –