나의 애호가 쉐이더 기반 (non-FFP) GL (3.2+ 코어) "엔진"에서, 월드 스페이스와 모델 스페이스의 모든 것은 디자인 상으로는 "왼손잡이"(그런 식으로 유지)이므로 X Y 축은 -1 ("왼쪽")에서 1 ("오른쪽"), Y는 -1 ("아래")에서 1 ("위쪽"), Z는 -1 ("근처")에서 1 ").셰이더 기반 코어 프로파일 OpenGL에서 "Z 축을 반전"하는 방법은 무엇입니까?
기본적으로 OpenGL에서 NDC 공간은 동일하게 작동하지만 수집 한 부분에서 클립 공간은 z가 1 ("근처")에서 -1 ("먼")까지 확장되지 않습니다. 에 바라-의 경우,
func (me *Mat4) Lookat(eyePos, lookTarget, upVec *Vec3) {
l := lookTarget.Sub(eyePos)
l.Normalize()
s := l.Cross(upVec)
s.Normalize()
u := s.Cross(l)
me[0], me[4], me[8], me[12] = s.X, u.X, -l.X, -eyePos.X
me[1], me[5], me[9], me[13] = s.Y, u.Y, -l.Y, -eyePos.Y
me[2], me[6], me[10], me[14] = s.Z, u.Z, -l.Z, -eyePos.Z
me[3], me[7], me[11], me[15] = 0, 0, 0, 1
}
// a: aspect ratio. n: near-plane. f: far-plane.
func (me *Mat4) Perspective(fovY, a, n, f float64) {
s := 1/math.Tan(DegToRad(fovY)/2) // scaling
me[0], me[4], me[8], me[12] = s/a, 0, 0, 0
me[1], me[5], me[9], me[13] = 0, s, 0, 0
me[2], me[6], me[10], me[14] = 0, 0, (f+n)/(n-f), (2*f*n)/(n-f)
me[3], me[7], me[11], me[15] = 0, 0, -1, 0
}
그래서 : 내가 이상적으로 바라보기 및 전망에 대해 "좀-그렇다고 씨께 서 비공식적 준 표준"매트릭스 기능을 계속 사용하고자하는 동시에
, 현재로 정의 이 가상 코드에 따라 월드 와이드 카메라 (양수 -Z)가 lookat (음수 -Z)로 작동하도록하십시오.// world-space position:
camPos := cam.Pos
// normalized direction-vector, up/right/forward are 1 not -1:
camTarget := cam.Dir
// lookat-target:
camTarget.Add(&camPos)
// invert both Z:
camPos.Z, camTarget.Z = -camPos.Z, -camTarget.Z
// compute lookat-matrix:
cam.mat.Lookat(&camPos, &camTarget, &Vec3{0, 1, 0})
잘 작동합니다. 6 자유도에서 카메라를 움직이면 정확한 화면 이동과 새로운 카메라 월드 - 스페이스 좌표가 수정됩니다.
그러나 형상은 여전히 Z 축에서 반전됩니다. 두 개의 상자, A (-2, 1, -2)는 왼쪽 근처에 표시하고 B (2, 1, 2)는 맨 오른쪽에 나타나도록 배치하면 A가 가장 왼쪽에 나타나고 B는 근처에 나타납니다 . Z는 여전히 반전되어 있습니다.
이제 이러한 노드에는 고유 한 월드 - 스페이스 코디가 있으며 해당 노드의 모델 - 월드 매트릭스가 업데이트됩니다. 나는 그들이 부모 변환과 모든 것을 곱하는 하위 노드의 계층 구조를 형성 할 때 posZ를 반전해서는 안됩니다. 그들은 여전히 제 법령에 따라 왼손잡이로 남아있는 모델이나 세계 공간에 있습니다.
세계 대 카메라의 계산은 마지막 단일 CPU (mvp/clip-space) 행렬을 얻는 버텍스 쉐이더가 아니라 CPU 끝에서 발생합니다. 클립 공간 바라보기 및 프로젝션 매트릭스 세계 공간 객체 행렬의 곱셈 - - 그렇게
그 시점에서 어떻게 든
Z.
를 반전 할 필요가 무엇을 할 수있는 가장 좋은 방법입니다 이? 또는 더 일반적으로 말하면, 작동하는 일반적인 방법은 무엇입니까? 왼손잡이 용이지만 GL에서 오른손잡이 용으로 투사를 수정해야합니까? 그렇다면 어떻게? 그리고 lookat을 수정해야합니까? 모델 - 변환 행렬을 왼손 좌표로 유지하면서 다소 표준 lookat/projection 행렬을 수정하지 않고도이 모든 작업을 수행 할 수있는 현명한 방법이 있습니까?