2009-06-10 223 views
2

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

我有什么到目前为止是一个非常简单的太阳系(只是地球,月亮和太阳)看起来很大。我想要的是让相机跟随用户选择的行星(通过点击他们想要的行星),并使他们能够使用鼠标拖动(arcball)以固定距离围绕行星旋转。正如我在开始时所说的,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) 
} 

除此之外,讷河的函数被调用在正确的地方(点击并拖动期间)......所以真的,我没有想法从哪里去。我希望有人能够帮助我,如果你想看到整个代码库(用C++编写并推入QTPanel),只需发一封电子邮件给我。

感谢,

卡尔·斯维尔(卡尔在carlsverre点com)

+0

camera :: update中的“transform”矩阵究竟代表什么? – 2009-06-10 19:31:46

+0

据我所知,变换矩阵应该代表根据arcball类所需的球体旋转。因此,如果用户点击球体上的x,y,z上的一个点并将鼠标移动到x2,y2,z2,则矩阵将表示球体将x,y,z移动到x2,y2,z2所需的旋转。 希望是有道理的。 – 2009-06-10 19:44:21

回答

2

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

  • 翻译要绕(地球的中心)中心坐标点,将其位置的否定的翻译
  • 旋转正如你所做的那样
  • 撤销之前完成的翻译。

需要理解的是,旋转是在坐标中心附近完成的,如果要在某个地方旋转,必须先将该点移动到坐标中心。

希望它有帮助。