作者prjryu (橘)
看板GameDesign
标题[程式] 转动问题
时间Sat May 16 05:06:16 2009
在写程式的过程我不断遇到对单一轴旋转另两轴跟着转的问题
也就是 glRotatef( angle, x,y,z ); 这个函数
转glRotatef( 90, 1,0,0 ); 後,y轴和z轴 也一起对x轴转了九十度
所以之後y z的转动就不是原本坐标轴的y和z了。
上次发问後有个人推荐我去看一篇为平衡环锁的文章
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/2000.html
以上为网址,照跑出来的的确是我想要的结果,但我看不太懂。
-------------------网页上的程式码--------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <GL/glut.h>
float mo[16];
void init_mo();
void update_mo( float angle, float x, float y, float z );
void display();
void keyboard( unsigned char key, int x, int y );
void main( int argc, char **argv )
{
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
glutInitWindowSize( 512, 512 );
glutCreateWindow( "gimbal_lock" );
glutDisplayFunc( display );
glutKeyboardFunc( keyboard );
init_mo();
glutMainLoop();
}
void display()
{
GLint viewport[4];
glGetIntegerv( GL_VIEWPORT, viewport );
glEnable( GL_DEPTH_TEST );
glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );
glClearColor( .1, .2, .3, 1 );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective( 45, double(viewport[2])/viewport[3], 0.1, 10 );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( 0,0,3, 0,0,0, 0,1,0 );
glMultMatrixf(mo);
glutSolidTeapot(.7);
glutSwapBuffers();
}
这是为什麽目的存在的? 怎麽用?
void init_mo()
{
memset( mo, 0, sizeof(mo) );
mo[0]=mo[5]=mo[10]=mo[15]=1;
glutPostRedisplay();
}
这个函数的作用? 为什麽这样写?
void update_mo( float angle, float x, float y, float z )
{
glPushMatrix();
glLoadIdentity();
glRotatef( angle, x,y,z );
glMultMatrixf(mo); //这行是做什麽?
glGetFloatv( GL_MODELVIEW_MATRIX, mo ); //这行是做什麽?
glPopMatrix();
glutPostRedisplay();
}
我知道push pop用来存取状态 但到底状态是什麽型态东西?
push pop实际的的使用方式我也还是不懂,希望善心人士讲解。
void keyboard( unsigned char key, int x, int y )
{
switch( key )
{
case 27:
init_mo();
break;
case '1':
update_mo( -5, 1,0,0 );
break;
case '2':
update_mo( 5, 1,0,0 );
break;
case '3':
update_mo( -5, 0,1,0 );
break;
case '4':
update_mo( 5, 0,1,0 );
break;
case '5':
update_mo( -5, 0,0,1 );
break;
case '6':
update_mo( 5, 0,0,1 );
break;
}
}
------------------------------------------------------
或是有什麽其他的解决方法也请多指教,
希望可以指教的详细一点,拜托大家了。
--
邮差又来送羊奶了
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.160.90.37
※ 编辑: prjryu 来自: 118.160.90.37 (05/16 05:08)
1F:推 Bencrie:init_mo是把mo这个矩阵初始化成Identity 05/16 08:52
2F:→ Bencrie:update_mo只是利用OpenGL算旋转矩阵并且存到mo 05/16 08:54
3F:→ Bencrie:glMultMatrix() 把目标矩阵跟现在的矩阵相乘 05/16 08:55
4F:→ Bencrie:glGetFloatv是从OpenGL状态机拿出某些float资料,程式中 05/16 08:56
5F:→ Bencrie:是取Modelview矩阵。 05/16 08:57
6F:→ Bencrie:push跟pop是堆叠的操作,在OpenGL里有所谓的矩阵堆叠, 05/16 08:58
7F:→ Bencrie:也就是说所有的存取单位是一个矩阵。如果你不知道堆叠是 05/16 08:59
8F:→ Bencrie:什麽,请翻阅你的资料结构课本。 05/16 08:59