2013-03-14 1 views
-1

저는 android 용 증강 현실 응용 프로그램을 개발 중이며 openGl을 사용하여 전 세계에 큐브를 배치하려고합니다. 내 현재 방법은 아래 코드에서 확인할 수 있습니다.OpenGL ES에서 회전하여 객체를 배치 한 다음 세계를 회전하십시오.

 for(Marker ma: ARData.getMarkerlist().values()) { 

     Log.d("populating", ""); 
     gl.glPushMatrix(); 



     Location maLoc = new Location("loc"); 
     maLoc.setLatitude(ma.lat); 
     maLoc.setLongitude(ma.lng); 
     maLoc.setAltitude(ma.alt); 

     float distance = currentLoc.distanceTo(maLoc); 
     float bearing = currentLoc.bearingTo(maLoc); 
     Log.d("distance", String.valueOf(distance)); 
     Log.d("bearing", String.valueOf(bearing)); 
     gl.glRotatef(bearing,0,0,1); 
     gl.glTranslatef(0,0,-distance); 
     ma.cube.draw(gl);   

     gl.glPopMatrix(); 
    } 

    gl.glRotatef(y, 0, 1, 0); 
    gl.glRotatef(x, 1, 0, 0);` 

여기서 y는 yaw이고 x는 피치입니다. 현재는 멀리서 45도 각도로 화면에 단일 큐브를 얻고 있습니다. 그것은 합리적인 베어링과 거리 값을 얻는 것 같습니다. 휴대 전화 방향과 관련이있을 수 있습니까? 더 많은 코드가 필요하면 알려주십시오.

수정 : 베어링 회전을 gl.glRotatef(bearing,0,1,0);으로 업데이트했습니다. 이제 내 큐브를 다른 깊이의 화면을 따라 수평으로 매핑했습니다. 아직 헤딩과 피치를 사용하는 움직임이 없지만 @Mirkules는 그 이유가 무엇인지 밝혀 냈습니다.

EDIT 2 : 이제 표제와 베어링 사이의 각도 차이로 표식을 회전하여 큐브를 배치하려고합니다. 그러나 큐브가 새로운 위치에 렌더링 된 것처럼 보이는 일종의 지터를 얻은 다음 이전 위치로 다시 이동합니다. 상기와 같이 다음을 제외 코드 : - 360 스케일 모두 0 정규화 Y

 float angleDiff = bearing - y; 
     gl.glRotatef((angleDiff),0,1,0); 
     gl.glTranslatef(0,0,-distance); 

베어링. 또한, "카메라 회전"을 마커를 설정 한 코드 위로 이동했습니다.

편집 3 : 나는 지금 사용하고 있습니다. float angleDiff = (bearing + y)/2;입니다. 그러나, 나는 기울기를 얻는 것처럼 보인다. 내가 gl.glRotatef(-x,1,0,0);을 사용하려고 시도했지만 작동하지 않는 것 같습니다.

답변

0

당신이 여기에서하려고하는 것을 정확하게 말하는 것은 힘들지 만 잠재적 문제로 쏟아내는 몇 가지 사항이 있습니다.

첫째, 마지막 두 회전은 실제로는 적용되지 않습니다. 이것들이 세계 또는 카메라의 움직임을 나타내는 것으로 가정된다면 (대부분 같은 일을합니다) 전에을 그리기 전에 일어날 필요가 있습니다.

당신의 회전 자체는 아마도 당신이 의도 한대로 완전히하지 못할 것입니다.

큐브가 Z 축을 중심으로 회전합니다. GL에서의 일반적인 관례는 카메라가 Z 축을 내려다 보며 Y 축은 '위로'간주됩니다. 원하는대로 자연스럽게 축을 해석 할 수 있지만 'Z'주위의 회전은 일반적으로 '베어링'이 아니라 '롤'입니다. 'Bearing'은 'yaw'와 유사합니다.

Z 축을 따라 번역 할 때 회전 및 변환을 통해 개체의 위치를 ​​지정하려고한다고 가정하지만 회전이 실제로 같은 축을 중심으로하는 경우에는 실제로 위치가 변경되지 않습니다. 큐브 - 항상 카메라 바로 앞에 있고 축을 회전합니다.

더 구체적인 위치로 시작하는 것처럼 큐브를 배치하려고하는 이유가 확실하지 않습니다. 당신은 아마도 더 적절한 행렬을 직접 만들 수 있습니다.

마지막으로, 카메라/세계 회전은 Y와 X 주변의 두 회전 연결입니다.이 피치와 롤이라고 부르지 만 일반적으로 카메라 회전에 오일러 각도를 사용하면 피치와 롤과 같은 용어가 완전한 의미를 갖는 경우 직관적 인 결과가 발생하지 않습니다. 일반적으로 방향을 유지하고 여러 회전을 업데이트하려고 시도하지 않고 방향을 업데이트하기 위해 개별 회전을 적용합니다.

그렇습니다. 다른 행렬 연산이 없으면이 코드는 하나 이상의 큐브를 직선으로 그리는 것으로 보이기 때문에 직각 방향으로 약간의 각도만큼 회전됩니다.

+0

응답 해 주셔서 감사 드리며, 본인의 관찰 내용 중 일부를 사용하여 코드를 수정하고 다시 신고 해 드리겠습니다. 베어링과 거리를 사용하는 이유는 위도/경도를 openGl에서 사용되는 (x, y, z) 좌표계로 변환하는 더 좋은 방법을 생각할 수 없었기 때문입니다. – ryanVincent

+0

또한, 제가 향하고 있다는 사실에 주목할 가치가 있습니다. 가속도계, 자력계 및 자이로를 사용하여 만든 융합 센서의 요 및 롤. 이 융합 된 센서에서 회전 행렬을 얻을 수는 있지만 그 결과를 얻을 수는 없습니다. – ryanVincent

관련 문제