CMCore/src/Math/Matrix4f.cpp

135 lines
3.1 KiB
C++
Raw Normal View History

#include<hgl/math/Matrix.h>
// Vulkan Cookbook
// ISBN: 9781786468154
// Packt Publishing Limited
2021-09-24 20:36:41 +08:00
// git: https://github.com/PacktPublishing/Vulkan-Cookbook.git
//
// Author: Pawel Lapinski
// LinkedIn: https://www.linkedin.com/in/pawel-lapinski-84522329
//
// Chapter: 10 Helper Recipes
// Recipe: 04 Preparing a perspective projection matrix
// Recipe: 05 Preparing an orthographic projection matrix
namespace hgl
{
Matrix4f ortho( float left,
float right,
float bottom,
float top,
float znear,
float zfar )
{
return Matrix4f(
2021-09-24 20:36:41 +08:00
2.0f / (right - left),
0.0f,
0.0f,
0.0f,
0.0f,
2.0f / (bottom - top),
0.0f,
0.0f,
0.0f,
0.0f,
1.0f / (znear - zfar),
0.0f,
-(right + left) / (right - left),
-(bottom + top) / (bottom - top),
znear / (znear - zfar),
1.0f
);
}
/**
*
* @param width
* @param height
* @param znear z值
* @param zfar z值
*/
Matrix4f ortho(float width,float height,float znear,float zfar)
2021-09-24 20:36:41 +08:00
{
return ortho(0.0f,width,height,0.0f,znear,zfar);
}
/**
*
* @param width
* @param height
*/
Matrix4f ortho(float width,float height)
2021-09-24 20:36:41 +08:00
{
return ortho(width,height,0.0f,1.0f);
}
/**
*
* @param aspect_ratio
* @param field_of_view
* @param znear
* @param zfar
*/
Matrix4f perspective( float field_of_view,
float aspect_ratio,
float znear,
float zfar)
{
2021-09-26 20:48:34 +08:00
float f = 1.0f / tan( hgl_deg2rad( 0.5f * field_of_view ) );
return Matrix4f(
2021-09-26 20:48:34 +08:00
f / aspect_ratio,
2021-09-24 20:36:41 +08:00
0.0f,
0.0f,
0.0f,
0.0f,
2021-09-26 20:48:34 +08:00
-f,
2021-09-24 20:36:41 +08:00
0.0f,
0.0f,
0.0f,
0.0f,
zfar / (znear - zfar),
-1.0f,
0.0f,
0.0f,
(znear * zfar) / (znear - zfar),
0.0f
);
}
Matrix4f lookat(const Vector4f &eye,const Vector4f &target,const Vector4f &up)
{
2021-09-26 20:48:34 +08:00
Vector4f forward=normalize(target-eye);
Vector4f right=normalize(cross(forward,up));
Vector4f nup=cross(right,forward);
2021-11-19 17:05:39 +08:00
return Matrix4f( right.x,
2021-09-24 20:36:41 +08:00
nup.x,
-forward.x,
0.0f,
2021-09-26 20:48:34 +08:00
right.y,
nup.y,
2021-09-24 20:36:41 +08:00
-forward.y,
2021-09-26 20:48:34 +08:00
0.0f,
2021-09-24 20:36:41 +08:00
2021-09-26 20:48:34 +08:00
right.z,
nup.z,
-forward.z/2.0f,
0.0f,
2021-09-24 20:36:41 +08:00
2021-09-26 20:48:34 +08:00
dot(eye,right ),
dot(eye,nup ),
dot(eye,forward),
2021-11-19 17:05:39 +08:00
1.0f
);
}
}//namespace hgl