>

메시에 할당하려면 카메라에서 변환 매트릭스를 추출해야합니다.

학교의 컴퓨터 그래픽 프로젝트에서 일하고 있는데, 목표는 일인칭 시점에서 캐릭터의 팔을 시뮬레이션하는 것입니다.

카메라 구현에 카메라 위치에 대한 vector3이 포함되어 있으므로이를 메시에 할당 할 수 있습니다. 문제는 뷰 매트릭스에서 카메라의 회전을 아직 추출 할 수 없다는 것입니다.

이러한 방식으로 회전 기능에서 최종 피치와 요를 계산합니다. x와 y는 화면에서 현재 마우스 위치입니다

m_yaw += (x - m_mouseLastPosition.x) * m_rotateSpeed;
m_pitch -= (y - m_mouseLastPosition.y) * m_rotateSpeed;

이것이 뷰 매트릭스가 변경 될 때 업데이트하는 방법입니다

glm::vec3 newFront;
newFront.x = -cos(glm::radians(m_yaw)) * cos(glm::radians(m_pitch));
newFront.y = sin(glm::radians(m_yaw)) * cos(glm::radians(m_pitch));
newFront.z = sin(glm::radians(m_pitch));
m_front = glm::normalize(newFront);
m_right = glm::normalize(glm::cross(m_front, m_worldUp));
m_up = glm::normalize(glm::cross(m_right, m_front));
m_viewMatrix = glm::lookAt(m_position, (m_position + m_front), m_up);

이제 카메라의 위치를 ​​다음과 같이 메시에 할당 할 수 있습니다

m_mesh.m_transform = glm::translate(glm::mat4(1.0f), m_camera.m_position);

카메라 위치를 성공적으로 지정할 수 있지만 회전 할 수는 없습니다.

내가 기대하는 것은 전체 카메라변환을 내 메쉬에 할당하거나회전을 독립적으로 추출하여 나중에 메쉬에 할당하는 것입니다.


  • 답변 # 1

    언제나 따라 왔던 모델 뷰 투영 행렬을 설정하는 단계는 (100 % 옳다는 것을 의미하지는 않습니다), 문제가있는 것으로 보입니다 :

    // Eye position is in world coordinate system, as is scene_center. up_vector is normalized.
    glm::dmat4 view = glm::lookat(eye_position, scene_center, up_vector);
    glm::dmat4 proj = glm::perspective(field_of_view, aspect, near_x, far_x);
    // This converts the model from it's units, to the units of the world coordinate system
    glm::dmat4 model = glm::scale(glm::dmat4(1.0), glm::dvec3(1.0, 1.0, 1.0));
    // Add model level rotations here utilizing glm::rotate
    // offset is where the objects 0,0 should be mapped to in the world coordinate system
    model = glm::translate(model, offset);
    // Order of course matters here. 
    glm::dvec3 mvp = proj * view * model;
    
    

    도움이 되길 바랍니다.

  • 답변 # 2

    답장 해 주셔서 감사합니다. 많은 도움이되었습니다.

    매우 간단한 방법으로 문제를 해결했습니다. 카메라의 별도 속성을 사용하여 최종 변형을 메시에 직접 할당해야했습니다.

    glm은 나에게 새로운 것이기 때문에 행렬 곱셈을 처리하는 방법에 익숙하지 않았습니다.

    마지막 코드는 카메라 위치로 변환 행렬을 취한 다음 결과 행렬을 Y 축으로 내 피치로 회전시킨 다음 결과적으로 X 축에서 요로로 회전합니다.

    m_mesh.m_transform = glm::rotate(glm::rotate(glm::translate(glm::mat4(1.0f), camera.m_position), glm::radians(-camera.m_yaw), glm::vec3(0.0f, 1.0f, 0.0f)), glm::radians(-camera.m_pitch), glm::vec3(1.0f, 0.0f, 0.0f));
    
    

관련 자료

  • 이전 excel - 여러 스피너에 연결된 셀을 스피너가 연결된 셀의 값 합계로 제한하는 방법은 무엇입니까?
  • 다음 ConcreteObserver가 Observer 패턴에서 ConcreteSubject에 대한 참조를 보유하는 이유는 무엇입니까?