美文网首页
五.OpenGL工具类GLFrame GLFrustum GLM

五.OpenGL工具类GLFrame GLFrustum GLM

作者: 凯歌948 | 来源:发表于2020-07-11 23:47 被阅读0次

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)

入栈,是为了 保存 当前的矩阵栈状态
出栈,是为了 恢复 入栈前的矩阵栈状态
矩阵栈过程如下:

image1.png

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)

相关文章

网友评论

      本文标题:五.OpenGL工具类GLFrame GLFrustum GLM

      本文链接:https://www.haomeiwen.com/subject/tohwcktx.html