OpenGL进阶(二)自定义矩阵加载
来源:互联网 发布:jq signature.js 编辑:程序博客网 时间:2024/05/12 07:33
opengl里面的平移,旋转,缩放都是基于矩阵的运算,我们可以很方便地通过设定参数的方式调用一些接口函数来实现,同时我们也可以通过自定义的矩阵来实现上述的基本变换。
首先来看一个渲染程序。
- GLfloat rtri;
- GLfloat posX;
- GLfloat posY;
- GLfloat scale=0.5f;
- void renderGL()
- {
- // Clear the color and depth buffers.
- glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
- // We don't want to modify the projection matrix. */
- glMatrixMode( GL_MODELVIEW );
- glLoadIdentity( );
- glTranslatef(posX,0.0f,-6.0f);
- glRotatef(rtri,0.0f,1.0f,0.0f);
- glScalef(scale,scale,scale);
- glBegin(GL_TRIANGLES);
- glColor3f(1.0f,0.0f,0.0f);
- glVertex3f( 0.0f, 1.0f, 0.0f);
- glColor3f(0.0f,1.0f,0.0f);
- glVertex3f(-1.0f,-1.0f, 0.0f);
- glColor3f(0.0f,0.0f,1.0f);
- glVertex3f( 1.0f,-1.0f, 0.0f);
- glEnd();
- if(posX<3.0f) posX+=0.001f;
- else posX=-3.0f;
- if(scale<2.0f) scale+=0.0005f;
- else scale=0.5f;
- rtri+=0.2f;
- SDL_GL_SwapBuffers( );
- }
程序很简单,运行的结果就是一个不断旋转+缩放+平移的三角形。
所谓的变换就是于矩阵相乘,下面来看看不同的变换所对应的是什么样的矩阵。
平移变换:
P=[
1,0,0,0,
0,1,0,0,
0,0,1,0,
posX,posY,posZ,1
]
旋转变换(以Y轴为例,a为旋转角度)
Y=[
cos(a),0,-sin(a),0,
0,1,0,0,
sin(a),0,cos(a),0,
0,0,0,1
]
比例变换
S=[
qx,0,0,0,
0,qy,0,0,
0,0,qz,0,
0,0,0,1
]
对于矩阵运算不了解的可以参考《计算机图形》或者DirectX的龙书。
在OpenGL中关于使用自定义矩阵的函数有两个glLoadMatrixf(m)和glMultMatrixf(m).
前者是加载一个矩阵,后者则是将m与当前矩阵相乘。
下面是使用自定义矩阵的程序。
- void renderGL()
- {
- GLfloat moveMatrix[]=
- {1.0f, 0.0f, 0.0f,0.0f,
- 0.0f,1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- posX, 0.0f, -6.0f, 1.0f};
- GLfloat scaleMatrix[]=
- {
- scale, 0.0f, 0.0f,0.0f,
- 0.0f,scale, 0.0f, 0.0f,
- 0.0f, 0.0f, scale, 0.0f,
- 0.0, 0.0f, 0.0f, 1.0f
- };
- GLfloat rotateYMatrix[]=
- {
- cos(rtri),0.0f,-sin(rtri),0.0f,
- 0.0f,1.0f,0.0f,0.0f,
- sin(rtri),0.0f,cos(rtri),0.0f,
- 0.0f,0.0f,0.0f,1.0f
- };
- // Clear the color and depth buffers.
- glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
- // We don't want to modify the projection matrix. */
- glMatrixMode( GL_MODELVIEW );
- glLoadIdentity();
- glMultMatrixf(moveMatrix);
- glMultMatrixf(scaleMatrix);
- glMultMatrixf(rotateYMatrix);
- glBegin(GL_TRIANGLES);
- glColor3f(1.0f,0.0f,0.0f);
- glVertex3f( 0.0f, 1.0f, 0.0f);
- glColor3f(0.0f,1.0f,0.0f);
- glVertex3f(-1.0f,-1.0f, 0.0f);
- glColor3f(0.0f,0.0f,1.0f);
- glVertex3f( 1.0f,-1.0f, 0.0f);
- glEnd();
- if(posX<3.0f) posX+=0.001f;
- else posX=-3.0f;
- if(scale<2.0f) scale+=0.0005f;
- else scale=0.5f;
- rtri+=0.002f;
- SDL_GL_SwapBuffers( );
- }
得到的效果和前面的程序完全相同。
- OpenGL进阶(二)自定义矩阵加载
- OpenGL进阶(二) - 自定义矩阵加载
- OpenGL(二)加载模型
- openGL 自定义矩阵
- 数据结构进阶(二)矩阵(稀疏矩阵)的压缩存储
- PullToRefreshListView进阶(二)----->上拉加载
- OpenGL中的变换矩阵及自定义矩阵
- Android自定义View(二)进阶
- Android进阶之自定义view(二)
- 【Android进阶之自定义View(二)】
- Android开发,自定义View(二)-----进阶
- OpenGL进阶(二)样条曲线的绘制
- openGL ES进阶教程(二)之全景图片
- OpenGL实验(二)桌子的坐标系变换 矩阵 视图
- OpenGL进阶(二十一) - 文字渲染
- Android 自定义View (二) 进阶
- Android 自定义View (二) 进阶
- Android 自定义View (二) 进阶
- ubuntu中RAR解压缩中文文件名失败的解决方法
- android 实现拍照
- 别的程序员是怎么读你的简历的
- TFTP 服务器配置
- C# 特性(Attribute)
- OpenGL进阶(二)自定义矩阵加载
- VBA Password Bypasser1.5[英文]+1.2[中文][破解版]
- private_data 是有数据 驱动
- 这样去写你的 HTML
- vim tab键自动补全
- Pointcut
- 使用Unicode(宽字节字符集)以及_T与L
- sharepoint 2010 如何使用sharepoint多媒体视频播放media webpart功能
- OpenGL进阶(二)样条曲线的绘制