DirectX가 왼손 좌표계를 사용하는 이유는 무엇입니까?


52

Stack Overflow에 게시하는 것을 고려했지만이 문제에서 Microsoft의 선택에 대한 합리적인 기술적 설명을 생각할 수 없기 때문에이 질문은 너무 주관적이라고 생각합니다. 그러나이 질문은 오랫동안 버그를 일으켰고 프로젝트 중 하나에서 문제가 계속 발생하며 실제로 이것을 설명하려는 시도를 본 적이 없습니다.

OpenGL 은 월드 좌표계의 + Z 부분이 뷰어쪽으로 확장되는 오른손 좌표계를 사용합니다.

DirectX 는 왼손잡이 시스템을 사용하여 월드 좌표의 + Z 부분 이 뷰어에서 멀리 떨어진 화면으로 확장 됩니다 .

나는 글라이드 API를 사용 하지 않았으므로 어떻게 작동했는지 모르겠지만 수집 할 수있는 것에서 왼손잡이 시스템도 사용합니다.

이에 대한 기술적 이유가 있습니까? 그리고 그렇지 않다면, 좌표계의 특정 손에 대한 개념적 이점이 있습니까? 왜 하나가 다른 하나를 선택합니까?


5
이것은 아랍어와 히브리어가 오른쪽에서 왼쪽으로 쓰는 반면 다른 모든 언어는 왼쪽에서 오른쪽으로 쓰는 이유를 묻는 것처럼 보입니다.
Gabe

17
나는 수학에서 탄탄한 기초를 공유하는 그래픽 API 사이에 왜 눈에 띄지 않는 불일치가 있는지 이해하려고합니다. Semitic alphabets의 방향은 불변의 규칙으로 결정되지 않습니다.
greyfade

3
이 질문은 .NET 프로그래머를 고용하지 않는 이유 (2011-03-25) 에서 언급되었습니다 .
Peter Mortensen

2
OpenGL이나 Direct3D는 순전히 왼손잡이가 아닙니다. 이전 화면 공간이 오른손 인 반면, D3D 화면 공간에서 + Z 쪽에서 볼 때 X에서 Y 로의 회전은 시계 반대 방향 회전입니다. 그리고 두 시스템 모두 개발자가 키랄성의 공간을 사용할 수 있습니다.
legends2k

1
@PeterMortensen .NET의 모든 싫어하는 사람들이 무엇인지 모르는 것은 매우 재밌습니다. 아마도 그들이 말하는 것은 ASP.NET Webforms, 프레임 워크입니다. .NET은 기본 클래스 라이브러리 및 CLR로 설명 할 수 있습니다.
머핀 남자

답변:


64

나는 이것이 오래된 게시물이라는 것을 알고 있지만이 게시물이 참조되어 선택된 답변의 음색을 싫어하는 것을 보았습니다.

그래서 나는 약간의 조사를했다!

  1. DirectX는 오래되었습니다 . 세계가 NvidiaATI 보다 DirectX와 OpenGL 보다 훨씬 많은 1995 년에 처음 발표되었습니다 . 15 년이 넘었습니다.
  2. 3dfx Interactive의 글라이드 (오늘날 DirectX 경쟁사 중 하나였습니다. OpenGL은 당시 게임용이 아니 었습니다)는 왼쪽 좌표 시스템을 사용했습니다.
  3. POV-RayRenderMan (Pixar의 렌더링 소프트웨어)도 왼손 좌표계를 사용합니다.
  4. DirectX 9+는 두 좌표계 모두에서 작동 할 수 있습니다.
  5. WPFXNA (장면에서 다이렉트로 작업) 오른손 좌표계를 사용합니다.

이것으로부터 몇 가지 사항에 대해 추측 할 수 있습니다.

  • 산업 표준은 사람들처럼 표준이 아닙니다.
  • Direct3D 는 모든 사람이 자신의 방식으로 일을하던 시절 에 만들어졌으며 개발자는 더 잘 알지 못했을 것입니다.
  • 왼손잡이는 선택 사항이지만 DirectX 세계에서는 관례입니다.
  • 컨벤션은 어려워 지므로 DirectX는 왼손잡이 만 사용할 수 있다고 생각합니다.
  • Microsoft는 결국 새로운 API를 배우고 표준을 따랐습니다.

