opengl学习(五)一个机械臂程序,有关模型转换
2014-04-11 13:29
267 查看
最近这个内容让我很窝火啊,真是有点摸不到头脑,经过查资料,终于知道这其中的一些原理,由于我现在只是初步学习,有关矩阵变换的问题,我会在后面补充的,目前先稍微的说明,看了一个机械臂的程序,研究好一段时间终于知道模型变换中的这两个函数glTranslatef(),glRotatef()在执行的顺序上与实际是相反的。
参看http://www.cnblogs.com/yujunyong/archive/2011/04/17/2018776.html,这里面讲述了顺序的问题
看一下这个机械臂的程序中有关这两个函数的应用
[cpp] view plaincopy
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glColor3f(0.0, 1.0, 1.0);
glTranslatef (-0.5, 0.0, 0.0);
glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
auxSolidBox(2.0, 0.3, 0.5);
这两个操作是画两个正方体,并且旋转方式都是按Z轴逆时针旋转,按照上面所阐述的内容,首先是先移动坐标轴,然后在绕Z旋转操作,先移动后旋转,物体旋转时是以(0.0f,0.0f,0.0f)这个点绕Z轴逆时针旋转的(旋转是右手坐标系),然后再调用glTranslatef(-0.5,0.0,0.0),这个操作实际上是改变了原点,也就是再旋转时是以原坐标经(-0.5,0.0,0.0)变换后的那个点绕Z轴旋转的,然后绘制立方体
下一步是画第2个立方体,我设置成蓝色的以便好观察
代码如下
[cpp] view plaincopy
glColor3f(0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
auxSolidBox(1.6, 0.2, 0.5);
同样的操作,是先移动后旋转,然后改变原点的位置,使其旋转。
效果如下
全部代码如下
[cpp] view plaincopy
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#pragma comment(lib,"openGL32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")
void myinit(void);
void drawPlane(void);
void CALLBACK elbowAdd (void);
void CALLBACK elbowSubtract (void);
void CALLBACK shoulderAdd (void);
void CALLBACK shoulderSubtract (void);
void CALLBACK fingerAdd (void);
void CALLBACK fingerSubtract(void);
void CALLBACK finger1Add (void);
void CALLBACK finger1Subtract(void);
void CALLBACK finger2Add (void);
void CALLBACK finger2Subtract(void);
void CALLBACK finger3Add (void);
void CALLBACK finger3Subtract(void);
void CALLBACK finger4Add (void);
void CALLBACK finger4Subtract(void);
void CALLBACK finger5Add (void);
void CALLBACK finger5Subtract(void);
void CALLBACK finger6Add (void);
void CALLBACK finger6Subtract(void);
void CALLBACK display(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
static int shoulder = 0, elbow = 0,finger = 0,finger1=0,finger2=0,finger3=0,finger4=0,finger5=0,finger6=0;
void CALLBACK elbowAdd (void)
{elbow = (elbow + 5) % 360;}
void CALLBACK elbowSubtract (void)
{elbow = (elbow - 5) % 360;}
void CALLBACK shoulderAdd (void)
{ shoulder = (shoulder + 5) % 360;}
void CALLBACK shoulderSubtract (void)
{ shoulder = (shoulder - 5) % 360;}
void CALLBACK fingerAdd (void)
{ finger = (finger + 5) % 360;}
void CALLBACK fingerSubtract(void)
{ finger = (finger - 5) % 360;}
void CALLBACK finger1Add (void)
{ finger1 = (finger1 + 5) % 360;}
void CALLBACK finger1Subtract(void)
{ finger1 = (finger1 - 5) % 360;}
void CALLBACK finger2Add (void)
{ finger2 = (finger2 + 5) % 360;}
void CALLBACK finger2Subtract(void)
{ finger2 = (finger2 - 5) % 360;}
void CALLBACK finger3Add (void)
{ finger3 = (finger3 + 5) % 360;}
void CALLBACK finger3Subtract(void)
{finger3 = (finger3 - 5) % 360;}
void CALLBACK finger4Add (void)
{ finger4 = (finger4 + 5) % 360;}
void CALLBACK finger4Subtract(void)
{finger4 = (finger4 - 5) % 360;}
void CALLBACK finger5Add (void)
{ finger5 = (finger5 + 5) % 360;}
void CALLBACK finger5Subtract(void)
{ finger5 = (finger5 - 5) % 360;}
void CALLBACK finger6Add (void)
{ finger6 = (finger6 + 5) % 360;}
void CALLBACK finger6Subtract(void)
{ finger6 = (finger6 - 5) % 360;}
void CALLBACK display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glColor3f(0.0, 1.0, 1.0);
glTranslatef (-0.5, 0.0, 0.0);
glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
auxSolidBox(2.0, 0.3, 0.5);
glColor3f(0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
auxSolidBox(1.6, 0.2, 0.5);
glPushMatrix();
glColor3f(0.0, 1.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
glRotatef ((GLfloat) finger, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.1);
auxWireBox(0.5, 0.1, 0.2);
glColor3f(0.0, 1.0, 1.0);
glTranslatef (0.2, 0.0, 0.0);
glRotatef ((GLfloat) finger1, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.0);
auxWireBox(0.4, 0.1, 0.2);
glPopMatrix();
glPushMatrix();
glColor3f(0.0, 1.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
glRotatef ((GLfloat) finger2, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.1);
auxWireBox(0.5, 0.1, 0.2);
glColor3f(0.0, 1.0, 1.0);
glTranslatef (0.2, 0.0, 0.0);
glRotatef ((GLfloat) finger3, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.0);
auxWireBox(0.4, 0.1, 0.2);
glPopMatrix();
glPushMatrix();
glColor3f(0.0, 1.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
glRotatef ((GLfloat) finger4, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.1);
auxWireBox(0.5, 0.1, 0.2);
glColor3f(0.0, 1.0, 1.0);
glTranslatef (0.2, 0.0, 0.0);
glRotatef ((GLfloat) finger5, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.0);
auxWireBox(0.4, 0.1, 0.2);
glPopMatrix();
glPushMatrix();
glColor3f(0.0, 0.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
glRotatef ((GLfloat) finger6, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.1);
auxWireBox(0.7, 0.1, 0.2);
glPopMatrix();
glPopMatrix();
glFlush();
}
void myinit (void)
{
glShadeModel (GL_FLAT);
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0, 0.0, -5.0); /* viewing transform */
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
auxInitPosition (0, 0, 400, 400);
auxInitWindow ("Composite Modeling Transformations");
myinit ();
auxKeyFunc (AUX_LEFT, shoulderSubtract);
auxKeyFunc (AUX_RIGHT, shoulderAdd);
auxKeyFunc (AUX_UP, elbowAdd);
auxKeyFunc (AUX_DOWN, elbowSubtract);
auxKeyFunc (AUX_w, fingerAdd);
auxKeyFunc (AUX_s, fingerSubtract);
auxKeyFunc (AUX_a, finger1Add);
auxKeyFunc (AUX_d, finger1Subtract);
auxKeyFunc (AUX_0, finger2Add);
auxKeyFunc (AUX_1, finger2Subtract);
auxKeyFunc (AUX_2, finger3Add);
auxKeyFunc (AUX_3, finger3Subtract);
auxKeyFunc (AUX_4, finger4Add);
auxKeyFunc (AUX_5, finger4Subtract);
auxKeyFunc (AUX_6, finger5Add);
auxKeyFunc (AUX_7, finger5Subtract);
auxKeyFunc (AUX_8, finger6Add);
auxKeyFunc (AUX_9, finger6Subtract);
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
参看http://www.cnblogs.com/yujunyong/archive/2011/04/17/2018776.html,这里面讲述了顺序的问题
看一下这个机械臂的程序中有关这两个函数的应用
[cpp] view plaincopy
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glColor3f(0.0, 1.0, 1.0);
glTranslatef (-0.5, 0.0, 0.0);
glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
auxSolidBox(2.0, 0.3, 0.5);
这两个操作是画两个正方体,并且旋转方式都是按Z轴逆时针旋转,按照上面所阐述的内容,首先是先移动坐标轴,然后在绕Z旋转操作,先移动后旋转,物体旋转时是以(0.0f,0.0f,0.0f)这个点绕Z轴逆时针旋转的(旋转是右手坐标系),然后再调用glTranslatef(-0.5,0.0,0.0),这个操作实际上是改变了原点,也就是再旋转时是以原坐标经(-0.5,0.0,0.0)变换后的那个点绕Z轴旋转的,然后绘制立方体
下一步是画第2个立方体,我设置成蓝色的以便好观察
代码如下
[cpp] view plaincopy
glColor3f(0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
auxSolidBox(1.6, 0.2, 0.5);
同样的操作,是先移动后旋转,然后改变原点的位置,使其旋转。
效果如下
全部代码如下
[cpp] view plaincopy
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#pragma comment(lib,"openGL32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")
void myinit(void);
void drawPlane(void);
void CALLBACK elbowAdd (void);
void CALLBACK elbowSubtract (void);
void CALLBACK shoulderAdd (void);
void CALLBACK shoulderSubtract (void);
void CALLBACK fingerAdd (void);
void CALLBACK fingerSubtract(void);
void CALLBACK finger1Add (void);
void CALLBACK finger1Subtract(void);
void CALLBACK finger2Add (void);
void CALLBACK finger2Subtract(void);
void CALLBACK finger3Add (void);
void CALLBACK finger3Subtract(void);
void CALLBACK finger4Add (void);
void CALLBACK finger4Subtract(void);
void CALLBACK finger5Add (void);
void CALLBACK finger5Subtract(void);
void CALLBACK finger6Add (void);
void CALLBACK finger6Subtract(void);
void CALLBACK display(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
static int shoulder = 0, elbow = 0,finger = 0,finger1=0,finger2=0,finger3=0,finger4=0,finger5=0,finger6=0;
void CALLBACK elbowAdd (void)
{elbow = (elbow + 5) % 360;}
void CALLBACK elbowSubtract (void)
{elbow = (elbow - 5) % 360;}
void CALLBACK shoulderAdd (void)
{ shoulder = (shoulder + 5) % 360;}
void CALLBACK shoulderSubtract (void)
{ shoulder = (shoulder - 5) % 360;}
void CALLBACK fingerAdd (void)
{ finger = (finger + 5) % 360;}
void CALLBACK fingerSubtract(void)
{ finger = (finger - 5) % 360;}
void CALLBACK finger1Add (void)
{ finger1 = (finger1 + 5) % 360;}
void CALLBACK finger1Subtract(void)
{ finger1 = (finger1 - 5) % 360;}
void CALLBACK finger2Add (void)
{ finger2 = (finger2 + 5) % 360;}
void CALLBACK finger2Subtract(void)
{ finger2 = (finger2 - 5) % 360;}
void CALLBACK finger3Add (void)
{ finger3 = (finger3 + 5) % 360;}
void CALLBACK finger3Subtract(void)
{finger3 = (finger3 - 5) % 360;}
void CALLBACK finger4Add (void)
{ finger4 = (finger4 + 5) % 360;}
void CALLBACK finger4Subtract(void)
{finger4 = (finger4 - 5) % 360;}
void CALLBACK finger5Add (void)
{ finger5 = (finger5 + 5) % 360;}
void CALLBACK finger5Subtract(void)
{ finger5 = (finger5 - 5) % 360;}
void CALLBACK finger6Add (void)
{ finger6 = (finger6 + 5) % 360;}
void CALLBACK finger6Subtract(void)
{ finger6 = (finger6 - 5) % 360;}
void CALLBACK display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glColor3f(0.0, 1.0, 1.0);
glTranslatef (-0.5, 0.0, 0.0);
glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
auxSolidBox(2.0, 0.3, 0.5);
glColor3f(0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
auxSolidBox(1.6, 0.2, 0.5);
glPushMatrix();
glColor3f(0.0, 1.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
glRotatef ((GLfloat) finger, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.1);
auxWireBox(0.5, 0.1, 0.2);
glColor3f(0.0, 1.0, 1.0);
glTranslatef (0.2, 0.0, 0.0);
glRotatef ((GLfloat) finger1, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.0);
auxWireBox(0.4, 0.1, 0.2);
glPopMatrix();
glPushMatrix();
glColor3f(0.0, 1.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
glRotatef ((GLfloat) finger2, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.1);
auxWireBox(0.5, 0.1, 0.2);
glColor3f(0.0, 1.0, 1.0);
glTranslatef (0.2, 0.0, 0.0);
glRotatef ((GLfloat) finger3, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.0);
auxWireBox(0.4, 0.1, 0.2);
glPopMatrix();
glPushMatrix();
glColor3f(0.0, 1.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
glRotatef ((GLfloat) finger4, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.1);
auxWireBox(0.5, 0.1, 0.2);
glColor3f(0.0, 1.0, 1.0);
glTranslatef (0.2, 0.0, 0.0);
glRotatef ((GLfloat) finger5, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.0);
auxWireBox(0.4, 0.1, 0.2);
glPopMatrix();
glPushMatrix();
glColor3f(0.0, 0.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
glRotatef ((GLfloat) finger6, 0.0, 0.0, 1.0);
glTranslatef (0.295, 0.0, 0.1);
auxWireBox(0.7, 0.1, 0.2);
glPopMatrix();
glPopMatrix();
glFlush();
}
void myinit (void)
{
glShadeModel (GL_FLAT);
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0, 0.0, -5.0); /* viewing transform */
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
auxInitPosition (0, 0, 400, 400);
auxInitWindow ("Composite Modeling Transformations");
myinit ();
auxKeyFunc (AUX_LEFT, shoulderSubtract);
auxKeyFunc (AUX_RIGHT, shoulderAdd);
auxKeyFunc (AUX_UP, elbowAdd);
auxKeyFunc (AUX_DOWN, elbowSubtract);
auxKeyFunc (AUX_w, fingerAdd);
auxKeyFunc (AUX_s, fingerSubtract);
auxKeyFunc (AUX_a, finger1Add);
auxKeyFunc (AUX_d, finger1Subtract);
auxKeyFunc (AUX_0, finger2Add);
auxKeyFunc (AUX_1, finger2Subtract);
auxKeyFunc (AUX_2, finger3Add);
auxKeyFunc (AUX_3, finger3Subtract);
auxKeyFunc (AUX_4, finger4Add);
auxKeyFunc (AUX_5, finger4Subtract);
auxKeyFunc (AUX_6, finger5Add);
auxKeyFunc (AUX_7, finger5Subtract);
auxKeyFunc (AUX_8, finger6Add);
auxKeyFunc (AUX_9, finger6Subtract);
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
相关文章推荐
- opengl学习(五)一个机械臂程序,有关模型转换
- OpenGL编程学习之《一个简单的OpenGL程序》
- OpenGL学习程序,创建一个3D的三角椎体和正方体并旋转
- 微信小程序,学习笔记(二)样式(WXSS)及一个简单的小测试用例
- 推荐一个.net下学习水晶报表的好程序兼ms sql server的好助手
- 由一个进制转换程序想到数据在计算机内的存储
- OPENGL 变换_视图模型变换与部分透视变换_学习笔记
- python编写一个计算小程序-学习笔记8
- 网络编程:以一个聊天程序结束这个学习。
- 一个关于c++数值转换的小程序的思考
- 【学习笔记】程序设计导引及在线实践 数值转换问题
- 答读者问(16):一个研二学生有关论文和学习的相关疑问
- ACE学习笔记 ----- 一个简单的网页链接提取程序
- 菜鸟的 PHP 学习之路(三):一个简单的连接数据库并查询的小程序(1)
- OpenGL学习--07--模型加载(obj)
- 发布这几天学习Hook搞出来的一个挺好玩的统计鼠标移动距离和键盘敲击次数的小程序
- iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序
- Android学习一(新建一个Android程序)
- OpenGL(一)二维图形的绘制:一个简单的绘制矩形程序
- Qt下学习OpenGL之OBJ模型