首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL旋转矩阵与ArcBall

OpenGL旋转矩阵与ArcBall
EN

Stack Overflow用户
提问于 2009-06-10 19:21:36
回答 1查看 6.3K关注 0票数 2

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

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

下面是我的camera类中的一些代码,可以在上面进行分析:

代码语言:javascript
复制
// 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 (carl at carlsverre .com)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-10 20:09:59

好吧,也许我错了,但我认为发生在你身上的是你绕着坐标中心旋转,而不是围绕着行星旋转(这是你想要做的)。要纠正这一点,你需要做的是:

  • 将你想要旋转的点(行星的中心)平移到坐标的中心,在你这样做的时候应用其position
  • Rotate的负值的平移
  • 撤消之前所做的平移。

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

希望它能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/977629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档