2017-01-31 24 views
1

증강 현실 애플리케이션의 경우 일부 슬램 알고리즘을 사용하여 휴대 전화의 현재 방향을 예측합니다.카메라 매트릭스에서 한 축의 회전을 반전하는 방법 (예 : OSG CameraViewMatrix)

알고리즘 (LSD-Slam)은 현재 포즈를 SE3 거짓 그룹 형태로 제공합니다 (Sophus::Sim3f 사용). 이 권한이있는 경우이 유형은 카메라의 Viewmatrix로 해석 될 수있는 행렬을 포함합니다. 초기화 후, 예를 들어 행렬은 다음과 같습니다.

1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1 

3D 콘텐츠를 시각화하기 위해 OpenSceneGraph를 사용합니다. Fortunatley, OSG에서 직접 뷰 매트릭스를 사용하여 카메라 위치를 설정할 수 있습니다

camera->setViewMatrix(matrix); 

을 지금, 나는이 코드를 실행하면 일이 내가 Y (롤) 또는 Z (요) 중심으로 회전하는 경우 잘 작동하는 것 같다. 그러나 X (피치)를 중심으로 회전 할 때 OSG의 디지털 카메라는 예상했던 것과 정확히 반대되는 것처럼 보입니다.

예 : 카메라 앞에 3D 모델을 직접 상상해보십시오. 그런 다음 천천히 카메라를 위쪽으로 (X 주위로) 기울이면 3D 모델도 위쪽으로 이동합니다. 실제로는 맨 아래쪽 끝에서 화면을 벗어나야합니다. 다음 그래픽을 사용하여이 동작을 설명하려고 시도했습니다. axis behaviour

적절하게 해결할 수있는 해결책이 있지만, 몇 시간이 지나도 해결할 수 없습니다. 제가 올바르게 이해했다면, 첫 번째 열은 특정 축 주위의 회전을 나타내므로 단일 벡터를 뒤집어 봤습니다. 이 않았다 일부 시도 정말 피치-문제를 해결하는 동안

u u u 0  -u u u 0   -u -u -u 0 
v v v 0 => -v v v 0 ...  v v v 0 
n n n 0  -n n n 0   n n n 0 
0 0 0 1  0 0 0 1   0 0 0 1 

, 그들은 다음 다른 축을 엉망 .. 항상 적어도 하나 개의 축에 잘못이있는 것 같습니다. 아무도 내가 이것을 해결할 수있는 단서가 있습니까?이 문제에 대한 모든 힌트를 보내 주시면 감사하겠습니다.

답변

1

라이브러리에서 가져온 포즈가 OpenGL 뷰 매트릭스에 해당하면, 언급 한대로 직접 osg 카메라로 전달할 수 있어야합니다.

그러나 OSG는 행 기본형 행렬 규칙 (예 : this post 참조)을 사용하므로 행렬에서 행/열을 전환해야 할 수 있습니다.

문제가 해결되지 않으면

, 난 당신이 (대한 회전이되는 세계 좌표의 위치를 ​​휴식 ) 푸스가 사용하는 포즈 규칙에 대해 확인하고 같은 변환이 처음부터 OSG되어 다시하는 것이 좋습니다.

+0

감사합니다, 한/colums 도움이되지 않았다 오일러 각도로, 나는 각각 따로 각 축의 회전을 설정 할 수 있었다. Sophus를 다시 확인하기 위해 당신의 충고를 따랐습니다. 나는 당신의 대답을 받아 들였지만 비슷한 문제를 놓고 누군가가 걸려 넘어지면 내 대답을 게시 할 것입니다. –

0

Sophus를 다시 확인한 후에 회전 벡터와 tranlsation vector를 seperatly 얻을 수 있다는 것을 알았습니다. this post을 사용하여 rotationmatrix를 오일러 각으로 변환했습니다.

rotationMatrix.makeRotate(
    osg::DegreesToRadians(-angleZ), osg::Vec3(0,1,0), // roll 
    osg::DegreesToRadians(angleX), osg::Vec3(1,0,0) , // pitch 
    osg::DegreesToRadians(angleY), osg::Vec3(0,0,1)); // heading 

반전 롤 행을 전환 마침내 트릭 ... 당신의 답변을