OPENGL学习视频(九)

本文介绍了一种使用OpenGL和GLM库实现三维模型位置、旋转和缩放的方法,并展示了如何通过着色器更新这些变换来实时调整模型的位置和旋转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现三维移动模型:
添加类Transform
#include <glm/gtx/transform.hpp>
class Transform
{
   public :
       Transform(const glm::vec& pos =glm::vec3(),
        const glm::vec3&rot=glm::vec3(),
        const gm::vec4 &scale=glm::vec3(1.0f,1.0f,1.0f)
         {
            this->pos=pos;
            this->rot=rot;
            this->scale=scale;
         } );
      ~ Transform();

       inline glm::vec3*GetPos(){return &pos;}
       inline  glm::vec3*GetPos(){return &rot;   }
       inline  glm::vec3*GetScale(){return &scale;}

      inline void SetPos(glm::vec3&  pos) {this->pos=pos;}
      inline void SetRot(glm::vec3&  rot)   {this->rot=rot;}
      inline void  SetScale(glm::vec3& scale){this->scale=scale;}

      inline glm::mat4  GetModel()const
      {
           glm::mat4   posMat=glm::translate(pos);
           glm::mat4   scaleMat=glm::scale(scale);
           glm::mat4    rotX=glm::rotate(rot.x,glm::vec3(1.0,0.0,0.0));
           glm::mat4    rotY=glm::rotate(rot.y,glm::vec3(0.0,1.0,0.0));
          glm::mat4     rotZ=glm::rotate(rot.z,glm::vec3(0.0,0.0,1.0));
          glm::mat4    rotMat=rotX*rotY*rotZ;

         return posMat*scaleMat;
      }
      
   private:
       glm::vec3 pos;
       glm::vec3 rot;
       glm::vec3 scale;

}

修改着色basicShader.vs
uniform vec2 texCoord0;
void main()
{
   gl_Position=transform*vec4(position,1.0);
   texCoord0=texCoord;

}

在shader.h中创建枚举类型
enum{
    TRANSFORM_U,
    NUM_UNIFORM
};

GLuint m_uniforms[NUM_UNIFORM];
在shader.cpp中
m_uniforms[TRANSFORM_U]=glGetUniformLocation(m_program,"transform");//获取到着色器程序中uniform对应的值
添加函数void Update(const Transform&  transform);
实现函数void Update(const Transform & transform)//直接改变图形的绘制
{
   glm::mat4  model=transform.GetModel();
   glUniformMatrix4fv(m_uniforms[TRANSFORM_U],1,GL_FALSE,&model[0][0]);
}
通过着色漆把图形绘制出来
Transform transform;
float sinCounter=sinf(counter);
transform.GetPos()->x=sinCounter;
transform.GetRot()->z=counter*50;

shader.Update(transform);
counter+=0.01f;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值