OpenGL旋转矩阵和ArcBall

时间:2009-06-10 19:21:36

标签: c++ qt opengl matrix rotation

我的任务是创建一个实现简单移动和Arcball界面等想法的OpenGL场景。我遇到的问题是处理NeHe的Arcball类(http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=48)计算的旋转矩阵。

到目前为止,我所拥有的是一个非常简单的太阳系(只有地球,月球和太阳),看起来很棒。我想要的是让相机跟随用户选择的任何行星(通过点击他们想要的那个),并使他们能够使用鼠标拖动(弧形球)以固定距离围绕行星旋转。正如我在开始时所说,NeHe的类正在生成基于鼠标单击和拖动的旋转矩阵。我想要应用矩阵的是相机位置。然而,当我这样做时,我的相机只是在没有绕行星旋转的情况下摆动。所以我猜我错过了一些步骤,或者我对我想要做的事情有一个可怕的理解。

以下是我的相机类中的一些代码:

// transform is the matrix from NeHe's arcball interface
void camera::update(Matrix4fT transform) {
    glm::mat4 transform_m = glm::mat4(0.0f);

    // convert nehe's matrices to GLM matrix
    for(int i=0; i < 4; i++)
        for(int j=0; j < 4; j++)
            transform_m[i][j] = transform.M[i*4+j];

    // apply matrix to the position
    glm::vec4 pos4 = glm::vec4(this->pos, 1.0f);
    pos4 = transform_m * pos4;

    this->pos = glm::vec3(pos4);
}

void camera::apply(planet *target) {
    // called at the beginning of GLPaint
    gluLookAt(this->pos.x,this->pos.y,this->pos.z,       // cam->position
              target->pos.x,target->pos.y,target->pos.z, // moving
              this->up.x,this->up.y,this->up.z);         // (0,1,0)
}

除此之外,NeHe的功能在正确的位置被调用(在点击和拖动期间)......所以真的,我不知道从哪里开始。我希望有人可以帮助我,如果你想看到整个代码库(用C ++编程并推入QTPanel),只需给我发一封电子邮件。

谢谢,

Carl Sverre(Carlsverre dot com的卡尔)

1 个答案:

答案 0 :(得分:2)

好吧,也许我错了,但我认为发生在你身上的是你在坐标中心而不是在地球周围旋转(这就是你想做的事情)。要纠正你必须做的事情:

  • 将要旋转的点(行星的中心)转换为坐标的中心,应用其位置否定的平移
  • 正在进行旋转
  • 撤消之前完成的翻译。

要理解的是旋转是围绕坐标中心进行的,如果你想在不同的地方旋转,你必须先将该点移动到坐标的中心。

希望它有所帮助。