따라서 내 결론은 다음과 같습니다.

그들이 선택해야했을 때, 그들은 표준을 알지 못했고, '다른'시스템을 선택했으며, 다른 모든 사람들은 그냥 타고갔습니다. 이전 버전과의 호환성이 Microsoft 게임의 이름이기 때문에 부끄러운 사업이 아니며 불행한 디자인 결정이 내려졌습니다.


11
DirectX는 3D 컴퓨터 그래픽과 비교할 때 옷을 입는 유아이며, 여러 3D 좌표 시스템을 관리하고 변환하는 컴퓨터 프로그램에 비해 상대적으로 젊습니다. 1970 년대 중반에 그래픽 클래스를 처음 시작했을 때 강사 (프랭크 크로우)는 오른손 좌표계를 독점적으로 사용하도록 강요했습니다. 1983 년에 나는 그래픽이 없었지만 좌표 변환이 진행되는 작업을하고 있었으며 의무적 인 오른쪽 규칙이 첫 번째 프로젝트 메모였습니다. (그리고 나는 그것을 발행하지 않았다!)
John R. Strohm

7
나는 나이와 관련이 있는지 확실하지 않습니다. 대부분의 물리 과학이 오른손 좌표계를 사용하지 않았으며 컴퓨터보다 수년 더 많은 시간을 보냈습니까? 나는 그것이 글라이드와 DX가 뒤 따르는 것보다 훨씬 오래된 관례라고 말할 것입니다.
Thomas Owens

3
학계에서 사용되는 표준이 산업 / 기타 응용 분야에서 동일하다는 의미는 아닙니다. 사람들은 결국 자신의 분야에서 사용되는 모든 것을 따릅니다. 그렇지 않으면 그래픽 시스템이 왼쪽 상단이 아닌 화면의 왼쪽 하단에 시작됩니다. 또한, 시대에 대한 요점은 DX가 전체 "데스크탑 용 3D 렌더링"이 아직 새롭고 "표준"및 "모범 사례"가 아직 완전히 완성되지 않았을 때 탄생 한 것입니다.
Kyte

1
a) 따라서 귀하는 자신의 제안이 인용없이 기업의 잘못 행동에 대한 비난을 받았을 때, 입증 할 수있는 사실의 목록과 본인의 개인적 추론, "미신적"및 "사실없는 사실"을 명시 적으로 내 대답이라고합니다. 무엇을 백업? b) 당신이 나의 대답을 싫어한다면, 당신은 항상 당신 자신을 줄 수 있습니다. 이 답변을했을 때 이미 수락 된 답변은 1 년 전이었습니다. 기여할 것이 있다고 생각되면 더 많은 지식을 자유롭게 추가 할 수 있습니다. c) 시장에서의 발판이 흔들릴 때 독점을 만들기가 어렵습니다. 이것은 현대 다국적 MS가 아닙니다.
Kyte

2
@Kyte 3Dfx는 특정 이유로 독자적인 API를 사용하여 하드웨어에 사용자를 고정시킵니다. 개발자는 3Dfx에서만 작동하는 게임을 작성하기 위해 "부족"했기 때문에 최종 사용자가 하드웨어를 구매하도록 강요했습니다. Microsoft는 개발자가 Windows 용 게임 만 작성하기 위해 API에 갇히기를 원했기 때문에 결국 3Dfx를 죽였습니다. 오해가 아닌 단순하고 간단한 비즈니스 결정. 이것은 오늘날에도 계속되고 있습니다. Nvida는 CUDA를 사용하여 카드에 카드를 고정 시키길 원합니다. AMD는 이러한 행동에 대한 추론과 동일한 이유로 2012 년 OpenCL을 사용하려고합니다. 이것은 역사입니다. 당시 업계에있었습니다.

37

아무도 언급하지 않은 것에 놀랐습니다. OpenGL은 왼손 좌표계에서도 작동합니다. 적어도 쉐이더로 작업하고 기본 깊이 범위를 사용하는 경우에는 그렇게합니다.

고정 기능 파이프 라인을 폐기하면 "clip-space"를 직접 처리합니다. 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)가 단순히 그들의 투영 매트릭스에서 부정을 수행하지 않았다고 생각한다.


