저는 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);
을 사용하려고 시도했지만 작동하지 않는 것 같습니다.
응답 해 주셔서 감사 드리며, 본인의 관찰 내용 중 일부를 사용하여 코드를 수정하고 다시 신고 해 드리겠습니다. 베어링과 거리를 사용하는 이유는 위도/경도를 openGl에서 사용되는 (x, y, z) 좌표계로 변환하는 더 좋은 방법을 생각할 수 없었기 때문입니다. – ryanVincent
또한, 제가 향하고 있다는 사실에 주목할 가치가 있습니다. 가속도계, 자력계 및 자이로를 사용하여 만든 융합 센서의 요 및 롤. 이 융합 된 센서에서 회전 행렬을 얻을 수는 있지만 그 결과를 얻을 수는 없습니다. – ryanVincent