Я пишу простое 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 до:
Что я здесь не так делаю? Идея состоит в том, чтобы инвертировать ось, указанную в векторе направления.
Вы создали преобразование вращения 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
Других решений пока нет …