2015-02-02 2 views
0

저는 3D 공간 (월드 공간)에 2 개의 벡터를 가지고 있습니다. 두 벡터를 같은 평면에 배치하는 상대 좌표계를 찾아야합니다.2 개의 벡터를 포함하는 좌표계 생성하기

내 생각은 두 벡터의 교차 곱을 먼저 취하여 두 벡터와 관련된 Z 축을 얻는 것이 었습니다. 그런 다음 새 X 축을 만들려면 새 Z 축과 원래 벡터 중 하나의 교차 곱을 취합니다. 그런 다음 새 Y 축을 가져 오려면 새 Z와 새 X의 교차 곱을 취합니다. 그러나 이것이 내가 원하는 것을 성취했다고는 생각하지 않습니다. x와 y 축이 두 벡터 사이에서 공유되지 않는다고 생각합니다. 나는 다른에 하나의 벡터를 회전 할 결국 : 내가 이렇게 노력하고 있어요 이유에 약간의 정보를 제공하기 위해

normA = TriangleA.forward.normalize(); 
normB = TriangleB.forward.normalize(); 

zaxis = normA.cross(normB); 
xaxis = zaxis.cross(normA); 
yaxis = xaxis.cross(zaxis); 

zaxis = zaxis.normalize(); 
xaxis = xaxis.normalize(); 
yaxis = yaxis.normalize(); 

originx = str(TriangleB.verts[0][0]) + "mm"; 
originy = str(TriangleB.verts[0][1]) + "mm"; 
originz = str(TriangleB.verts[0][2]) + "mm"; 

UPDATE : 여기

내가 사용하고있는 코드입니다 한 번의 회전으로 이것을하기 위해 두 벡터의 외적을 취하여 회전축을 얻습니다. 그러나 회전 축과 다른 다른 벡터로부터 상대 좌표계를 생성해야합니다.

+0

모두를 포함해야합니다 ...? –

답변

1

제 생각에는 귀하의 접근 방식이 부분적으로 정확합니다. 선형 적으로 독립적 인 두 개의 벡터는 평면을 정의합니다. 그러한 벡터들의 교차 곱은 여러분이 말했듯이 'z'오프셋 된 평면의 법선 벡터를 제공합니다. 이제 IMO를 정의 할 때이 두 벡터 중 하나를 사용해야합니다. 'x'축. 'x'와 'z'축을 얻는다면이 두 축의 교차 곱에 의해 'y'축을 얻을 수 있습니다.

물론 벡터 선택 및 계산 순서에 따라 결과 벡터의 다른 순서를 수신 할 수 있습니다. 또한 상대 좌표계를 통해 주 좌표계에서 작동하려면 값을 매핑하기 위해 추가 계산이 필요합니다.

나는 아무 것도 망쳐 놓지 않았 으면 좋겠다.

추신. 그리고 당신의 코드를 다시 읽으면 그것이 당신이하는 일인 것처럼 보입니다. 어쩌면 다른 것을 얻기를 원할 것입니다.

에 의해 무슨 뜻 이죠 : 나는 x 및 y 축이 두 벡터 사이에 공유되지 않는다는 느낌이있다

.

+0

x와 y가 공유되지 않는다고 말할 때, 나는 생성 한 새로운 xy 평면에 두 벡터가 모두 들어 있지 않음을 의미합니다. – user2970916

+0

"업데이트"를 참조하여 예를 들어 벡터 회전을 원합니다. 새로운 'z'축 주위의 normA? 그렇다면 3D 매트릭스 변형을 적절한 방법으로 시도해야한다고 생각합니다. –

+0

회전 행렬을 사용 하겠지만, 사용하고있는 API는 x, y 및 z 주위의 회전 만 허용합니다. – user2970916

0

귀하의 접근 방식은 정확하지만 yaxis가 normA와 동일하므로 하나의 교차 제품을 저장할 수 있습니다.

XY 평면 당신은, 매트릭스, 사원 수, 축과 각도를 무엇을해야합니까, 회전하기 위해 노마와 normB