GLFrame
原文链接:https://blog.csdn.net/fyyyr/article/details/79298664
GLFrame叫参考帧,其中存储了1个世界坐标点和2个世界坐标下的方向向量,也就是9个glFloat值,分别用来表示:当前位置点,向前方向向量,向上方向向量。
GLFrame可以表示世界坐标系中任意物体的位置与方向。无论是相机还是模型,都可以使用GLFrame来表示。对任意一个使用GLFrame来表示的物体而言,涉及到的坐标系有两个:永远不变的世界坐标系,针对于自身的物体坐标系(即绘图坐标系)。
class GLFrame
{
protected:
M3DVector3f vOrigin; // 当前所处的位置,默认是(0,0,0),处于原点
M3DVector3f vForward; // 即将要去的位置,默认是(0,0,-1),朝向-z轴方向
M3DVector3f vUp; // 朝向哪,默认是(0,1,0),朝向+y轴方向
public:
//默认构造函数(世界坐标系,位置在(0,0,0)点,up为(0,1,0)朝向+Y,forward为(0,0,-1)朝向-Z)
GLFrame(void)
//设置/获取世界坐标系下模型/相机的位置
inline void SetOrigin(const M3DVector3f vPoint)
inline void SetOrigin(float x, float y, float z)
inline void GetOrigin(M3DVector3f vPoint)
//获取世界坐标系下模型/相机位置的X/Y/Z分量
inline float GetOriginX(void)
inline float GetOriginY(void)
inline float GetOriginZ(void)
//设置/获取世界坐标系下模型/相机向前的方向向量
inline void SetForwardVector(const M3DVector3f vDirection)
inline void SetForwardVector(float x, float y, float z)
inline void GetForwardVector(M3DVector3f vVector)
//设置/获取世界坐标系下模型/相机向上的方向向量
inline void SetUpVector(const M3DVector3f vDirection)
inline void SetUpVector(float x, float y, float z)
inline void GetUpVector(M3DVector3f vVector)
//获取世界坐标系下模型/相机X/Y/Z轴方向向量
inline void GetZAxis(M3DVector3f vVector) { GetForwardVector(vVector); }
inline void GetYAxis(M3DVector3f vVector) { GetUpVector(vVector); }
inline void GetXAxis(M3DVector3f vVector) { m3dCrossProduct(vVector, vUp, vForward); }
// 以世界坐标系下(x,y,z)偏移量移动模型/相机
inline void TranslateWorld(float x, float y, float z)
// 以物体坐标系下(x,y,z)偏移量移动模型/相机
inline void TranslateLocal(float x, float y, float z)
// 沿物体坐标系下Z轴以指定偏移fDelta量移动模型/相机
inline void MoveForward(float fDelta)
// 沿物体坐标系下Y轴以指定偏移fDelta移动物体/相机
inline void MoveUp(float fDelta)
// 沿物体坐标系下X轴以指定偏移fDelta移动物体/相机
inline void MoveRight(float fDelta)
// 获取一个用于描述模型属性的4×4的矩阵
void GetMatrix(M3DMatrix44f matrix, bool bRotationOnly = false)
// 获取一个用于描述相机属性的4×4的矩阵
inline void GetCameraOrientation(M3DMatrix44f m)
// 应用所有的相机变换。该函数仅用于相机
inline void ApplyCameraTransform(bool bRotOnly = false)
// 应用所有的物体变换。该函数仅用于除相机外的物体
void ApplyActorTransform(bool bRotationOnly = false)
// 令物体/相机以自身位置为中心,绕X/Y/Z轴旋转。其角度以PI为单位
void RotateLocalX(float fAngle)
void RotateLocalY(float fAngle)
void RotateLocalZ(float fAngle)
// Reset axes to make sure they are orthonormal. This should be called on occasion
// if the matrix is long-lived and frequently transformed.
// 规范化
void Normalize(void)
// 模型/相机绕世界坐标系下的指定轴(x,y,z)旋转fAngle度
void RotateWorld(float fAngle, float x, float y, float z)
// 模型/相机绕当前物体坐标系下的指定轴(x,y,z)旋转fAngle度
void RotateLocal(float fAngle, float x, float y, float z)
// 将点/向量vLocal从当前物体坐标系转换为世界坐标系
void LocalToWorld(const M3DVector3f vLocal, M3DVector3f vWorld)
// 将点/向量vLocal从世界坐标系转换为当前物体坐标系
void WorldToLocal(const M3DVector3f vWorld, M3DVector3f vLocal)
// 通过当前frame矩阵将vPointSrc点变换为vPointDst点
void TransformPoint(M3DVector3f vPointSrc, M3DVector3f vPointDst)
//通过当前frame矩阵将vVectorSrc向量旋转为vVectorDst向量
void RotateVector(M3DVector3f vVectorSrc, M3DVector3f vVectorDst)
};
GLFrustum
GLFrustum是矩阵投影工具类
// 设置正矩阵投影
// xMin/xMax:x轴
// yMin/yMax:y轴
// zMin/zMax:z轴
void SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax)
//设置透视矩阵投影
//fFov:垂直方向上的视场角度
//fAspect:窗口的宽度与⾼度的纵横⽐
//fNear:近裁剪面距离
//fFar:远裁剪面距离
//纵横⽐ = 宽(w)/高(h)
void SetPerspective(float fFov, float fAspect, float fNear, float fFar)
//获取投影矩阵
const M3DMatrix44f& GetProjectionMatrix(void)
//变换矩阵投影
void Transform(GLFrame& Camera)
bool TestSphere(float x, float y, float z, float fRadius)
bool TestSphere(M3DVector3f vPoint, float fRadius)
GLMatrixStack
GLMatrixStack矩阵堆栈工具类
//在堆栈顶部载入一个单元矩阵
inline void LoadIdentity(void)
//在堆栈顶部载⼊任何矩阵 //参数:4*4矩阵
inline void LoadMatrix(const M3DMatrix44f mMatrix)
//矩阵乘以矩阵堆栈顶部矩阵,相乘结果存储到堆栈的顶部
inline void LoadMatrix(GLFrame& frame)
//
inline void MultMatrix(const M3DMatrix44f mMatrix)
inline void MultMatrix(GLFrame& frame)
//将当前矩阵压入堆栈(栈顶矩阵copy 一份到栈顶)
inline void PushMatrix(void)
//将M3DMatrix44f 矩阵对象压入当前矩阵堆栈
void PushMatrix(const M3DMatrix44f mMatrix)
//将GLFame 对象压入矩阵对象
void PushMatrix(GLFrame& frame)
//出栈(出栈指的是移除顶部的矩阵对象)
inline void PopMatrix(void)
//矩阵缩放
void Scale(GLfloat x, GLfloat y, GLfloat z)
void Scalev(const M3DVector3f vScale)
//矩阵平移
void Translate(GLfloat x, GLfloat y, GLfloat z)
void Translatev(const M3DVector3f vTranslate)
//矩阵旋转
void Rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
void Rotatev(GLfloat angle, M3DVector3f vAxis)
//获取矩阵堆栈顶部的值
const M3DMatrix44f& GetMatrix(void)
void GetMatrix(M3DMatrix44f mMatrix)
入栈,是为了 保存 当前的矩阵栈状态
出栈,是为了 恢复 入栈前的矩阵栈状态
矩阵栈过程如下:
GLGeometryTransform
GLGeometryTransform称为管线,用来管理模型视图投影矩阵堆栈(model-view-projection)简称MVP矩阵堆栈。
//设置模型视图矩阵堆栈
inline void SetModelViewMatrixStack(GLMatrixStack& mModelView)
//设置投影矩阵堆栈
inline void SetProjectionMatrixStack(GLMatrixStack& mProjection)
//设置模型视图投影矩阵堆栈
inline void SetMatrixStacks(GLMatrixStack& mModelView, GLMatrixStack& mProjection)
//获取模型视图投影矩阵堆栈
const M3DMatrix44f& GetModelViewProjectionMatrix(void)
//获取模型视图矩阵堆栈
inline const M3DMatrix44f& GetModelViewMatrix(void)
//获取投影矩阵堆栈
inline const M3DMatrix44f& GetProjectionMatrix(void)
网友评论