opengl中3d图形的旋转,求解答!解决思路
opengl中3d图形的旋转,求解答!!!
问题还是没有解决,我想要实现导入的3d模型绕着屏幕的x轴(就是固定水平方向),y轴(固定的竖直方向)旋转,使用glLoadIdentity();重置模型观察矩阵,
glRotatef(Angel, 0.0f, 1.0f, 0.0f);
glRotatef(Alph, 1, 0, 0);
因为每次调用模型矩阵单位化了的,所以绕着y轴(也就是竖直方向没有问题),
但是由于y轴转动了,世界坐标系中的x轴也发生的相应的转动,在使用glRotatef就不是绕着屏幕的水平方向了,有没有什么方法解决啊?
------解决方案--------------------
你的问题是物体的自转的问题
而glRotatef是按照世界坐标来旋转,旋转效果是叠加的
办法两种
1 需要计算出来自身转轴在之前的旋转下新的位置, 对新的位置调用glRotatef
2 自己接管矩阵数学, 建立根据自转角度直接生成 旋转矩阵的算法
而后使用 glLoadMatrix 来直接使用
参考这个说明:http://blog.****.net/mysniper11/article/details/8766574
------解决方案--------------------
也许和你rotate角的设置有关
问题还是没有解决,我想要实现导入的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.****.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;