2009-10-01 7 views
2

방향을 나타내는 3 개의 벡터, 위로 오른쪽 및 앞으로가 있습니다.3d 벡터의 전체 각도

[편집]

자사가 제대로 렌더링되지

도와주세요

가 나는 XYZ 각 (3 수레)에 이러한 변환해야 그래서 난 glRotatef() 사용하실 수 있습니다. pastebin.com/f6683492d DP3가 3 구성 요소 내적은

+2

질문이 구체화되지 않았다고 생각합니다. 보았다 : "무엇?" – dmckee

+1

좀 더 구체적으로 말씀 해주시겠습니까? – Nope

답변

6

나는 당신이 " 그리고 앞으로 "왜냐하면 아래로의 반대이며 새로운 정보를 제공하지 않습니다.
당신의 질문은 명확하지 않지만, 당신이 설명하는 벡터에 의해 정의 된 새로운 좌표베이스로의 변환을 만들고 싶다는 것을 의미한다고 생각합니다. 이 벡터들이 직각을 이루고 있다면 (각도가 90도), 각도를 계산하고 glRotate()를 사용하지 않아도됩니다. 대신 새로운베이스의 벡터를 변환으로 직접 사용할 수 있습니다.

당신이 가지고있는 벡터가 A (a1, a2, a3) - 위쪽, B (b1, b2, b3) - 오른쪽 및 C (c1, c2, c3) - 앞으로라고 가정하십시오. 첫 번째, 완전히 직각이 아닌 경우 교차되는 제품이 몇 개 있는지 직각이되도록해야합니다.

a1 b1 c1 0 
a2 b2 c2 0 
a3 b3 c3 0 
0 0 0 1 

이 함께 A, B, C 에 의해 정의 된베이스 유닛베이스에서 당신을 가져올 것이다 회전 행렬은 다음과 같습니다 둘째, 당신은 자신의 길이가 1. 이제 다음과 같은 매트릭스를 생성되어 있는지 확인해야 이 매트릭스는 glMultMatrix()를 사용하면 끝난다. 첫 번째 시도가 작동하지 않으면 행렬을 조 변경하면 문제가 해결 될 수 있습니다.


EDIT 다시 확인한 후, 행렬의 올바른 순서가 너무 같아야 : 벡터 A의 (AX, AZ AY), B (BX 의해, BZ), C (CX, cy, cz)

ax ay az 0 
bx by bz 0 
cx cy cz 0 
0 0 0 1 

위 응답의 전치입니다. 또한 번역없이 작동하는지 먼저 확인하는 것이 좋습니다. 그리고 다음과 같이 간단하게 행렬에 추가하여 번역을 추가 할 수 있습니다 :

ax  ay  az  0 
bx  by  bz  0 
cx  cy  cz  0 
pos.x pos.y pos.z 1 
+0

유망한 읽을 거리. – dmckee

+0

매트릭스 클래스가 무엇인지, 그리고 그 요소를 어떻게 직렬화하는지 잘 모르겠습니다. 무슨 일이 일어나고 있는지 확인하는 가장 좋은 방법은 16 개의 부동 소수점 배열을 사용하는 것입니다. glMultMatrix – shoosh

+0

에 대한 모든 것을 읽고 이해했는지, 제가 언급 한 것처럼 전치 행렬을 사용해보십시오. – shoosh

0
x = acos(dp3(nrm(up), new vec3(0, 1, 0))); 
y = acos(dp3(nrm(dir), new vec3(0, 0, 1))); 
z = acos(dp3(nrm(right), new vec3(1, 0, 0))); 

, NRM이 3 요소 벡터를 normalises 및 정의 VEC3 하나를 구성 : 여기 뻔뻔스러운 그 무엇이라도 있다면 당신은 볼 수 있습니다.

이렇게하면 vectr과 사이의 각도가 기본 좌표계이됩니다.

편집 : 위에서 지적한대로 물론 적용 할 수있는 기본 매트릭스가 이미 있습니다. Orthonormalise도 매우 쉽습니다. 현실적으로 나는 위에서 한 것을 할 필요가있는 시간을 생각할 수 없다........... 당신이 구했던 것.)

+1

이 방법을 사용하는 경우 위쪽, 아래쪽 및 오른쪽 벡터가 단위 길이인지 확인하십시오. – Alan

+0

매우 좋은 점 : – Goz