2013-03-08 1 views
1

나의 애호가 쉐이더 기반 (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 행렬을 수정하지 않고도이 모든 작업을 수행 할 수있는 현명한 방법이 있습니까?

답변

1

원근법에서, me [11]을 -1에서 1로 변경하면 설명하는 방법대로 z 축을 뒤집을 수 있습니다. 그게 맞지 않으면, 나를 부정하게하십시오 [10]. 물론, z 축이 반전되기 때문에 회전 방향도 영향을받습니다. y 축을 중심으로 올바른 회전을 생각해 보면 아마도 x 축이 반전 될 것입니다. 이 경우에 대비하여 회전을 무효로 할 수 있어야합니다.