【发布时间】:2010-10-01 02:34:01
【问题描述】:
我正在 OpenGL 中绘制一个对象(例如,一个立方体),用户可以通过在窗口上单击/拖动鼠标来旋转该对象。立方体是这样绘制的:
void CubeDrawingArea::redraw()
{
Glib::RefPtr gl_drawable = get_gl_drawable();
gl_drawable->gl_begin(get_gl_context());
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
{
glRotated(m_angle, m_rotAxis.x, m_rotAxis.y, m_rotAxis.z);
glCallList(m_cubeID);
}
glPopMatrix();
gl_drawable->swap_buffers();
gl_drawable->gl_end();
}
并用这个函数旋转:
bool CubeDrawingArea::on_motion_notify_event(GdkEventMotion* motion)
{
if (!m_leftButtonDown)
return true;
_3V cur_pos;
get_trackball_point((int) motion->x, (int) motion->y, cur_pos);
const double dx = cur_pos.x - m_lastTrackPoint.x;
const double dy = cur_pos.y - m_lastTrackPoint.y;
const double dz = cur_pos.z - m_lastTrackPoint.z;
if (dx || dy || dz)
{
// Update angle, axis of rotation, and redraw
m_angle = 90.0 * sqrt((dx * dx) + (dy * dy) + (dz * dz));
// Axis of rotation comes from cross product of last / cur vectors
m_rotAxis.x = (m_lastTrackPoint.y * cur_pos.z) - (m_lastTrackPoint.z * cur_pos.y);
m_rotAxis.y = (m_lastTrackPoint.z * cur_pos.x) - (m_lastTrackPoint.x * cur_pos.z);
m_rotAxis.z = (m_lastTrackPoint.x * cur_pos.y) - (m_lastTrackPoint.y * cur_pos.x);
redraw();
}
return true;
}
里面有一些 GTK+ 的东西,但它的用途应该很明显。 get_trackball_point() 函数将窗口坐标 X Y 投影到一个半球(虚拟“轨迹球”)上,该半球用作旋转对象的参考点。无论如何,这或多或少是有效的,但是在我完成旋转后,我再次旋转时,立方体会迅速回到原来的位置,很明显,因为下次我旋转时 m_angle 将重置回接近 0。有没有办法避免这种情况并保持轮换?
【问题讨论】:
标签: opengl