현재 제가 S57 해양데이터를 파싱하여 해양지도를 그리는 작업을 진행중입니다.
Android OpenGL ES에 대해 완전 초보자라 책보면서 따라 해보고 공부해보고 있는데요(타블렛 기준입니다)
지도제작과 관련해 두가지 궁금한점이 있어서 질문을 드렸습니다.
1. 지도에는 축적이라는게 있습니다. 1:25000 이런식으로 25000키로당 지도상에선 1센치 이런식으로 단위 환산을 해 놓은것입니다. 이를 Android OpenGL ES 에서 최대 캔버스 크기를 어떻게 잡아야할지 궁금해서 질문드려습니다. 현재 의심가는건
@Override
public void onSurfaceChanged(GL10 gl, int width, int height)
이 함수에서 width, height값을 찍어본 결과 단말기 화면을 나타내 주는거 같고
gl.glViewport(0, 0, width, height);
요 함수를 써서 캔버스를 초기화 해주는거 같은데 그럼 width, height만 바꾸면 되는 것인가요?
2. 카메라 구현에 관한 질문인데요.
현재 단말기의 터치 이벤트 좌표와 OpenGL ES에서의 카메라의 LookAt 좌표를 일치시키기 위해
float x = (event.getX()/(getWidth()/2)) - 1;
float y = 1-((event.getY()/(getHeight()/2)));
이런식으로 단위를 환산해서 카메라의 표시위치를 출력하고 있습니다.
단 이렇게 하니 문제가 뭐랄까..... 안드로이드의 터치 좌표는 일정하자나요
예를들어 어느 한곳을 손으로 터치했는데 포인트가 20, 20 이라면 다시 그곳을 터치해도 20, 20!!! 즉, 계속해서 드래그해서 우측으로 이동하고 싶을경우(구글 맵 같은것 처럼) 는 어떻게 하여야 하나요?
현재 터치해서 드래그하면 카메라 이동은 돼지만 다시 터치해서 드래그 하면 그림이 계속 다시 원점으로 갔다가 이동하는 문제가 생겨서요.....
위의 두가지에 대해 질문좀 드리겠습니다~
좋은하루 되세요~
친절한 답변 감사드립니다
프로젝션 매트릭스가 무엇인지 아직 잘 개념이 잡혀있지는 않지만 직접 전체 영역 크기를 설정해 줄 수가 있다는 것이군요? 그렇다면 전체 크기를 저렇게 잡아주면 카메라뷰로 위치를 표시해주는곳만 어느정도 크기로 설정해 주면 전체맵중에 원하는곳을 왔다갔다 할수있는 퍼포먼스를 적용할수가 있겠군요. 힌트 감사드립니다.
지도서비스 쪽은 사용을 안하고 있습니다. 정확히 말씀드리자면 OpenGL ES로 지도자체를 제작하고 거기에서 왔다갔다 하면서 어디어디 위치를 본다 하는 개념입니다. 현재 S57데이터가 백터포인터로 경도 위도 값을 나타내고 있어서 이를 좌표로 환산하는 과정이 필요하긴 할거라...... 우선 이건 위의 캔버스 문제를 먼저 해결하고나서 생각해야 될까 했거든요 ㅎㅎ 말씀해주신 지도서버 쪽은 한번 참고해 보도록 하겠습니다.
혹시 실례가 안된다면 프로젝션 메트릭스 연산을 어떤식으로 메소드를 사용하는건지 한번 예시를 들어주시면 감사하겠습니다~
저는 현재 매우 단순히
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
float ratio = (float)width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1.0f, 1.0f, 2f, 20.0f);
}
이런식으로 화면 크기를 잡아서 사용하고 있어서 ㅎㅎ;;
OpenGL ES는 그냥 OpenGL의 서브셋 정도이니, 일반 openGL의 경우로 이야기하자만,
뷰포트의 크기와 모델뷰의 좌표계는 같을필요가 없습니다.
orthographic matrix와 같은 프로젝션 메트릭스연산을 통해서 현재의 뷰포트에서 표시되는 좌표계 영역을 변화시킬수 있습니다.
즉, 뷰포트 크기 800*600에서 가로 600이 프로젝션을 통해서 -25000 ~ +25000까지 표시할수 있습니다. 그러니 지도의 스케일이 변화하는것에 따라서 이 프로젝션 메트릭스를 같이 변화시켜주면 되는거죠.
지도서비스/서버를 어떤걸 쓰는지는 모르겠지만, ESRI의 ArcGIS를 서버로 사용한다면, 지도의 터치되는 지점의 지도내의 좌표를 바로 가져올수 있습니다. 아니면, 현재 지도의 centerAt으로 센터값을 읽어오고, 터치좌표가 변화된 변위만큼 지도의 centerAt값을 변화시키면 되지 않을까요?
ps. ArcGIS라면, Map관련 API가 자체적으로 터치에대해 알아서 대응해줍니다.