4
정말 흥미 롭습니다. 나는 결코 그렇게 면밀히 보지 않았다고 고백 할 것입니다. 내 질문은 구체적으로 세계 공간에 관한 것이지만, 당신의 대답은 나에게 생각의 음식을 제공합니다.
greyfade

수심 범위 또는 수심 테스트를 변경하면 오른 손잡이가되었지만 둘 다 사용하면 서로 상쇄되어 왼손잡이 시스템이되었습니다.
hultqvist

1
흥미로운. 뷰포트 깊이 변환을 살펴보십시오 : z_wiewport = z_clip * (far-near) / 2 + (near + far) / 2. 클립 공간의 -1을 근거리에, +1을 멀리까지 매핑합니다. 따라서 클립 공간 자체는 나중에 뷰포트에 매핑되는 방식을 되돌릴 수 있지만 왼쪽 공간으로 간주 될 수 있습니다 .
Kos

1
@NicolBolas : Direct3D조차 화면 공간이 오른 손잡이이기 때문에 순전히 왼손잡이가 아님을 알고 계셨습니까? X는 왼쪽에서 오른쪽으로, Y는 위에서 아래로, Z는 뷰어에서 멀어집니다. 즉, X에서 Y는 Z 축의 반대쪽에서 볼 때 시계 반대 방향으로 회전합니다.
legends2k

1
@bobobobo "gluLookAt에 의해 생성 된 뷰 매트릭스는 핸드 헬드도 변경할 수 있다는 점에 주목했습니다." -아니요, 그렇지 않습니다. 그것은 순방향 벡터가 계산되는 방식이지만, 그럼에도 불구하고이 행렬은 오른 손잡이 공간에서 일반적인 강체 변형입니다 (실제로 + z는 오른 손잡이 공간에서 "뒤로" 입니다). 앞으로 벡터를 부정하는 것은 좌표 공간의 수작업을 변경하는 것과 관련이 없습니다.
Chris는 Reinstate Monica가

11

순수한 역사입니다. 고대의 초기 동굴 그래픽 프로그래머들은 모니터 (텔레 타입? 스톤 타입?)를 2 차원 그래프 용지로 생각했습니다. 수학 및 공학에서 그래프 용지에 데이터 포인트를 플로팅하는 일반적인 규칙은 x = right, y = up입니다. 실리콘 휠이 발명 된 지 약 일주일 후 어느 날 누군가는 3D 그래픽을 생각했습니다. 어떤 이유로 든이 아이디어의 양초가 머리 위로 깜빡 일 때 Z =를 뷰어에서 멀어지게 선택합니다. (오, 내 오른손은 상상 만해도 아프다.)

그들은 언젠가 그들의 후손이 엔지니어, 과학자, 훌륭한 예술가, 상업 예술가, 애니메이터, 제품 디자이너 등이되어 3D 그래픽이 유용하다는 것을 알지 못했습니다. 이 모든 훌륭한 현대인들은 오른손 좌표계를 사용하여 서로 일치하고 더 많은 수학 텍스트와 물리 규칙을 일치시킵니다.

3D 좌표계를 디스플레이 표면에 기반을 두는 것은 어리석은 일입니다. 집, 의자, 과체중 녹색 오거 또는 은하계를 설명하는 삼각형과 다각형 및 평면이 중요합니다. 오늘날 우리는 모두 오른 손잡이 XYZ 시스템으로 물건을 디자인하고 모델링하며, 어떻게 렌더링 될지를 생각하기 전에 모델 세계의 관점에서 그렇게합니다. 카메라는 어느 시점에 추가되어 미친 방식으로 날아갈 수 있으며 모델을 배변 내에서 조정 된 시스템 변환으로 조정 해야하는 픽셀로 변환하는 보이지 않는 인프라입니다.

혼란을 더하기 위해 일부 그래픽 라이브러리는 CRT가 이미지를 위에서 아래로 스캔하므로 Y = down을 인식합니다. X11, fvwm, gtk +, Win31 API 등 모든 윈도우 시스템 및 윈도우 관리자에서 오늘날에도 사용됩니다. Clutter, Beryl 등과 같은 새로운 3D GUI 시스템이 Z를 처리하는 방식은 3D 그래픽 모델링과는 별개의 문제입니다. 이것은 어플리케이션 프로그래머와 GUI 디자이너에게만 해당됩니다.


