2014-04-12 3 views
0

저는 벡터 v1을 v2와 함께 회전 할 필요가있는 프로젝트에 있는데, 벡터와 회전에 문제가 있습니다. 거기에 대해 많은 설명이 있지만 내 문제를 해결할 수있는 하나를 찾을 수 없습니다. 마치 내가 5 살짜리 아이처럼하는 법을 설명해 주시겠습니까? 내가 할 노력은 무엇다른 벡터를 축으로 회전 벡터

그렇게함으로써 내 "V1"와 사원 수 파생 된 매트릭스를 곱했다 :

angle = (Convert.ToDouble(Console.ReadLine()) * Math.PI/180); 
cosA = Math.Cos(angle); 
sinA = Math.Sin(angle); 
oneMinusCosA = 1 - cosA; 

matrix[0, 0] = gravityVector[0] * gravityVector[0] * oneMinusCosA + cosA; 
matrix[0, 1] = gravityVector[0] * gravityVector[1] * oneMinusCosA + gravityVector[2] * sinA; 
matrix[0, 2] = gravityVector[0] * gravityVector[2] * oneMinusCosA - gravityVector[1] * sinA; 

matrix[1, 0] = gravityVector[1] * gravityVector[1] * oneMinusCosA - gravityVector[2] * sinA; 
matrix[1, 1] = gravityVector[1] * gravityVector[1] * oneMinusCosA + cosA; 
matrix[1, 2] = gravityVector[1] * gravityVector[2] * oneMinusCosA - gravityVector[0] * sinA; 

matrix[1, 0] = gravityVector[2] * gravityVector[0] * oneMinusCosA - gravityVector[1] * sinA; 
matrix[1, 1] = gravityVector[2] * gravityVector[1] * oneMinusCosA - gravityVector[0] * sinA; 
matrix[1, 2] = gravityVector[2] * gravityVector[2] * oneMinusCosA + cosA; 

result = new double[3]; 


for (int i = 0; i < 3; i++) 
{ 
    result[i] = objectRotation[i] * matrix[i, 0] + objectRotation[i] * matrix[i, 1] + objectRotation[i] * matrix[i, 2]; 
    Console.WriteLine(result[i]); 
} 

하지만 잘못된 결과를 얻고있다. 왜 누군가가 나를 이해하게 도와 주거나 다른 해결책을 찾도록 도와 줄 수 있습니까?

예 :

v1(1,0,0) v2(0,1,0) angle=90 -> vf(0,0,-1) 

v1(sqrt2/2 , sqrt2/2 , 0) v2(-sqrt2/2 , sqrt2/2 , 0) angle = 90 -> vf(0,0,-1) 

* OBS : 나는 그 (또는 PI/2 라디안 중요하지 않습니다)뿐만 아니라 90 개도에 대한 모든 벡터와 모든 각도, 신청 또는이 벡터에 대한 필요가 나는 예제로 사용했다.

* OBS (2) : C# (선호) 또는 C++로 코드를 게시 할 수 있으면 기쁩니다.

+0

적절한 수학 라이브러리를 사용하는 경우 축과 각도에서 행렬을 만드는 함수가 있어야합니다. 이 행렬에 벡터를 곱하면됩니다. 그렇지 않으면 [Wikipedia] (http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle)에 공식이 있습니다. –

+0

필요한 수학은 5 살짜리 아이에게 설명 될 수 없다는 것이 두렵습니다. 수학은 특히 아름답지만, 사소한 것은 아닙니다. 어쨌든 문제를 해결할 준비가 되었다면 위키피디아 문서를 확인하십시오 : http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation – cmaster

+0

이 질문은 그것이 제기 된 방식대로 대답 될 수 없기 때문에 논제가 아닌 것처럼 보입니다. – cmaster

답변

0

내 자신의 질문에 대답, 당신은이 공식에 적용하여 회전을 수행 할 수 있습니다

basic

f perpendicular to a, v1 and v2

: 여기

vf = v1 * cosA + (v1 . v2) * v2 * (1 - cosA) + (v2 x v1) * sinA

을 그리고 수식에 도착하는 방법입니다

* 여기서 p는 v1에 v1을 투영 한 것입니다.

p = (v1 . v2) * v2 
a = v1 - p = v1 -(v1 . v2) * v2 
f = (v2 x v1)/|(v2 x v1)| * |a| 
a'= a * cos(θ) + f * sin(θ) 
vf = a'+ p