glRotatef旋转相机而不是物体

时间:2016-04-20 17:06:38

标签: c++ opengl rotation sdl-2

我需要用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);
  }
}

matModelViewrotation是4x4矩阵。在这段代码中,我不包括我的轨迹球计算。在这里,只要鼠标拖动,我只希望它在x轴上旋转5度。

也许这很简单但是我被困在这一点上。任何指导,代码样本都会很棒。

1 个答案:

答案 0 :(得分:0)

尝试更改:

matModelView = matModelView * rotation;

对此:

matModelView = rotation * matModelView;