1
매우 흥미롭고 SGI의 GL에 대한 이론적 근거를 확실히 설명합니다. ... 그러나 이것이 DirectX가 왼손잡이임을 어떻게 설명합니까?
greyfade

여러 2D 및 3D 시스템은 모두 공통된 역사에서 관습을 도출했습니다.
DarenW

10

하나는 다른 것으로 쉽게 변형 될 수 있기 때문에 둘 다 본질적으로 동일 합니다. 왼손잡이 시스템에서 찾을 수있는 유일한 장점은 물체가 관찰자로부터 멀어 질수록 (x, y 또는 z) 거리가 멀수록 거리가 더 높다는 것입니다. 그러나 이것이 왜 Microsoft가 다른 것을 선택했는지는 잘 모릅니다.

POV-Ray 는 또한 왼손 복도 시스템을 사용합니다.


5
예, 많은 초보자가 화면 깊이가 점점 커질수록 자연 스럽습니다. 그러나 그들은 "그래프 축"스타일 인 x가 오른쪽으로 증가하고 y가 위쪽으로 증가하기를 원합니다. 이를 통해 왼손 좌표계를 얻을 수 있습니다. 나중에 그들이 더 복잡한 일을하려고 할 때 그들은 오른 손잡이 과학 / 수학 / 엔지니어링 세계와는 다른 단계라는 것을 깨달았습니다.
timday

6
@Timday, 당신은 초보자에게 비밀 3D 그래픽 핸드 셰이크를 가르쳐야합니다. 엄지, 집게 손가락 및 가운데 손가락을 모두 벌려 오른손을 잡습니다. 엄지 손가락은 X, 검지 손가락은 Y, 가운데 손가락은 Z입니다. 이제 원하는 좌표에 맞춰 손을 움직여 움직임이 변형에 어떤 영향을 미치는지 즉시 알 수 있습니다.
John R. Strohm 4

3
@ 존 : 이봐, 물리학 자도 같은 비밀 악수를 가지고 무엇을 추측!
timday

1
@John 오른 손잡이 시스템의 장점에 전적으로 동의하지만, 모든 사람이 학교에서 배워야하는 핸드 셰이크 규칙을 왼손잡이 시스템 용으로 사용할 수도 있다는 것을 알고 있습니다.
Chris는 Reinstate Monica가

@ChristianRau는 어떤 좌표계를 오른쪽, 왼손으로 묘사하려고하는지에 따라 다릅니다.
John R. Strohm

10

DirectX (및 Direct3D) 의 수석 개발자 Alex St. John은 최근 이에 대해 언급했습니다. Direct3D의 역사에 관한 기사에서 그는 다음과 같이 썼습니다.

나는 [...] Direct3D API를위한 핸드 헬드를 선택하라는 요청을 받았다. 개인적으로 선호 하지 않는 왼손 좌표계를 선택했습니다 . [...] 그것은 임의의 선택이었습니다.

출처 : http://www.alexstjohn.com/WP/2013/07/22/the-evolution-of-direct3d/


다른 세계가 무엇을하고 있는지 실마리가없는 경우에만, 다른 세계가 그래픽을 위해 오른쪽 좌표 시스템에서 사실상 표준화되었다는 것은 임의의 선택입니다.
John R. Strohm

1
@ JohnR.Strohm-링크 된 기사를 읽었습니까?
Maximus Minimus

링크 로트가 그 페이지를 먹었습니다. 최신 작업 스냅 샷은 다음과 같습니다. web.archive.org/web/20161101112002/http://www.alexstjohn.com/WP/…
Max Barraclough

5

이해해야 할 것은 엄청난 양의 프로그래머 시간이 왼손 좌표계와 오른쪽 좌표계 사이를 변환하는 데 낭비되었으며 특정 순간에 어떤 시스템이 필요한지 기억하는 데 더 많은 프로그래머 시간이 낭비되었다는 것입니다.

오른손 좌표계가 산업 표준이되자 모든 것이 사라졌습니다.

