2011-10-11 2 views
1

입력에 추적 장치 (회전 만 추적하고 위치가 아님)를 사용하고 있으며 회전 행렬을 OpenGL 응용 프로그램에 보냅니다. 추적기는 축 시스템과 정렬 될 때 단위 행렬을 전송합니다. 즉, 추적기가 Y 축을 향하고 추적기의 위쪽 방향이 Z 축과 마주하는 경우입니다. 그림의 오른쪽에 보이는 바와 같이. 나는 그러나 추적기를 회전하면회전 축 매핑?

Axis Systems Diagram

내 OpenGL은 프로그램에서 해당 회전은 잘못된 것입니다.

1 0 0 0 
    0 0 1 0 
    0 -1 0 0 
    0 0 0 1 

다시 매핑하지만 항상 세 개의 회전 중 하나가 잘못처럼 그것을 시도 상관없이 같다 : 내가 가진 추적기에 의해 제공되는 매트릭스를 곱하려고 것을 해결하려고합니다.

내 트래커 매트릭스를 곱하여 회전 수를 늘릴 수있는 매트릭스가 있습니까?

===== 편집 =====

안드로이드의 remapCoordinateSystem 내가 원하는하지만 난 거기에 코드를 이해할 수없는 무엇을 달성 할 것으로 보인다

: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/hardware/SensorManager.java#L1459

+1

오른쪽 또는 왼쪽으로 트래커를 곱합니까? 행렬 곱셈 피연산자를 전환 해보십시오. – datenwolf

+0

'glRotatef (degree, axis) '를 쓰면 잘못된 회전이 생기거나 변환 행렬을 수동으로 계산할 때 잘못되었을 수 있습니다. – Shahbaz

+0

Shahbaz : 추적기의 행렬을 그대로 OpenGL에 전달합니다 (셰이더를 통해). 다이어그램을 보면 장치가 z 축을 중심으로 회전 할 때 매트릭스를 적용 할 OpenGL 개체가 다르게 회전합니다. – Jubei

답변

1

다음은 OpenGL을 제대로 작동 할 수있는 매트릭스를 번역했다.

//orientation is the tracker's rotation matrix 
orientation = glm::rotate(orientation, glm::degrees((float)M_PI/2),vec3(1,0,0)); 
orientation = glm::inverse(orientation); 
orientation = glm::rotate(orientation, glm::degrees((float)M_PI/2),vec3(1,0,0)); 

나는 왜 효과가 있었는지 모르지만 효과가 있습니다.

0

내가 사용 시도해야한다고 생각을 트래커로서의 쿼터니언 계산은 현재의 ('momental') 축을 따라 회전 할 수 있습니다. 그래서 최종 회전은 추적기에 의해 만들어진 모든 회전의 요약이 될 것이라고 생각합니다.

아니면 그냥 '추적자'말단의 의미를하지 않았다 =) 코멘트에서

+0

트래커가 상대적으로가 아닌 절대적으로 추적되고 있습니다. 따라서 추적기를 모니터 (예 : 그림의 오른쪽에있는 축과 정렬)로 가리키면 추적기가 y 축을 향하고 있다고 생각합니다. – Jubei

+0

@ Jubei 나는 "tracker"= 무엇을 말하는 것이냐고 궁금합니다. – shybovycha

+0

케이블을 통해 컴퓨터와 통신하고 9 개의 부동 소수점 숫자 (회전 행렬)를 보내는 입력 장치를 상상해보십시오. – Jubei

0

, 제가 이해하면 회전 행렬의 권리를 얻을 수 있다는 것입니다,하지만 당신은 회전이 다른 축에서 발생 할 . 예를 들어, 행렬은 z 주위를 회전하지만 x 주위에 있어야합니다.

이렇게하려면 여러 가지 방법이 있습니다.

하나는 처음부터 회전을하는 것입니다. 예를 들어 장치에서 z 방향으로 회전해야하지만 프로그램에서 x 방향으로 회전하려면 z 방향으로 회전하지 말고 x 방향으로 회전 시키십시오! 당신이 얻을 데이터가 다음과 같이되도록 경우

glRotatef(rot_z, 1, 0, 0); 

식으로 뭔가 :이 같은지도해야합니다

data[] = {data_about_x, data_about_y, data_about_z} 

: 당신을 회전 할 때

data_map[] = {2, 0, 1} 

쓰기 :

glRotatef(data[data_map[0]], 1, 0, 0) 

또는 당신에게 더 적합 할 수 있습니다 어떤 다른 방법으로 주위를 매핑 :

axis_map[][3] = {{0, 1, 0}, {0, 0, 1}, {1, 0, 0}} 

그런 다음 쓰기 :

glRotatef(data[2], axis_map[2][0], axis_map[2][1], axis_map[2][2]); 
+0

회전 행렬은 x y와 z에 대한 3 개의 회전을 모두 포함합니다. 그래서 당신의 대답은 기존의 매트릭스를 재 매핑하는데 적용되지 않습니다. ( – Jubei

+0

알고있는 한, 기존 매트릭스를 변경하는 쉬운 방법은 없습니다.하지만 잠깐, 매트릭스를 구성했다고 생각했기 때문에 구성을 변경하는 방법을 설명 했으므로 변환 매트릭스를 이미 만들었습니까? – Shahbaz

+0

예 건설하지 않고 이미 건설했습니다. – Jubei