glRotatef 旋转相机而不是物体
Posted
技术标签:
【中文标题】glRotatef 旋转相机而不是物体【英文标题】:glRotatef rotates the camera instead of the object 【发布时间】:2016-04-20 17:06:38 【问题描述】:我需要用 c++ 创建一个虚拟轨迹球。我已经进行了所有计算,并且可以找到旋转角度和轴值。每次鼠标拖动时,我的对象都会按照我的意图旋转,但问题是每次旋转后它都会回到初始位置。
所以我发现我需要获取当前的模型视图矩阵,将其乘以旋转矩阵,然后将结果加载回 opengl。
我已经尝试过了,但不幸的是,glRotatef 会旋转我的相机而不是对象。这是我绘制场景的函数
//--- Drawing code ---------------------------------------
/** Drawing code for one frame. */
void drawGLScene ()
// Real time in seconds.
GLfloat t = frameStat->frameStart( width, height );
// Clear the frame buffer and the depth buffer
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
// Set current model-view transform:
glLoadIdentity();
// Looking from "camera" to the "center" point (y-axis defines the "up" vector)
gluLookAt( 0.0f, 0.0f, 10.0f,
center[ 0 ], center[ 1 ], center[ 2 ],
0.0f, 1.0f, 0.0f );
if (dragging)
glLoadMatrixf(matModelView.array());
glScalef( zoom, zoom, zoom );
#ifdef USE_VBO
// scene rendering using VBO buffers:
scene.render();
#else
// client-side vertex arrays (cube):
glVertexPointer( 3, GL_FLOAT, 6 * sizeof(GLfloat), vert ); // specify vertex data array
glColorPointer( 3, GL_FLOAT, 6 * sizeof(GLfloat), vert + 3 ); // specify vertex color array
glDrawElements( GL_QUADS, sizeof(ind) / sizeof(GLubyte), GL_UNSIGNED_BYTE, ind );
#endif
frameStat->swapBuffers( drawStat ); // SDL_GL_SwapWindow() and frame statistics
//--- Event handling -------------------------------------
/** Function to release/destroy our resources and restore the old desktop. */
void Quit ( int returnCode )
scene.deleteBuffers();
if ( glcontext )
SDL_GL_DeleteContext( glcontext );
// Clean up the window ..
SDL_Quit();
// .. and exit appropriately
exit( returnCode );
这是我的鼠标处理函数,我不包括释放函数,因为它是微不足道的。
//--------------------------------------------------------
// Mouse handling:
void handleMouseMove ( SDL_Event &ev )
if ( ev.button.button == SDL_BUTTON_LEFT && dragging )
rotation.set(MI_IDENTITY);
rotation.rotate(5, 0.0f, 1.0f, 0.0f);
matModelView = matModelView * rotation;
void handleMousePress ( SDL_Event &ev )
if ( ev.button.button == SDL_BUTTON_LEFT )
dragging = true;
glMatrixMode(GL_MODELVIEW);
glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat *)matModelView.array());
rotation.set(MI_IDENTITY);
matModelView
和 rotation
是 4x4 矩阵。在这段代码中,我没有包括我的轨迹球计算。在这里,我只希望它通过 x 轴旋转 5 度,只要鼠标拖动。
也许它是如此简单,但我陷入了这一点。任何指导,代码示例都会很棒。
【问题讨论】:
【参考方案1】:尝试改变:
matModelView = matModelView * rotation;
到这里:
matModelView = rotation * matModelView;
【讨论】:
以上是关于glRotatef 旋转相机而不是物体的主要内容,如果未能解决你的问题,请参考以下文章