손질 문제를 도입하여 수를 두 배로 늘리지 않고 이미 널리 사용되는 좌표계가 충분합니다. Minkler & Minkler, "항공 우주 좌표계 및 변환"을 참조하십시오 . 항공 시뮬레이션 업무를 수행하는 경우 (예 : 비행 시뮬레이션) 해당 책 이 필요 합니다.

내 생각에 Microsoft는 DirectX 프로젝트에 업계 표준에 대해 아는 사람이 없었으며 업계 표준이 있다는 것을 몰랐으며 중요하지 않다고 생각했습니다.

또 다른 가능성은 오른 손잡이 시스템이 업계 표준이라는 것을 알고 있었으며 DirectX를 왼손잡이로 만들었 기 때문에 사람들이 DirectX를 사용하여 OpenGL을 대신 사용하는 코드를 변환하는 것은 그다지 고려하지 않았습니다. 나는 이것이 사실 이었다는 것을 알게 되었기 때문에, 레드먼드에서 도끼 살인자로서 새롭고 아마도 단명 한 경력을 시작하는 것이 필요하다는 것을 알았습니다.


내 질문에 Microsoft를 강타하고 싶지 않았으므로 OpenGL과의 비 호환 가능성을 염두에두고 싶지 않았습니다.
greyfade

3
@greyfade : 알았어. 그러면 이렇게 놔두 자. 오른손 좌표보다 왼손 좌표를 선호하거나 그 반대의 기술적 이유는 없습니다. 그러나 요즘에는 오른손 좌표를 선호하고, 왼손 좌표를 사용하여 모든 것을 구현하는 힌트를 속삭이는 사람을 레일에서 타고 타르, 깃털 및 도시 밖으로 나가는 것이 매우 좋은 이유가 있습니다. 그것이 더 단순 해 집니까?
John R. Strohm

나는 그것에 대해 의로운 분개를 소집 할 수 있다는 것을 모른다. 나는 작업의 일부로 PostScript를 상당히 정기적으로 사용합니다 (좌표는 왼쪽 하단 모서리로 [0, 0]으로 시작하고 오른쪽 상단에서 최대치입니다). 좌표 변환은 일종의 삶의 사실입니다.
Inaimathi

2
어, 그러면 이것은 100 % 추측입니까? 왜 답변으로 표시되어 있습니까?
Factor Mystic

3
저를 때리고, 그것은 무의미한 rant이며, 왼손 좌표계와 마찬가지로 아이러니하게도 많은 사람들이 어떤 이유로 든 그것을 따라갔습니다.
빠른 조 스미스

5

오른 손잡이 또는 왼손잡이에 이점이 없다고 생각하는 모든 사람들에게, 당신은 절대적으로 잘못입니다. 직교 좌표계의 오른 손잡이는 벡터 교차 곱의 정의에서 비롯됩니다. XYZ의 기저 벡터를 들어 u, v그리고 w, w = u X v.

이 정의는 벡터 수학, 벡터 미적분학 및 많은 물리학의 기초입니다. 전자기 상호 작용을 시뮬레이션하려고한다고 가정하십시오. 자기장 벡터가 있고 M, 그 필드에서 속도로 움직이는 하전 입자가 v있습니다. 요금이 어느쪽으로 가속 되나요? 방향으로 쉽게 M X v. 일부 바보를 제외하고는 디스플레이 시스템을 왼손잡이로 만드는 것이 재미있어서 방향으로 가속됩니다 -M X v.

기본적으로 두 벡터 수량 사이의 물리적 상호 작용은 오른 손잡이로 정의되므로 해당 상호 작용을 시뮬레이션해야 할 때마다 그래픽 시스템이 오른 손잡이가되어야합니다. 모든 수학.


교차 제품이 나오는 유일한 장소는 전자기입니다. 또한 공기 역학 및 궤도 역학에서도 나타납니다. 비행 시뮬레이션이이를 해결해야하며, 여기에서 물리 좌표 시스템과 그래픽 좌표 시스템이 충돌합니다. 위의 답변에서 인용 된 Minkler & Minkler를 참조하십시오.
John R. Strohm 2016 년

