我的任务是创建一个实现诸如简单移动和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)
camera :: update中的“transform”矩阵究竟代表什么? – 2009-06-10 19:31:46
据我所知,变换矩阵应该代表根据arcball类所需的球体旋转。因此,如果用户点击球体上的x,y,z上的一个点并将鼠标移动到x2,y2,z2,则矩阵将表示球体将x,y,z移动到x2,y2,z2所需的旋转。 希望是有道理的。 – 2009-06-10 19:44:21