首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

opengl中3d图形的旋转,求解答!解决思路

2013-06-26 
opengl中3d图形的旋转,求解答!!!问题还是没有解决,我想要实现导入的3d模型绕着屏幕的x轴(就是固定水平方向

opengl中3d图形的旋转,求解答!!!
问题还是没有解决,我想要实现导入的3d模型绕着屏幕的x轴(就是固定水平方向),y轴(固定的竖直方向)旋转,使用glLoadIdentity();重置模型观察矩阵,
glRotatef(Angel, 0.0f, 1.0f, 0.0f);
glRotatef(Alph, 1, 0, 0);
因为每次调用模型矩阵单位化了的,所以绕着y轴(也就是竖直方向没有问题),
但是由于y轴转动了,世界坐标系中的x轴也发生的相应的转动,在使用glRotatef就不是绕着屏幕的水平方向了,有没有什么方法解决啊? OpenGL 图形 旋转
[解决办法]
你的问题是物体的自转的问题

而glRotatef是按照世界坐标来旋转,旋转效果是叠加的

办法两种
1  需要计算出来自身转轴在之前的旋转下新的位置, 对新的位置调用glRotatef 
2  自己接管矩阵数学, 建立根据自转角度直接生成 旋转矩阵的算法
  而后使用 glLoadMatrix 来直接使用 
参考这个说明:http://blog.csdn.net/mysniper11/article/details/8766574

[解决办法]
也许和你rotate角的设置有关

#define GOOD_ROTATE

#include <GL\glut.h>   
void init(void)   
{   
    GLfloat light_position [] = { 1.0, 1.0, 1.0, 0.0 };   
    GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };  
    GLfloat mat_shininess[] = { 50.0 };  
    glClearColor ( 0.0, 0.0, 1.0, 0.0 );
    glShadeModel ( GL_SMOOTH );   
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
    glLightfv ( GL_LIGHT0, GL_POSITION, light_position);   
    glEnable (GL_LIGHTING);   
    glEnable (GL_LIGHT0);   
    glEnable (GL_DEPTH_TEST);   
}   
float xRot = 0.0f;
float yRot = 0.0f;
void rotate()
{
    glMatrixMode(GL_MODELVIEW);
#ifdef GOOD_ROTATE
    glLoadIdentity();
#endif
    glTranslatef(0,0,0);
    glRotatef(xRot,1.0f,0.0f,0.0f);
    glRotatef(yRot,0.0f,1.0f,0.0f);
}
void display ( void )   
{   
    glClear (GL_COLOR_BUFFER_BIT 
[解决办法]
 GL_DEPTH_BUFFER_BIT);   
    rotate();
    glutSolidSphere (1.0, 4, 5);
    glFlush ();   
}   
int x_from, y_from, x_to, y_to;
int mouse_down[3];
void motion(GLint x, GLint y)
{
    x_to = x;
    y_to = y;
    if(mouse_down[0])
    {
        float xVec = (x_to - x_from) / 5.f;
        float yVec = (y_to - y_from) / 5.f;


#ifdef GOOD_ROTATE
        xRot += yVec;
        yRot += xVec;
#else
        xRot = yVec;
        yRot = xVec;
#endif
        glutPostRedisplay();
    }
    x_from = x;
    y_from = y;  
}
void mouse(int button, int state, int x, int y)
{
    x_from = x_to = x;
    y_from = y_to = y;
    mouse_down[button] = state==GLUT_DOWN;
}
void keyboard(unsigned char key, int x, int y )
{
    if(key == 'q') exit(0);
}
void reshape (int w, int h)   
{   
    glViewport (0, 0, (GLsizei) w, (GLsizei) h);   
    glMatrixMode (GL_PROJECTION);   
    glLoadIdentity ( );   
    if (w <= h)   
        glOrtho (-1.5, 1.5, -1.5 * ( GLfloat ) h / ( GLfloat ) w, 
        1.5* ( GLfloat ) h / ( GLfloat ) w, -10.0, 10.0 );
    else   
        glOrtho (-1.5 * ( GLfloat ) w / ( GLfloat ) h,1.5 * ( GLfloat )   
        w/( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);   
    glMatrixMode ( GL_MODELVIEW );   
    glLoadIdentity ( ) ;   
}   
int main(int argc, char** argv)   
{   
    glutInit (&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE 
[解决办法]
GLUT_RGB 
[解决办法]
GLUT_DEPTH);
    glutInitWindowSize (800, 800);
    glutInitWindowPosition (100, 100);
    glutCreateWindow (argv[0]);
    init();  
    glutDisplayFunc ( display );
    glutReshapeFunc ( reshape );
    glutMotionFunc(motion);
    glutMouseFunc(mouse);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
    return 0;   
}   

热点排行