벡터 (P1 및 P2와 교차) 주위로 P3 (근처 어딘가에 있음)을 x도 회전시키고 싶습니다.벡터 주위의 회전 지점 3d
P1과 P2는 이미지의 벡터 (선)와 교차하는 2 점입니다. 나는 많은 것을 연구하고 찾았으며 좋은 재료를 발견했지만 삼각법 기술은 매우 열악합니다. 나는 PAWN (small)을 위해 이것을 필요로하는데, 여기에 몇 가지 코드가 있지만 실제로 의도 한대로 작동하지는 않는다. 누군가가 나를 도울 수 있다면, 나는 :)
이미지 링크 매우 감사 할 것입니다 : http://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Euler_AxisAngle.png/220px-Euler_AxisAngle.png
P1/P2/P3 = (X, Y, Z)
float vec[3];
SubtractVectors(P1, P2, vec);
float newp[3];
float rotation[4][4];
SetupMatrix(90.0, vec, rotation);
MultiplyMatrix(P3, rotation, newp);
// - -------------------------------
stock void MultiplyMatrix(float input[3], float rotation[4][4], float output[3])
{
float input2[4];
input2[0] = input[0];
input2[1] = input[1];
input2[2] = input[2];
input2[3] = 1.0;
float output2[4];
for(int i = 0 ; i < 4 ; i++)
{
for(int j = 0 ; j < 4 ; j++)
{
output2[i] += rotation[i][j] * input2[j];
}
}
output[0] = output2[0];
output[1] = output2[1];
output[2] = output2[2];
}
stock void SetupMatrix(float angle, float vector[3], float rotation[4][4])
{
float L = (vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2]);
angle = angle * M_PI/180.0;
float u2 = vector[0] * vector[0];
float v2 = vector[1] * vector[1];
float w2 = vector[2] * vector[2];
rotation[0][0] = (u2 + (v2 + w2) * Cosine(angle))/L;
rotation[0][1] = (vector[0] * vector[1] * (1 - Cosine(angle)) - vector[2] * SquareRoot(L) * Sine(angle))/L;
rotation[0][2] = (vector[0] * vector[2] * (1 - Cosine(angle)) + vector[1] * SquareRoot(L) * Sine(angle))/L;
rotation[0][3] = 0.0;
rotation[1][0] = (vector[0] * vector[1] * (1 - Cosine(angle)) + vector[2] * SquareRoot(L) * Sine(angle))/L;
rotation[1][1] = (v2 + (u2 + w2) * Cosine(angle))/L;
rotation[1][2] = (vector[1] * vector[2] * (1 - Cosine(angle)) - vector[0] * SquareRoot(L) * Sine(angle))/L;
rotation[1][3] = 0.0;
rotation[2][0] = (vector[0] * vector[2] * (1 - Cosine(angle)) - vector[1] * SquareRoot(L) * Sine(angle))/L;
rotation[2][1] = (vector[1] * vector[2] * (1 - Cosine(angle)) + vector[0] * SquareRoot(L) * Sine(angle))/L;
rotation[2][2] = (w2 + (u2 + v2) * Cosine(angle))/L;
rotation[2][3] = 0.0;
rotation[3][0] = 0.0;
rotation[3][1] = 0.0;
rotation[3][2] = 0.0;
rotation[3][3] = 1.0;
}
감사를 사용하면 잘못된 회전 방향이있는 경우, 나는 실제로이를 해결했다. 회전 행렬 공식 -> http://inside.mines.edu/fs_home/gmurray/ArbitraryAxisRotation/ArbitraryAxisRotation14x의 마지막 열과 함께 교체 된 회전 [0] [3]/[1] [3]/[2] [3]. png 여기서 a, b, c = P1은 내 벡터가 (0,0,0)에서 시작하지 않고 의도 한대로 작동하기 때문입니다. 팁 주셔서 감사합니다 :) – Alka