@Tom : 이것이 사실인지 확실하지 않습니다. (1, 0, 0), (0, 1, 0) 및 (0, 0, 1)의 3 개의 벡터를 취하면, ixj를 수행하면 k가 주어집니다. 곱의 공식은 잘 정의되어 있고 숫자가 없습니다 키랄성 / 손잡이; 3 개의 벡터를 어느 정도 손으로 해석하는 것은 오직 인간 일뿐입니다. 그럼에도 불구하고 우리는 그것을 양손으로 해석하도록 선택할 수 있으며 여전히 일관성이 있습니다. 즉 왼손잡이 ixj = k는 오른 손잡이 ixj = k가 갈 것입니다. 당신도 알아요, 나도 오른 손잡이이지만, 이것이 사실입니다.
legends2k

@ legends2k : 예, 숫자가 전혀 의미를 원하지 않는 한 사실입니다. 숫자가 실제 상호 작용 또는 디스플레이 시스템의 좌표 또는 실제로는 무엇이든 나타내는 즉시 중요합니다.
Tom

@Tom 숫자에 의미를 부여해야합니다. 정말 중요합니다. 그러나 그것은 여전히 ​​왼손이 오른손 위에 있다고 말할 이유가 아닙니다. 나는 0,0,1앞으로 나아갈 의미를 줄 수 있고 그것이 왼손이므로 1,0,0 X 0,1,0make 0,0,1는 왼손입니다
Thaina

@Tom 실제로 왼손 좌표계에서 물리를 수행 할 때 공식은 여전히 M X v있지만 자기장 M은 의사 벡터이기 때문에 반대 방향을 가리키는 것으로 간주됩니다. 두 시스템에서 동일한 방정식을 사용할 수 있습니다. 의사 벡터가 "포인트"하는 방식에 대한 해석 만 변경됩니다. 가속과 같은 적절한 벡터는 항상 어느 좌표 시스템에서도 동일하게 작동합니다. en.wikipedia.org/wiki/Pseudovector#The_right-hand_rule
오스카 벤자민

5

Direct3D의 초기 왼손잡이에 대한 진정한 대답은 일부 사람들이 생각하는 것보다 훨씬 덜 불쾌합니다. DirectX는 Microsoft가 1995 년에 RenderMorphics를 다시 사들 일 때 시작되었습니다.

당시 RenderMorphics 사무실에서 사용 된 표준 그래픽 텍스트는 왼손 좌표를 사용하여 모든 작업을 수행하는 Newmann 및 Sproul의 "대화 형 컴퓨터 그래픽의 원리"였습니다. 대학에서 사용한 것과 같은 책입니다. D3D 코드를 보면 책의 방정식과 일치하는 변수 이름을 사용하여 볼 수도 있습니다.

Microsoft 음모가 아닙니다. 결정은 마이크로 소프트가 그림을보기 전에 이루어졌다.


나는 의견에 동의 여기 이 도시의 전설처럼 들린다하지만, 개인의 관점을 얻을 것이 좋다.
Josiah Yoder

3

3D 좌표를 2D 표면에 매핑하므로 3D 좌표를 실제로 3D로 만드는 3 차원을 임의로 선택하여 뷰어 나 화면을 가리킬 수 있습니다. 어쨌든 4x4 매트릭스를 통해 물건을 넣을 것이므로 다른 것을 선택할 기술적 인 이유가 없습니다. 기능적으로는 다음과 같이 논쟁 할 수 있습니다.

  • 컴퓨팅 및 기타 분야에서 X 축이 왼쪽에서 오른쪽으로 실행되는 상당히 광범위한 합의가 있습니다 (항공은 주목할만한 예외 임).
  • 수학에서 Y 축이 위를 가리 킵니다. (또한 거품이가는 곳입니다).
  • 컴퓨터 디스플레이에서 Y 축은 아래쪽을 가리 킵니다 (CRT 화면의 작동 방식과 대부분의 사람 스크립트가 행을 정렬하는 순서이기 때문에).
  • X / Y 평면에서 지표면의 "보이는"면을 볼 때 법선은 뷰어를 향해야합니다 (예 : 위성 영상을 볼 때와 같이 "해발 고도"는 위성이 아닌 위성을 가리킴) 지구의 중심). X / Y 평면의 법선은 Z 축 벡터이므로 Z 축도 뷰어를 향해야합니다.
  • 컴퓨터 화면에서 3D 이미지를 볼 때 뷰어에서 멀리 떨어진 지점은 더 큰 Z 구성 요소를 가져야합니다. 따라서 Z 축이 화면을 가리켜 야합니다.

