OpenGL의 클립 공간이 4 차원 인 이유는 무엇입니까?


13

나는 이것을 일반적인 참조로 사용할 것이지만 i 브라우저 온라인 문서와 책이 많을수록 이에 대해 이해하지 못합니다.

const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
};

온라인 책 에는 삼각형 만들기에 관한 OpenGL의 최초이고 고전적인 hello world를 그리는 방법에 대한 예가 있습니다.

삼각형의 꼭짓점 구조는 위 코드에서 설명한대로 선언됩니다.

이 책은 이것에 관한 다른 모든 소스와 마찬가지로 클립 공간이 기본적으로 화면에 렌더링되고 렌더링 될 대상을 결정하는 데 사용되는 4D 구조라는 점을 강조합니다.

여기에 내 질문이 있습니다.

  • 나는 4D로 무언가를 상상할 수 없다. 나는 인간이 그렇게 할 수 있다고 생각하지 않는다.이 클립 공간의 4D는 무엇인가?
  • 내가 읽은 가장 인간이 읽을 수있는 문서는 클리핑 개념에 대한 추상화 인 카메라에 대해 말하는데, 문제는, 왜 카메라 개념을 더 먼저 사용하지 않는지입니다. 익숙한 3D 구조? 카메라 개념의 유일한 문제점은 다른 방법으로 예상을 정의해야하므로 기본적으로 어떤 종류 의 카메라를 갖고 싶은지에 대한 다른 진술을 추가 해야한다는 것입니다.
  • 이걸 어떻게 읽어야 0.75f, 0.75f, 0.0f, 1.0f합니까? 내가 얻는 것은 모두 float 값이고 처음 3 개의 값의 의미를 얻는 것입니다. 마지막 값은 무엇을 의미합니까?

4
4 장에서는 네 번째 구성 요소의 기능을 정확하게 설명합니다. 실제로, 그것을 긁으십시오; 1 장에서는 래스터 화 섹션의 클립 -NDC 변환을 반쯤 아래로 설명 합니다.
Nicol Bolas

2
@NicolBolas는 저자가 첫 번째 장에서 설명을하고 다음 장들에 대한 언급을하지 않으며, 일부 C ++ 코드를 주석 처리 할 때 다음에 어떤 일이 발생하는지 설명하는 척하고 문제는 모든 것을 완전히 설명하지 않으면 1 장은 4 장의 첫 번째 장소에서 알아야 할 내용, 특히 1 장의 내용을 해독하기 위해이 개념이 필요한 경우 중요하지 않습니다. 나는 이것을 1 번이 아니라 지금 읽고 있습니다. 이제 대답을 더 찾아야한다는 것을 알고 있습니다. 나는 다양한 장을 통해 갈 것입니다.
user827992

1
아무것도 해독 할 필요가 없습니다. 1 장에 나와 있습니다. W 구성 요소는 다른 3 가지 구성 요소로 나뉩니다. 4 장까지는 OpenGL 이 그렇게하는 이유 입니다. 현재 진행중인 작업과 관련이 없기 때문에 나중에 보류됩니다.
Nicol Bolas

3
현재 진행중인 문제와 관련이없는 정보 (예 : 삼각형 렌더링)입니다. 당신은 그것에 대해 호기심 이 있지만, 이것이 그것이 어떻게 작동하는지 이해하는 것이 왜 그런지 이해할 필요 가 없습니다 . 무엇이든 배우는 첫 단계는 그것이 무엇인지 이해하는 것입니다. 무슨 일이 일어나고 있는지 이해하면 왜 그런지 에 대한 토론을 할 수 있습니다 .
Nicol Bolas

1
이 답변 이 도움 될 수 있습니다.
iammilind

답변:


9

마법의 용어는 "동종 좌표"이며, 이는 관점이 중요한 시스템에서 사용됩니다. 위키에서 개요를 확인하십시오.하지만 실제로 이해하지 못하는 것은 오랜 연구 과정입니다.


10

읽은 책의 소개를 읽으면 놀라게 될 것입니다.)

래스터 화 개요의 http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html

"w"값 (처음 3 개의 값은 x, y 및 z)은 기본적으로 클립 공간의 크기를 나타냅니다. 이 값은 1 스칼라 값이므로 클립 공간의 3 차원 모두가 같습니다 (그래서 클립 공간이 큐브 인 이유). 모든 정점에는 고유 한 클립 공간이 있으며 (기본적으로 "맞춤"해야하며, 그렇지 않으면 CLIPS : D) 클립 공간 인 1 개의 "월드"는 없습니다 (모든 클립 공간이 동일한 " 세계 "나는 이것에 문제가 있다고 생각한다; P).

따라서 정점이 예를 들어 좌표 [1,1,1]을 가지고 있다면 클립 공간이 1이면 정점이 화면의 모서리 오른쪽 상단에 있습니다 (모두 기본값 일 때 방향이 있는지 모르겠습니다) 변경 가능). 그러나 꼭짓점의 클립 공간이 2이면 좌표 [1,1,1]은 화면 오른쪽에서 3/4, 화면에서 3/4, 맨 위 3 차원입니다. 자신을 추측 할 수 있습니다.

