2013-04-17 3 views
0

OpenGL에서 스포트 라이트 변환 시스템을 연구 중입니다. 스폿 라이트는 기본적으로 위치 및 원뿔 방향이 있습니다. 그러나 구현시에도 회전 및 방향이 있어야합니다. 이 경우 회전 - 밝은 콘의 로컬 회전 방향 - 로컬 회전 후 콘의 세계 회전이 적용되었습니다.스폿 광원 방향 회전 및 방향 반전

glm :: lookAt 메서드가 출력 행렬의 "눈"벡터를 반전 시킨다는 사실 때문에 부분적으로 발생하는 모든 종류의 축 플립 문제가 발생했습니다. 이제는 최종 방향 벡터를 반전시켜야한다는 점을 제외하고는 모두 괜찮습니다. y 및 Z 부분이 아닌 반대 방향 스폿 광 콘 표면을 얻기 위해 :

  lookatMatr[2].y =- lookatMatr[2].y; 
    lookatMatr[2].z =- lookatMatr[2].z; 

I 2 가지를 알아낼 수

I가 필요하지 않도록

1 괜찮나 할 수있어 끝에 반전을하십시오. 2. 반전은 Y 축과 Z 축에만 필요합니다.

glm::vec4 worldPos = WorldMatr * _pos ; 
    glm::vec4 worldDir = WorldMatr * glm::vec4(_lightDir,1) ; 
    glm::vec4 worldUp = WorldMatr * glm::vec4(Y_AXIS,1) ; 


    //first construct lookat matrix to get direction vector 
    glm::mat4 lookatMatr = glm::lookAt(glm::vec3(worldPos),glm::vec3(worldDir),glm::vec3(worldUp)) ; 

      //rotate locally : 
    lookatMatr = glm::rotate(lookatMatr,30.0f,X_AXIS) ; 
    lookatMatr = glm::rotate(lookatMatr,0.0f,Y_AXIS) ; 
    lookatMatr = glm::rotate(lookatMatr,0.0f,Z_AXIS) ; 

      //Orient : 
    lookatMatr = Transform().GetOrientationMatrix() * (lookatMatr); 

    _posOut= worldPos ; 
// lookatMatr[2].x =- lookatMatr[2].x;//why only Y and Z to be inverted? 
    lookatMatr[2].y =- lookatMatr[2].y; 
    lookatMatr[2].z =- lookatMatr[2].z; 
    _dirOut= (lookatMatr[2]) ; 

UPDATE : 아래 제시되었을

확인, I가 제로로 _lightDir의 W 부분을 설정하고 지금 이렇게 :

여기

는 변환의 전체 코드
_dirOut=World * Transform().GetOrientationMatrix() * rotMatr * glm::vec4(_lightDir,0); 

가벼운 원뿔을 올바르게 표시하지만 방향이 X 축에서 뒤집 힙니다.

답변

1

염두에 두어야 할 점은 lookAt은 역행렬을 생성한다는 것입니다. 이 행렬은 벡터를 월드 공간에서 카메라 공간으로 변환하는 시스템 변환입니다. 이것은 카메라를 세계 공간에서 원점으로 이동시키는 모델 변환과 같습니다. 그 반대도 마찬가지입니다.

방향을 설명하는 벡터는 w- 구성 요소에 0을 가져야합니다. 결과적으로 행렬의 번역 부분을 건너 뜁니다. worldDirworldUp의 정의를 수정하십시오.

그러나 실제로는 lookAt 행렬이 필요 없습니다. 대신 worldDir을 가져 와서이 벡터에 대한 변환을 수행해야합니다. 그래서 전체적인 방향은 다음과 같습니다 당신은 하나 전치 승산 다음 행렬 및 벡터의 하나의 변환을 수행 할 수 있습니다 또는 당신이 (등등 LocalRotationMatrix에 먼저와) 벡터 세 번을 변환 할 수 있습니다

_dirOut = 
    WorldMatr * OrientationMatrix * LocalRotationMatrix * glm::vec4(_lightDir, 0); 

.

+0

해결책이 작동하지 않습니다. 그런 경우 로컬 회전이 로컬이 아닙니다. 예를 들어 Z 축을 중심으로 (로컬) 회전하면 원뿔 방향이 바뀌지 않습니다. 그러나 지정한 방식대로 변경됩니다 . –

+0

좋아요, 로컬 회전 계산에 쿼터니언을 사용했는데 제대로 작동하지 않았습니다. 이제는 일반 회전으로 변경됩니다. 그러나 X 축에서 뒤집 힙니다. "_dirOut.x"를 뒤집으면 올바른 방향을 향하게됩니다. 어떤 아이디어? –

+0

에뮬레이션의 소스가 왼손잡이 시스템이기 때문에 아마도 올바른 행동 일 것입니다. 감사합니다. –