ULRE/src/SceneGraph/Camera.cpp

47 lines
1.5 KiB
C++
Raw Normal View History

2019-05-21 21:28:33 +08:00
#include<hgl/graph/Camera.h>
namespace hgl
{
namespace graph
{
inline Matrix4f LookAt(const Vector3f &eye,const Vector3f &target,const Vector3f &up)
{
Vector3f forward=target-eye;
normalize(forward);
Vector3f side=cross(forward,up);
normalize(side);
Vector3f nup=cross(side,forward);
Matrix4f result(side.x, side.y, side.z, 0.0f,
nup.x, nup.y, nup.z, 0.0f,
-forward.x, -forward.y, -forward.z, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
return result*translate(-eye);
}
2019-05-27 22:45:38 +08:00
void Camera::Refresh()
2019-05-21 21:28:33 +08:00
{
2019-05-27 22:45:38 +08:00
if(type==CameraType::Perspective)
matrix.projection=perspective(fov,width/height,znear,zfar);
2019-05-27 22:45:38 +08:00
else
matrix.projection=ortho(width,height,znear,zfar); //这个算的不对
2019-05-21 21:28:33 +08:00
matrix.modelview=hgl::graph::LookAt(eye,center,up_vector);
2019-05-21 21:28:33 +08:00
matrix.mvp=matrix.projection*matrix.modelview;
2019-05-29 21:56:53 +08:00
//注意: C++中要 projection * model_view * local_to_world * position
//而GLSL中要 position * local_to_world * model_view * projection
matrix.two_dim=ortho(width,height,znear,zfar);
2019-05-28 22:04:11 +08:00
2019-05-27 22:45:38 +08:00
frustum.SetVerticalFovAndAspectRatio(DegToRad(fov),width/height);
frustum.SetViewPlaneDistances(znear,zfar);
2019-05-21 21:28:33 +08:00
}
}//namespace graph
}//namespace hgl