D3DXMatrixRotationAxis повернуть не ту ось - PullRequest
0 голосов
/ 24 июня 2018

Я пишу простое 3D-приложение с DirectX. Я новичок, но я думаю, что понимаю, как работает D3DX Rotation. при создании функции обнаружения столкновений я замечаю, что мяч отскакивает в неправильном направлении. код должен изменить направление оси, заданное в векторе направления. Вместо этого это меняет 2 других:

speed = D3DXVECTOR3(1.0f, 2.0f, 3.0f);
direction = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
D3DXMATRIX temp;

D3DXMatrixRotationAxis(&temp, &direction, 3.14f);
D3DXVec3TransformCoord(&speed, &speed, &temp);

с точки останова я знаю, что скорость изменилась с 1, 2, 3 до:

  • _D3DVECTOR {x = 0.999999762 y = -2.00477481 z = -2.99681091} _D3DVECTOR

Что я здесь не так делаю? Идея состоит в том, чтобы инвертировать ось, указанную в векторе направления.

1 Ответ

0 голосов
/ 29 июля 2018

Вы создали преобразование вращения 180 вокруг оси X.Операция над (1,2,3) привела к (1, -2, -3), который вы указали.

"Отскок" вашего вектора "скорости" S от плоскости, которая имеет нормальное N:

angle = acos(S*N);   // provided that * is an operator for D3DXVec3Dot
axis = S^N;          // provided that ^ is an operator for D3DXVec3Cross
D3DXMatrixRotationAxis(&temp, &axis , angle*2);   // angle is *2
D3DXVec3TransformCoord(&S, &S, &temp);
S=-S;                                             // negate direction
...