gpt4 book ai didi

c++ - OpenGL 旋转矩阵和 ArcBall

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:31 33 4
gpt4 key购买 nike

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

到目前为止,我拥有的是一个非常简单的太阳系(只有地球、月球和太阳),看起来很棒。我想要的是让相机跟随用户选择的任何行星(通过单击他们想要的行星),并让他们能够使用鼠标拖动(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)
}

除此之外,NeHe 的函数会在正确的位置调用(在单击和拖动期间)...所以真的,我不知道从这里去哪里。我希望有人能帮我解决这个问题,如果您想查看整个代码库(用 C++ 编写并推送到 QTPanel 中),请给我发送电子邮件。

谢谢,

Carl Sverre(carl at carlsverre dot com)

最佳答案

好吧,也许我错了,但我认为发生在你身上的是你正在围绕坐标中心而不是围绕地球旋转(这是你想要做的)。要更正您要做的是:

  • 将要旋转的点(行星中心)平移到坐标中心,应用对其位置取反的平移
  • 边做边旋转
  • 撤销之前完成的翻译。

需要理解的是,旋转是围绕坐标中心进行的,如果你想绕着不同的地方旋转,你必须先把那个点移到坐标中心。

希望对你有帮助。

关于c++ - OpenGL 旋转矩阵和 ArcBall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/977629/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com