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 축에서 뒤집 힙니다.
해결책이 작동하지 않습니다. 그런 경우 로컬 회전이 로컬이 아닙니다. 예를 들어 Z 축을 중심으로 (로컬) 회전하면 원뿔 방향이 바뀌지 않습니다. 그러나 지정한 방식대로 변경됩니다 . –
좋아요, 로컬 회전 계산에 쿼터니언을 사용했는데 제대로 작동하지 않았습니다. 이제는 일반 회전으로 변경됩니다. 그러나 X 축에서 뒤집 힙니다. "_dirOut.x"를 뒤집으면 올바른 방향을 향하게됩니다. 어떤 아이디어? –
에뮬레이션의 소스가 왼손잡이 시스템이기 때문에 아마도 올바른 행동 일 것입니다. 감사합니다. –