2014-10-25 3 views
1

벡터 (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; 
} 

답변

0

정확한 쿼터니언을보십시오. 그런 다음 나처럼 사용하지 않는 경우 : transform matrix anatomy :

  1. 구조는 회전축 시스템을 여기

    최초의 통일 된 모습을 나타내는 매트릭스 M 변환. 예를 들어 원점은 P1이므로 X 축은 P2-P1 (회전 축)입니다. Q = (1.0,0.0,0.0) 또는 (0.0,1.0,0.0) 그렇게

    X = P2-P1 
    Q = (1.0,0.0,0.0) or (0.0,1.0,0.0) 
    Y = cros(X,Q) 
    Z = cros(X,Y) 
    

    지금 당신이 axises을 부정하거나 외적 피연산자가 (필요한 경우) 당신이 필요로하는 axises 방향에 맞게 주문 변경할 수 있습니다 X 축 벡터에 평행하지 않은 하나를 선택할 수 있습니다. 또한

    여기 여기 LCS transforms과 대답의 말에 lrotx에 대한 LCS rotation around X axis lrotx C++ implementation 검색을 보면 (LCS) 회전 모든 axises 단위는 지역 좌표계 않는 지금

  2. 모돈을 벡터 수 있도록하는 것을 잊지 마세요

  3. 모돈 지금

    GCS에게P 당신을 데려 이 모든 것을

    M = inverse(inverse(M)*rotation) 
    

    다시 Q 변환 GCS

    Q = M*Q 
    

    을 :

    Q = inverse(M)*P // if `M` before rotation was one then you can do Q=P instead 
    

    이 회전 (매트릭스 M 변환 회전되지 않은 경우)의 LCS 좌표를 얻을 회전 할 ...

[주의]

후 바로 axises 중 하나 ...을 부정하거나 부정 각도를

+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