결론 : X 축에 대해서는 약간의 합의가 있지만 다른 두 가지 경우에는 두 가지 방향을 모두 주장 할 수 있으며 두 개의 오른손 구성과 두 개의 왼손 구성이 가능하며 모두 합리적입니다.


3

흥미로운 사실.

Direct3D (DirectX 아님-DirectX는 입력, 사운드 등도 포함)에는 실제로 왼손 좌표계 가 없습니다 .

RH 및 LH 시스템을 완벽하게 지원할 수 있습니다. SDK 설명서를 보면 D3DXMatrixPerspectiveFovLH D3DXMatrixPerspectiveFovRH 와 같은 기능이 표시됩니다 . 두 가지 모두 작동하며 선택한 좌표계와 함께 사용할 수있는 투영 행렬을 생성합니다. 원하는 경우 Direct3D에서 열 주요 항목을 사용할 수도 있습니다. 소프트웨어 매트릭스 라이브러리 일 뿐이므로 사용할 필요는 없습니다. 반면에 OpenGL과 함께 사용하려면 OpenGL에서도 완벽하게 작동한다는 것을 알 수 있습니다 (이것은 Direct3D 자체와 매트릭스 라이브러리의 독립성에 대한 확실한 증거 일 수도 있습니다).

따라서 프로그램에서 RH 시스템을 사용하려면 -RH 버전의 기능 만 사용하십시오. LH 시스템을 사용하려면 -LH 버전을 사용하십시오. Direct3D는 상관하지 않습니다. 마찬가지로 OpenGL에서 LH 시스템을 사용하려면 LH 프로젝션 매트릭스를 glLoadMatrix로 지정하십시오. 이 물건들 중 어느 것도 중요하지 않으며 때로는 그것이 때때로 만들어지는 거대한 문제 근처에는 없습니다.


0

양손에 기술적 인 이점이 없으며 완전히 임의적입니다. 일관된 한 둘 다 잘 작동합니다.

일관성의 장점 때문에 이상적으로는 "다른 사람이 사용하는 것을 사용"하는 것이 이상적입니다. 그러나 실제로는 "우선적으로 선호하는"관례가 없기 때문에 많은 경우에 매우 어렵습니다. 두 손이 널리 사용됩니다. 기껏해야 특정 커뮤니티 (예 : OpenGL) 내에 일관성이 있습니다.

그래서 나는이 질문에 대한 기본적인 답은 그들이 생각했던 것 (올바른 경험이 있었음에도 의심의 여지가 없었 음)을 선택했고 그렇지 않을 이유가 거의 없다고 생각합니다.

결국 다른 시스템 / 커뮤니티와 자산 / 코드를 교환하고자하는 사람은 3D 그래픽의 삶의 사실이기 때문에 손으로 변환을 처리 할 준비가되어 있어야합니다.


0

이것을 이전 답변에 대한 보충 자료로 제공합니다. 1990 년대의 오래된 OpenGL 사양에서 :

OpenGL은 좌표계에서 왼손 또는 오른손을 강요하지 않습니다.

