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;
}