2016-09-30 6 views
0

내 목표는 사용자가 3D 모델을 업로드하고 웹 브라우저를 사용하여 위치를 지정할 수 있도록하는 것입니다. 이렇게하려면 BabylonJS-&을 잘 사용하고 있습니다. 그런 다음 내 사용자가 웹 브라우저를 사용하여 설정 한 위치와 동일한 위치로 기본 앱에서 동일한 모델을 볼 수있게하려고합니다. 네이티브 응용 프로그램에 사용하고있는 프레임 워크는 OpenSceneGraph (OSG)입니다. 내가 가지고있는 문제는 OpenSceneGraph가 BabylonJS에서 일어나는 일을 정확하게 반영 할 수 있도록 회전이 제대로 작동하지 못한다는 것입니다.오일러 각도 회전을 축 + 각도로 변환

저는 웹 사이트 사용자가 이해하기 쉬운 (예 : X 축을 중심으로 90도 회전하고 Y를 중심으로 180도 회전하고 Z 모델을 중심으로 0도 회전 등) 쉬운 바울러스 쥬스에서 오일러 각을 사용하고 있습니다. rotation = new BABYLON.Vec3 (90,180,0)). 그러나 OSG는 회전 축과 회전 각도가 필요한 OpenGL glrotate() 함수를 사용합니다. 이것을하기 위해 저는 Euler 각도에서 Quaternion을 만들기 위해 BabylonJS를 사용합니다;

function getAxisAngle(){ 
    var q = BABYLON.Quaternion.RotationYawPitchRoll(m.rotation.y,  m.rotation.x, m.rotation.z),s,r={}; 
    /*Convert quaternion to axis+angle*/ 
    if(q.w > 1){ 
     q = q.normalise(); 
    } 
    r.angle = BABYLON.Tools.ToDegrees(2 * Math.acos(q.w)); 
    s = Math.sqrt(1-q.w*q.w); 
    if(s < 0.001){ 
     r.ax = q.x; 
     r.ay = q.y; 
     r.az = q.z; 
    }else{ 
     r.ax = q.x/s; 
     r.ay = q.y/s; 
     r.az = q.z/s; 
    } 
    return r; 
} 

http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm 내가 BJS 및 OSG 사이의 근본적인 차이를 실현 BJS 좌표계 왼손잡이라는 것이다; 그리고 난이 페이지에서 자바 예제를 기반으로 쓴 기능을 사용하여 OSG는 오른 손잡이입니다. 그래서 나는 시계 방향으로 얼굴을 감아 서 OSG를 왼손잡이로 만들었습니다. 내 모델의 z 축을 -1만큼 크기 조정합니다.

한 번에 한 축을 분리하면 기본 수준에서 작동합니다. 예 : 만약 내가 단지 y 축을 중심으로 회전한다면; 다른 축을 중심으로 회전하지 마십시오. 그러나 동시에 두 개 또는 세 개의 오일러 각을 시도하고 결합하면; 나는 OSG에서 똑같이 보이도록 할 수는 없다.

나는 오일러 각을 권장하지 않는다는 것을 읽었습니다. 부분적으로 회전이 각 축에 적용되는 순서가 중요하기 때문입니다. 가능한 원인입니까?

+0

한쪽 끝에 쿼터니언을 사용하고 다른 쪽 끝에 오일러 각을 사용 했으므로 짐발 잠금으로 인해 오일러 각에 대해 쿼터니언을 사용하는 것의 차이점을 잘 알고 있기 때문에 추측하고 있습니다. 응용 프로그램이 오일 축을 사용하여 여러 회전 축에서 회전을 수행하고 짐벌 잠금이 발생하면 회전이 중단됩니다. 축에서 회전을 할 때 오일러 각을 계속 사용하려면 짐벌 잠금 (Gimbal Lock)이 [-89.99, 89.99]가되는 것을 막기 위해 사이를 구속해야합니다. (... 계속) –

+0

(... 계속) 짐벌 잠금의 이유는 90도 또는 PI/4가 직각 또는 직교로 인한 것입니다. Sine (90) 또는 Sine (PI/4) = 1, Cosine (90) 또는 Cosine (PI/4) = 0이고 Tangent = 사인/코사인 이후 당신의 탄젠트는 0으로 나누기 때문에 정의되지 않습니다. X 축 90 °, Y 90 °, Z 90 ° 또는 -90 °로 움직입니다. 두 축이 연동되고 두 개의 고정 축 중 하나에서 다시 회전 할 때 발생합니다. 이 함수는 회전 할 축을 결정할 수 없습니다. (... 계속) –

+0

(...계속) Quaternions에 대한 명확한 이해를 얻으려면이 비디오를 확인하십시오. 아마도 수학적으로는 아니지만 적어도 시각적으로는 알 수 있습니다. https://www.youtube.com/watch?v=zc8b2Jo7mno –

답변

0

제 의견으로는 OSG를 왼손잡이로 만들지 말고, 회전 각도의 "논리적"의미를 번역하여 OSG에 사용하는 방법으로 적용하십시오.

로드 된 모델을 osg :: PositionAttitudeTransform (또는 MatrixTransform)에 놓은 다음 올바른 회전 (태도)을 계산하여 사용자에게 표시되는 2 회전 각도에 대해 2 쿼터니언을 연결하여 적용합니다. 예를 들어
, 당신은 X 축을 중심으로 회전으로 "투구"와 Y의 주위에, 같은 것을 할 "제목"고려하는 경우 :

osg::Quat attitude = osg::Quat(pitchAngle, osg::X_AXIS) * osg::Quat(headAngle, osg::Y_AXIS); 
transform->setAttitude(attitude); 

을 당신은 올바른 결과를 얻을 수있는 각도 표시를 반전해야 할 수도 있습니다 (왼손에서 오른손으로 전달).

+0

제안 해 주셔서 감사 드리며 다시 신고 해주세요. – Reece