(출처 : http://www.opengl.org/documentation/specs/version1.2/opengl1.2.1.pdf ).

따라서 D3D 나 OpenGL이 어떠한 손길도 강요하지 않기 때문에 실제 문제는 사람들이 왜 이것을 큰 문제로 보는가?


1
왜 별도의 답변으로 게시 했습니까? 이전 답변 을 편집 하여 추가 할 수 없다는 의미입니까?
gnat

-1

나는 말하기를 싫어하지만, 좌표 세트의 '손'은 실제로 주관적입니다-당신이 물건을보고 있다고 상상하는 방법에 달려 있습니다. 예를 들어 OpenGL 큐브 맵 스펙의 예 : 큐브 내부를 바라 보는 것을 상상하면 좌표계는 왼손잡이입니다. 외부에서 들여다 볼 때 오른 손잡이입니다. 이 간단한 사실은 끝없는 슬픔을 초래합니다. 수치 적으로 정확한 답을 얻으려면 모든 가정이 일관성이 있어야하지만 실제로는 어떤 가정을하든 상관 없습니다.

OpenGL 사양은 공식적으로 "핸드 니스 중립적"이며이 문제를 피하기 위해, 즉 프로그래머에게 맡기려고 많은 노력을 기울입니다. 그러나 눈 좌표와 클립 좌표 사이에는 "손 변경"이 있습니다. 우리가보고있는 모델과 눈 공간, 우리가보고있는 클립과 장치 공간에서. 나는 항상 우연히이 합병증의 결과로 어려움을 겪고 있습니다.

십자 벡터는 한 쌍의 벡터에서 확실히 오른 손잡이 또는 왼손잡이 3D 좌표계를 생성 할 수 있기 때문에 우리의 친구입니다. 그러나 어떤 핸드는 "X"라고 부르는 벡터에 따라 다릅니다.


3
교차 산물은 반 변동 적입니다. A x B ==-B x A. 따라서, 교차 곱은 비선형 제 1 벡터 및 제 2 벡터를 그 순서대로 기록하고, 제 1 및 제 2 벡터를 포함하는 평면에 수직 인 제 3 벡터를 생성하도록 정의된다 및 벡터가 순서대로 열거 될 때 오른손 좌표계를 생성하기에 적절한 방향 (제 1, 제 2, 결과). 당신이 이것을 변태하기로 선택한다면, 자유롭게 조심하십시오. 그러나 당신이 내 주위에 그것을하면, 당신은 당신의 엉덩이에서 타르, 깃털, 그리고 파편을 당신의 철길에서 마을 밖으로 타는 것이 좋습니다.
John R. Strohm

그렇습니다, 존; 그러나 당신은 여전히 ​​그러한 왜곡이 가능하다는 사실에 직면해야합니다. 즉 "절대 오른 손잡이"와 같은 것은 없다는 것을 의미합니다.
Thomas Sharpless

-3

업계 표준이 처음부터 잘못되었다고 말할 수 있습니다.

좌표의 산업 표준은 실제로 사람들이 책상 위에 모든 것을 그릴 때 수평 좌표 인 책상 좌표에서 나왔습니다. X는 왼쪽 / 오른쪽이고 Y는 앞 / 뒤이므로 Z를 위쪽으로 만들고 오른쪽 좌표 시스템으로 탄생했습니다.

그러나 우리는 지금 모니터 화면과 함께 사용한다는 것을 알고 있습니다. 그것은 수직면입니다. X는 여전히 왼쪽 / 오른쪽이지만 Y는 위아래입니다.

그러면 오른쪽 좌표 시스템으로 인해 어떤 결과가 발생합니까? + Z를 뒤로, -Z를 앞으로 위쪽은 +이고 아래쪽은-오른쪽은 +이고 왼쪽은-그러나 앞으로는-이고 뒤로는 + ??? 3D 세계에서 캐릭터가 실행되는 게임을 만들면 너무 어리석지 만 앞으로 빼려면 z를 빼야합니다. 게임 프로그래머가 DirectX를 가장 높이 평가하는 이유

책상에서 나온 표준을 잡고 모니터에서 사용하는 것은 처음부터 여러 수준에서 잘못되었습니다. 이제 OpenGL과 Industry가 잘못되었다는 것을 인정해야합니다. 그들은 편안하다고 생각하는 것을 사용하지만 잘못되었습니다. 오른손 좌표계는 가능한 한 빨리 버려야하는 정크 유산입니다.


2
무지의 경우 -1입니다. 오른쪽 규칙은 물리학과 수학, 특히 전자기장 이론과 역학의 기초가되는 벡터 교차 곱 연산에서 비롯됩니다. 컴퓨터의 원래 사용은 숫자를 크런치하기 때문에 컴퓨팅에서 채택했습니다.
John R. Strohm

당신의 무지 대신 -1해야합니다. 내가 말했듯이 이전 시간에서 물리와 수학은 항상 모니터, 책상에 작동하지 "책상 좌표", 그래서 당신은 수평 책상에 물리와 수학을 계산 있기 때문에 "책상 좌표"라는
Thaina
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.