2008-10-19 16 views
4

나는 잠시 동안 인터넷에서 일부 알고리즘을 사용 해왔다. 나는 그 알고리즘을 작동시키지 못했기 때문에 여기서 질문을 던지고있다.방향 벡터에 대한 회전 행렬

점에서 속도 벡터 선을 렌더링하려고합니다. 선 그리기는 어렵지 않습니다. 길이가 velocity.length 인 선을 그래프에 삽입하기 만하면됩니다. 그러면 y 축 방향으로 점의 중심에 선이 놓입니다. 우리는 지금 이것을 적절한 회전과 번역으로 얻어야합니다.

번역 벡터를 계산하는 것이 어렵지 않습니다. 속도 벡터의 절반입니다. 그러나 회전 매트릭스는 나에게 너무도 모호합니다. 방향성 벡터 <x, y, z>이 주어진다면 필요한 행렬은 무엇입니까?

편집 1 :보기; 당신이 그 질문을 이해하지 못한다면 아마 나에게 대답을 줄 수 없을 것입니다.

     Vector3f translation = new Vector3f(); 
        translation.scale(1f/2f, body.velocity); 

        Vector3f vec_z = (Vector3f) body.velocity.clone(); 
        vec_z.normalize(); 

        Vector3f vec_y; // reference vector, will correct later 
        if (vec_z.x == 0 && vec_z.z == 0) { 
         vec_y = new Vector3f(-vec_z.y, 0f, 0f); // could be optimized 
        } else { 
         vec_y = new Vector3f(0f, 1f, 0f); 
        } 
        Vector3f vec_x = new Vector3f(); 
        vec_x.cross(vec_y, vec_z); 
        vec_z.normalize(); 

        vec_y.cross(vec_x, vec_z); 
        vec_y.normalize(); 
        vec_y.negate(); 

        Matrix3f rotation = new Matrix3f(
         vec_z.z, vec_z.x, vec_z.y, 
         vec_x.z, vec_x.x, vec_x.y, 
         vec_y.z, vec_y.x, vec_y.y 
        ); 

        arrowTransform3D.set(rotation, translation, 1f);

this article의 기반으로 : 여기

내가 현재 가지고있는 것입니다. 그리고 예, 표준 회전 행렬 (vec_x.x, vec_y.x 등)을 시도했지만 작동하지 않았습니다. 나는 효과가 있는지보기 위해 기둥과 행을 회전했습니다.

편집 2 : 내 의견의 무례한 표현에 대한

죄송합니다.

그래서 두 가지 오류가 조합 된 것처럼 보입니다. 그 중 하나는 House MD가 지적했는데 (정말 나쁜 이름 지정 : vec_z은 실제로 vec_y입니다.) 다른 하나는 렌더링 엔진에 전달하기 전에 행렬을 뒤집을 필요가 있다는 것입니다. 그래서 수정 된 코드는 다음과 같습니다

     Vector3f vec_y = (Vector3f) body.velocity.clone(); 
        vec_y.normalize(); 

        Vector3f vec_x; // reference vector, will correct later 
        if (vec_y.x == 0 && vec_y.z == 0) { 
         vec_x = new Vector3f(-vec_y.y, 0f, 0f); // could be optimized 
        } else { 
         vec_x = new Vector3f(0f, 1f, 0f); 
        } 

        Vector3f vec_z = new Vector3f(); 
        vec_z.cross(vec_x, vec_y); 
        vec_z.normalize(); 

        vec_x.cross(vec_z, vec_y); 
        vec_x.normalize(); 
        vec_x.negate(); 

        Matrix3f rotation = new Matrix3f(
         vec_x.x, vec_x.y, vec_x.z, 
         vec_y.x, vec_y.y, vec_y.z, 
         vec_z.x, vec_z.y, vec_z.z 
        ); 
        rotation.invert();
+0

귀하의 질문은 거의 이해할 수 없으며, 특히 "속도 벡터의 절반"에 관한 부분입니다. –

+0

왜 vec_z.normalize를 두 번 호출하고 은 무엇입니까? –

+0

원래 코드의 오타였습니다.실제로 최종 솔루션에 차이를 만들지는 않았지만 y 스케일링을 다소 펑키하게 만들었을 것입니다. :-) –

답변

1

Dupe.

을해야 내가 회전 행렬을 점점 걱정 반면이 특정 축에 회전을 얻기 포함 질문 .

예, convert one to the other을 돌릴 수 있습니까?

현재, 임의의 y 축을 선택하여 다시 원점 복귀를하는 현재의 솔루션은 정상적으로 작동해야합니다. 그것은 도청 당해 보입니다, 또는 적어도 나쁘게 쓰여졌습니다. 'z_vec'은 y 축의 변수 이름이 아닙니다. 어쨌든 'z, x, y'순서는 무엇입니까?

그래도 작동하지 않는다면, 무작위 변경을 시도해보십시오. 행렬을 조 변경하고 기호 오류가 짝수 일 때까지 벡터를 무효화하십시오.

또한 낯선 사람에게 당신을 도와주기 위해 시간을 보내고 싶다는 목소리가 들립니다.

+0

회전 매트릭스를 얻는 데 관심이있는 반면 특정 축으로 회전하는 것과 관련된 질문이 있습니다. –

+0

위의 답변에 대한 내 의견을 참조하십시오. 예, 할 수는 있지만 위의 구현을 작동시키고 싶습니다. –

+0

죄송합니다. 나는 이것에 대해 몇 시간 동안 일해 왔기 때문에 지금 당황 스럽다. –

1

This 당신에게

+1

각도가 없기 때문에 이것은 작동하지 않습니다. 오직 원하는 방향 벡터. –

+0

기본 삼각대를 사용하여 각도를 계산할 수 있습니다. SOH CAH TOA 기본 삼각법을 모른다면 벡터로 돈을 벌어서는 안됩니다 ... – Simon

+1

각도를 사용할 수 있다는 것을 알고 있습니다. , 그러나 그것은 매우 비효율적입니다. 교차 제품 만 사용하여 행렬을 계산할 수 있어야합니다. –