2014-09-14 3 views
4

정상적인 n과 상수 d에 의해 주어진 평면 위에 놓 이도록 삼각형을 회전시켜야합니다. enter image description here포인트를 이동하지 않고 회전하는 방법은 무엇입니까?

저는 두 개의 삼각형이 놓여있는 평면의 정상적인 n1을가집니다. 이제 오른쪽 빨간 삼각형을 회전시켜야 오렌지색이됩니다. 삼각형과 법선의 점은 3 차원 벡터로 저장됩니다. 는 지금까지 내가했던 다음

  • N1과 N2 사이의 정규화 된 회전 사원 수 (rotQuat)를 가져옵니다.
  • 삼각형의 모든 점에 쿼터니언을 곱하십시오. 따라서 점을 쿼터니언 (point.x, point.y, point.z, 0)으로 변환하고 곱셈을 다음과 같이 수행합니다. resultQuat = rotQuat * point * conjugate (rotQuat). 그런 다음 결과의 x, y 및 z를 점에 적용합니다.

    public static Quaternion getRotationBetweenTwoVector3f(Vector3f vec1, Vector3f vec2) 
    { 
        Vector3f cross = Vector3f.cross(vec1, vec2); 
        float w = (float) (java.lang.Math.sqrt(java.lang.Math.pow(vec1.getLength(), 2) * java.lang.Math.pow(vec2.getLength(), 2)) + Vector3f.dot(vec1, vec2)); 
        Quaternion returnQuat = new Quaternion(cross.x, cross.y, cross.z, w); 
        returnQuat.normalize(); 
        return returnQuat; 
    } 
    

    문제는 삼각형이 회전 후 올바른 방향을 가지고 있지만 삼각형은 또한 위치의 움직임이다 :

이 내가 두 벡터 사이의 회전을 얻는 방법이다. 삼각형을 회전시켜 왼쪽의 빨간색 삼각형의 두 점 (예 : 주황색 점)에 연결되도록 회전이 필요합니다. 어떻게 가능합니까?

+0

나중에 간단한 변환을 수행하면됩니까? 그것은 기본적으로 모든 모션이 구성하는 것입니다 : 회전 + 번역. – Bernhard

답변

1

문제는 회전 행렬/쿼터니언은 원점을 지나는 축을 중심으로 회전하는 점입니다. 원점과 다른 점을 중심으로 회전하려면 삼각형 점을 원점으로 변환 한 다음 (삼각형 점에서 회전 점 값을 Substract로) 쿼터니언을 곱한 다음 다시 평행 이동해야합니다.

그래서 알고리즘된다 :

  • translatedPoints [I] = triPoints [I] - rotationPoint;
  • translatedPoints 회전 쿼터니언을 사용하여 회전
  • 회전 지점 값을 추가하여 translatedPoints를 역으로 되돌립니다.
+1

당신이 이것을 똑똑하게한다면 번역 단계를 건너 뛸 수 있다고 생각합니다. – Bernhard

+0

@Bernhard 더 설명해 주시겠습니까? – concept3d

+0

그래서 제대로 이해한다면 삼각형이 공유하는 2 점 중 하나를 회전 점으로 가져와야합니까? 나는 이것을 시도했지만 회전 된 점을 엉망으로 만들었다. rotationPoint는 회전하는 축이 지나가는 지점입니다. 맞습니까? – user3067395

관련 문제