클립 공간이 5라고하면 큐브 공간이 5x5x5가 아니라 모든 차원에서 클립 공간 내의 위치가 -5에서 5까지의 범위를 의미한다고 생각합니다. 그러나 이것은 아마도 간단히 말해서입니다 : 모든 xy 및 z 좌표는 클립 공간 차원으로 나뉘므로 기본적으로 정점은 다음과 같이 진행됩니다.

x = x / w

y = y / w

z = z / w

그것이 모든 것을 가능하게하는 것입니다. 이것이 존재하는 이유는 쉬운 비교를위한 것이라고 생각합니다. 좌표를 클립 공간 치수로 나눈 경우 1보다 큰 값을 가진 하나 이상의 구성 요소가있는 좌표가 클립 공간 외부에 존재합니다. 따라서 클립 공간이 1024라고 말하지만 좌표가 [2000,3, -100] 인 경우 x (2000) 구성 요소는 클립 공간 밖에 있습니다 (-1024에서 1024까지만 해당).

계산적으로 당신이해야 할 모든 것이 (매우 거칠게 c) : (x / w) <1 && (x / w)>-1이라면 클립 공간 안에 무언가가 있는지 쉽게 알 수 있습니다. 또한 모든 정점의 모든 클립 공간이 동일한 크기 (모든 차원에서 -1에서 1까지의 모든 클립 공간 큐브)를 갖는 것이 모든 좌표에서 그 순간부터 볼 때 정규화 프로세스 후에 오는 모든 것을 더 쉽게한다고 가정합니다. 0에서 1 사이의 수레 (클리핑 된 것을 무시).


문제는 클립 공간이 의미하는 것이 아니라 클립 공간이 그 자체 인 이유 입니다. 즉, W 나누기의 요점은 무엇입니까?
Nicol Bolas

2
그것은 비록 3) 총알 점의 3 번째 질문에 대답합니다. =)
dammkewl

8

TL; DR 4D 공간이 아니며 3D + 스케일링 수는 사실상 항상 1입니다. 1이면 무시할 수 있으며 처음 세 숫자는 x, y, z입니다. 그렇지 않으면 더 복잡해집니다.

다음은 간단한 설명입니다. 3D의 정점은 해야 세 개의 구성 요소가

⌈x⌉ v = |y| ⌊z⌋

이를 조작하려면 (예 : 회전, 스케일링 등) 행렬을 사용합니다. 물론 가장 일반적인 예는 월드 좌표를 클립 공간으로 변환하는 MVP (Model-View-Projection) 매트릭스입니다. 이처럼 :

⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋

그러나 이것은 큰 결점이 있습니다. 번역을 할 수 없습니다. 경우 [x,y,z]제로, 상관없이입니다 m우리가 번역을 포함하는 MVP를 가질 수 있도록 항상 0이됩니다 결과입니다. 분명히 우리는 그것을 원합니다. 해결책은 벡터 끝에 1을 더하고 행렬을 4x4로 확장하는 것입니다.

⌈cx⌉ ⌈m11 m12 m13 tx⌉ ⌈x⌉ |cy| = |m21 m22 m23 ty| * |y| |cz| |m31 m32 m33 tz| |z| ⌊ 1⌋ ⌊ 0 0 0 1⌋ ⌊1⌋

(예를 들어 from에서와 같이 직교 MVP 행렬을 보면 glOrtho()4 번째 행이임을 알 수 0 0 0 1있습니다. 때로는 암시 적으로 남겨져 있습니다.) 수학을 통해 작업하면 다음과 같은 것을 알 수 있습니다

⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋

네 번째 구성 요소는이며 1 일 필요w 는 없지만 거의 항상입니다 ( 어쨌든 변환 전에 ; 나중에 전체 벡터를 다시 나누면 다시 균질화되어 다시 1이됩니다). 변환 행렬에 변환이 포함되도록하는 것은 일종의 해킹입니다.w

편집하다

원래 동기는 원근법 투영 에 대한 것이라고 생각합니다 . 3D 좌표로는 불가능합니다. 4D 벡터로만 수행 할 수있는 다른 변형이 있지만 번역이 가장 이해하기 쉽습니다.


2
당신의 downvotes를 설명하십시오.
Timmmm

+1, 정보가 정확하다고 가정하면, 이것은 좋은 설명이며 도움이되었습니다. 감사합니다
Luke

1

내가 보았으며 이전 답변에서 언급되지 않은 이유가 하나 더 있습니다.

번역 행렬은 4x4이므로 "세계"를 중심으로 개체를 번역 할 수도 있습니다. 3x3 행렬을 사용하면 3d 좌표를 회전하고 크기를 조정할 수 있지만 4x4 행렬로만 3d 좌표를 변환 할 수 있습니다. 여기에서 3d 좌표를 4d 벡터로 표현해야합니다.


그러한 정의 하에서는 4d 벡터 만 "필요"합니다. 4x4 매트릭스는 모든 사람들이 다른 사람들을 가정하고 주장하는 것처럼 추가하는 단순한 목적을위한 것이 아닙니다. 회전 후 3D 점으로 변환을 추가하려는 경우 4x3 행렬 만 정의하면됩니다. 그게 전부라면 훨씬 더 효율적입니다. 다른 이유들로 인해 만들어진 규칙으로 자신을 제한 할 필요는 없습니다. lol
Puddle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.