2009-03-31 4 views
13

3D 공간 (x, y, z)에서 점의 2D 화면 좌표 (x, y)를 결정하고 싶습니다.투시 투영 - Noob 도움말

내가 투영하고자하는 포인트는 GPS 좌표와 해발 고도가 나타내는 실제 지점입니다.

: 포인트 (위도 : 49.291882 롱 : -123.131676, 높이 : 14m)

카메라 위치, 높이, 또한 X, Y, Z 지점으로 결정될 수있다. 카메라의 방향 (나침반 각도), 기울기 각도 (위/아래 수평) 및 롤 (z 축 주변)도 있습니다.

나는 3D 프로그래밍에 대한 경험이 없기 때문에 투시 투영에 대한 주제를 읽었으며 행렬, 변형 등에 대한 지식이 필요하다는 것을 알게되었습니다.이 모든 것이 현재 완전히 나를 혼란스럽게합니다.

저는 OpenGL이 실제 포인트의 3D 모델을 구성하고 카메라 방향을 설정하며 3D 점의 2D 좌표를 검색하는 데 유용 할 수 있다고 들었습니다.

그러나, 나는 OpenGL을을 사용하여이 문제에 대한 최선의 해결책인지 확실하지 오전이 경우에도 나는, 설정 카메라 모델을 생성하는 방법을 모르고에게이 없다 등

사람이 해결하는 가장 좋은 방법을 제안 할 수 내 문제? 만약 OpenGL이 실현 가능한 솔루션이라면 OpenGL ES를 사용해야한다. 아, 내가 선택한 솔루션은 빨리 실행해야합니다. 당신의 도움이

+0

너 너 나니? 개미를 그리는 개미 아니면 그냥 몇 가지 포인트를 계산하고 싶니? –

답변

4

에 대한

덕분에 당신은 참으로 perspective projectionmatrix operations 크게 그렇게 간단하게 필요합니까. 이 계산을 위해 spherical coordinatesCartesian coordinates으로 변형해야한다는 것을 이미 알고 있다고 가정합니다.

OpenGL을 사용하면 software rasterizer을 롤백하는 대신 많은 작업을 줄일 수 있습니다. 그래서 나는 먼저 trying it라고 조언 할 것이다. OpenGL ES는 단순하게 유지한다면 PC에서 프로토 타입을 만들 수 있습니다.

+0

나는 데카르트 좌표계로 변형해야한다는 것을 알지 못해서 고마워. OpenGL에 관해서는 카메라 위치를 설정하는 방법을 가지고 있으므로 3D 모델에서 2D 투영을 얻을 수있는 메커니즘을 사용하므로 솔루션을 사용하여 구현하려고합니다. 좋은 자습서를 알고 있습니까? –

+0

다음은 몇 가지 언어로 포팅 된 고전적인 튜토리얼입니다 : http://nehe.gamedev.net/ –

2

일부 점의 좌표 만 계산하면 OpenGL을 사용한 3D 프로그래밍이 아닌 일부 대수 기술 만 있으면됩니다.

은 또한 지리적 다루지 않는다 OpenGL을 사용하면 예를 들어 (카티 프레임으로 지구 중심 직교 프레임을 GPS 데이터를 변환 할 첫번째가,

먼저 약 WGS84 및 측지 좌표 일부 문서를 얻을 좌표있는 WGS84 타원체가 정의 됨).

그러면 행렬로 계산할 수 있습니다. 은 변환 체인이 대략적이다 :

  • WGS84
  • 지구 중심은 this 참조 첫번째 변환 들어
  • 일부 로컬 프레임
  • 카메라 프레임
  • 2D 투영

좌표 마지막은 투영 행렬을 포함합니다.다른 것들은 회전과 변환 만 조정합니다. "일부 로컬 프레임"은 카메라 위치가 원점 인 로컬 데카르트 프레임 타원체에 접 힙니다.

2

Eric Lengyel의 "3D 게임 프로그래밍 및 컴퓨터 그래픽 용 수학"을 권하고 싶습니다. 행렬, 변형, 뷰 프러스 텀 (perspective frustum), 원근 투영 (perspective projection) 등을 다룹니다.

변환보기 및 카메라 설정 (gluLookAt 사용 방법 포함)에 대한 OpenGL 프로그래밍 가이드 (빨간색 책)에서 좋은 장이 있습니다.

3D 장면을 표시하는 데 관심이 없으며 OpenGL ES를 사용하는 것으로 제한되는 경우 3D에서 2D 창 좌표로 매핑하는 코드를 직접 작성하는 것이 좋습니다. 시작 지점으로 OpenGL의 오픈 소스 구현 인 Mesa 3D을 다운로드하여 gluPerspective (투영 행렬 설정), gluLookAt (카메라 변형 설정) 및 gluProject (2D 창 좌표로 3D 점 투영)를 구현할 수 있습니다.).

12

다음은 매우 일반적인 답변입니다. 카메라가 (Xc, Yc, Zc)에 있다고 말하면 투영 할 포인트는 P = (X, Y, Z)입니다. 카메라에서 투영되는 2D 평면까지의 거리는 F입니다. 따라서 평면의 방정식은 Z-Zc = F입니다. 평면에 투영 된 P의 2D 좌표는 (X ', Y')입니다. 아주 간단히

:

X '= ((X - Xc는) * (F/Z)) + Xc는

Y'= ((Y - YC) * (F/Z) 카메라가 원점 인 경우) + YC는

, 이것은로 단순화

X '= X * (F/Z)

Y'= Y * (F/Z)

+0

첫 번째 두 방정식은'X '= ((X - Xc) * (F/(Z-Zc))) + Xc' 및 Y = ((Y-Yc) * (F/(Z-Zc))) + Yc'- –

+1

@rofrankel Z = 0으로 포인트를 투영하려면 어떻게해야합니까? – 0x6B6F77616C74