OpenGL 좌표계는 왼손잡이입니까, 오른 손잡이입니까? ) 다른 자습서에서는 오른 손잡이 라고 말합니다

OpenGL 좌표계를 이해하려고합니다. 그러나 일부 자습서에서는 기본 좌표계가 왼손잡이 라고 말하고 ( http://www.c-sharpcorner.com/UploadFile/jeradus/OpenGLBasics11172005014307AM/OpenGLBasics.aspx 참조 ) 다른 자습서에서는 오른 손잡이 라고 말합니다 ( http : // www 참조 .falloutsoftware.com / tutorials / gl / gl0.htm ). 어느 것이 맞습니까? 미러링을 통해 서로 변환 할 수 있다는 것을 이해하지만 기본 좌표를 알고 싶습니다.



답변

여기에 약간의 혼란이 있습니다.

OpenGL은 오른 손잡이입니다. 객체 공간과 세계 공간에서 입니다.

그러나 창 공간 (일명 화면 공간)에서는 갑자기 왼손잡이가 됩니다.

어떻게 된 일 입니까?

오른 손잡이에서 왼손잡이로가는 방법은 glOrtho또는 glFrustum투영 행렬 의 음의 z 스케일링 항목입니다 . z를 -1로 축척하면 (x와 y는 그대로두고) 좌표계의 손길을 변경하는 효과가 있습니다.

glFrustum의 경우

farnear 는 양수 여야하며 far > near . 말 까지 = 1000 근처 = 1. 그러면 C =-(1001) / (999) = -1.002.

자세한 내용과 다이어그램 은 여기 를 참조 하십시오 .

에서 직교 사시도 , glOrtho 이런 행렬을 생성한다 :

여기서 left , right , bottomtopleft vertical , right vertical , bottom horizontal , top horizontal clip planes (resp) 의 좌표입니다 .

그러나 근거리원거리 평면 은 다르게 지정됩니다 . 근처 파라미터로 정의

  • 근거리 : 더 가까운 깊이 클리핑 평면까지 의 거리 입니다. 비행기가 시청자 뒤에있을 경우이 거리는 음수입니다.

그리고 멀리 :

  • zFar 더 먼 깊이 클리핑 평면까지 의 거리 입니다. 비행기가 시청자 뒤에있을 경우이 거리는 음수입니다.

여기에 일반적인 표준 뷰 볼륨이 있습니다.

z 승수가 (-2 / (근거리))이기 때문에 마이너스 기호는 z를 -1로 효과적으로 스케일 합니다. 이것은 “z”가 왼손잡이 임을 의미합니다. , OpenGL에서 단순히 “오른손”좌표계로 작업하기 때문에 대부분의 사람들이 모르는 사이에보기 변환 중에 바뀝니다.

그래서 전화하면

glOrthof(-1, 1, -1, 1, 10, -10) ; // near=10, FAR=-10,

그러면 NEAR PLANE이 10 단위 앞서 있습니다 . 어디야? 원점에서 x 축은 오른쪽, y 축은 머리 위에, 코 는 음의 z 축을 가리키고 있습니다 (기본값 “기본적으로 카메라는 원점에 있습니다. , 음의 z 축 아래를 가리키고 상향 벡터가 (0, 1, 0)입니다. “ ). 따라서 가까운 평면은 z = -10에 있습니다. 먼 평면은 z = + 10에서 10 단위 뒤에 있습니다 .


답변

기본적으로 정규화 된 장치 좌표는 왼손잡이입니다.

glDepthRange는 기본적으로 [0, 1] (근거리, 원거리)로 + z 축이 화면을 가리 키도록하고 + x를 오른쪽으로, + y를 위로하면 왼손잡이 시스템입니다.

깊이 범위를 [1, 0]으로 변경하면 시스템이 오른 손잡이가됩니다.

Nicol 의 이전 답변 인용 : ( 취소 선 은 내 작업이며 아래에 설명되어 있습니다)

아무도 언급하지 않은 것에 놀랐습니다. OpenGL은 왼손 좌표계에서도 작동합니다. 적어도 셰이더로 작업하고 기본 깊이 범위를 사용할 때 수행됩니다.

고정 함수 파이프 라인을 버리면 “클립 공간”을 직접 처리합니다. OpenGL 사양은 클립 공간을 4D 동종 좌표계로 정의합니다. 정규화 된 장치 좌표를 통해 변환을 수행하고 창 공간으로 내려 가면 이것을 찾을 수 있습니다.

창 공간은 창의 픽셀 공간에 있습니다. 원점은 왼쪽 아래 모서리에 있으며 + Y는 위로, + X는 오른쪽으로 이동합니다. 그것은 오른손 좌표계와 매우 흡사하게 들립니다. 하지만 Z는 어떻습니까?

기본 깊이 범위 (glDepthRange)는 가까운 Z 값을 0으로 설정하고 먼 Z 값을 1로 설정 합니다. 따라서 + Z는 뷰어에서 멀어 집니다.

그것은 왼손 좌표계입니다. 그래 넌 할수있어깊이 테스트를 GL_LESS에서 GL_GREATER로 변경하고glDepthRange를 [0, 1]에서 [1, 0]으로 변경합니다. 그러나 OpenGL 의 기본 상태는 왼손 좌표계 에서 작동하는 것입니다 . 클립 공간에서 창 공간에 도달하는 데 필요한 변환은 Z를 무효화하지 않습니다. 따라서 클립 공간, 정점 (또는 지오메트리) 셰이더의 출력은 왼손잡이 공간입니다 (일종. 4D 동종 공간입니다. 손을 잡는 것은 어렵다).

고정 된 함수 파이프 라인에있어서, 표준 돌출부 행렬은 (glOrtho, glFrustum와 같이 제조) 모두에 오른손 공간으로 변형 왼손잡이 하나. 그들은 Z의 의미를 뒤집습니다. 그들이 생성하는 행렬을 확인하십시오. 눈 공간에서 + Z는 시청자쪽으로 이동합니다. 투사 후 공간에서는 멀리 이동합니다.

나는 마이크로 소프트 (그리고 GLide)가 그들의 프로젝션 매트릭스에서 부정을 수행하는 것을 귀찮게하지 않았다고 생각합니다.

나는 그것이 내 발견과 갈라 졌기 때문에 한 부분을 공격했습니다.

DepthRange 또는 DepthFunc를 변경하고 ClearDepth (0)을 사용하면 작동하지만 둘 다 사용할 때 서로를 취소하여 왼손잡이 시스템으로 되돌립니다.


답변

NDC 만

당신은 통지해야 OpenGL을 만 NDC을 알고있다! 그것은 왼손 좌표계입니다.

사용하는 좌표계 (왼손잡이 또는 오른 손잡이 축 좌표계)에 관계없이 모두 NDC에 미러링되어야합니다. 원한다면 왼손 좌표계로 월드 공간을 완전히 다룰 수 있습니다.

왜 우리는 일반적으로 세계 공간에서 오른손 좌표계를 사용합니까?

나는 그것이 전통적인 것이라고 생각합니다. 그냥 그렇습니다. DirectX와 구별하고 싶을 수도 있습니다.


답변

Kouichi Matsuda의 “WebGl Programming Guide”책은 “WebGl / OpenGl : Left or Right Handed?”에 대해 거의 10 페이지를 씁니다.

책에 따르면 :

  • 실제로 대부분의 사람들은 오른 손잡이 시스템을 사용합니다.

  • OpenGl은 실제로 내부적으로 왼손잡이 시스템입니다.

  • 내부적으로 더 깊게 말하자면 실제로 둘 다 아닙니다. 맨 아래에서 OpenGl은 z 값에 대해 신경 쓰지 않습니다. 그리는 순서에 따라 맨 위에 그려지는 항목이 결정됩니다 (삼각형을 먼저 그린 다음 쿼드를 그리면 쿼드가 삼각형보다 우선합니다).

나는 “그것도 아니다”에 완전히 동의하지는 않지만 어쨌든 그것은 아마도 철학적 인 질문 일 것이다.


답변

OpenGL은 확실히 왼손잡이입니다. 투영 행렬에서 z 값을 부정하기 때문에 반대를 설명하는 많은 자습서를 볼 수 있습니다. 최종 정점이 정점 셰이더 내에서 계산 될 때 클라이언트 측 (오른쪽 좌표)에서 왼손으로 전달하는 정점을 변환하고 정점은 지오메트리 셰이더 및 조각 셰이더로 전달됩니다. 클라이언트 측에서 오른손 좌표계를 사용하는 경우 OpenGL은 신경 쓰지 않습니다. 왼손잡이 인 정규화 된 좌표계 ​​만 알고 있습니다.

편집 : 나를 믿지 않는다면 변환 행렬을 추가하여 버텍스 셰이더를 실험 해보십시오. 그러면 Opengl이 왼손잡이인지 아닌지 쉽게 확인할 수 있습니다.


답변

OpenGL에 내장 된 투영 및 변환 기능을 사용하여 화면의 움직임을 관찰하여 오른 손잡이 의 규칙을 따릅니다. 좌표계 . 예를 들어 뷰 앞에있는 객체가 양의 z 방향으로 변환되면 객체가 사용자쪽으로 이동합니다.

깊이 버퍼는 정반대이며 여기서 NDC (Normalized Device Coordinates)가 작동합니다. GL_LESS를 glDepthFunc에 전달하면 픽셀이 이미 깊이 버퍼에있는 것보다 더 가까이있을 때 픽셀이 그려진다는 것을 의미한다면 픽셀은 왼손 좌표계 에있는 것으로 간주됩니다 .

좌표계가 하나 더 있습니다. 이것이 바로 뷰포트입니다! 뷰포트의 좌표계는 + x가 오른쪽을 가리키고 + y가 아래를 가리 키도록합니다. 나는이 시점에서 우리가 x, y만을 다루고 있기 때문에 손 잡음이 문제라고 생각합니다.

마지막으로 gluLookAt은 look-at 벡터를 무효화해야합니다. 수학에서는 벡터가보고있는 객체를 향한 양의 방향을 가리키고 카메라가 -z를 내려다보고 있다고 가정하므로, 룩앳 벡터는 카메라와 정렬되도록 부정해야합니다.

씹을 것. 오른손 좌표계의 z 방향을 전방 벡터라고 부르는 것은 의미가 없습니다. :). 나는 마이크로 소프트가 Direct3D를 설계했을 때 이것을 깨달았다 고 생각합니다.