mam zagadkę, może ktoś ma pomysł
Shadow mapa jest renderowana z projekcją depthproj i macierzą depthcam. Do GL jako modelview jest przesyłana tylko obrót depthcam, czyli mat3(depthcam).
To samo ze światem, renderowany jest z projekcją perspective i macierzą worldcamera. Do GL jako modelview jest przesyłany tylko obrót worldcamera, czyli mat3(worldcamera)
Teraz: przez jaki macierz trzeba przemnożyć (mat3(worldcamera) * wierzchołek) żeby powstały współrzędna wierzchołka widziana przez światło?
glm::mat4 depthproj = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, 0.1f, 100.0f);
glm::vec3 playerpos = glm::vec3(World.Camera.Pos.x, World.Camera.Pos.y, World.Camera.Pos.z);
glm::vec3 shadoweye = playerpos - Global::daylight.direction * 50.0f;
Global::SetCameraPosition(Math3D::vector3(shadoweye));
glm::mat4 depthcam = glm::lookAt(shadoweye,
playerpos,
glm::vec3(0.0f, 1.0f, 0.0f));
m_camera.update_frustum(depthproj, depthcam);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(glm::value_ptr(depthproj));
glMatrixMode(GL_MODELVIEW);
glMultMatrixf(glm::value_ptr(glm::mat4(glm::mat3(depthcam))));
glm::mat4 perspective = glm::perspective(
glm::radians(Global::FieldOfView / Global::ZoomFactor),
std::max( 1.0f, (float)Global::ScreenWidth ) / std::max( 1.0f, (float)Global::ScreenHeight ),
0.1f * Global::ZoomFactor,
m_drawrange * Global::fDistanceFactor );
glm::dmat4 worldcamera;
World.Camera.SetMatrix( worldcamera );
m_camera.update_frustum( OpenGLMatrices.data( GL_PROJECTION ), worldcamera);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(glm::value_ptr(perspective));
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixd( glm::value_ptr( glm::dmat4( glm::dmat3(worldcamera))));
Próbowałem już różne kombinacje, m. in. tak, ale nie mogę trafić.
glm::vec3 transdiff = glm::vec3(worldcamera[3]) - glm::vec3(depthcam[3]);
glm::mat3 rotdiff = glm::mat3(worldcamera) * glm::mat3(depthcam);
glm::mat4 lv = depthproj * glm::translate(glm::mat4(rotdiff), transdiff);