我的opengl程序中有一个“相机”,我最近完成了。但是,我注意到每当我旋转然后再移动时,x,y和z角度就会改变。例如,当我按下“w”键时,我沿着“z”轴向前移动。如果我然后将相机旋转90度,当我按下“W”键时,我实际上将向右移动,看似沿着“x”轴。这是有道理的,为什么会发生这种情况,我只是想知道为什么会发生这种情况。这是旋转功能:
private void camera() {
glRotatef(xrot, 1.0f, 0.0f, 0.0f);
glRotatef(yrot, 0.0f, 1.0f, 0.0f);
}
键盘功能:
if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
xpos -= 0.035 * delta;
}
if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
xpos += 0.035 * delta;
}
if (Keyboard.isKeyDown(Keyboard.KEY_W)) {
zpos += 0.03f * delta;
}
if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
zpos -= 0.035 * delta;
}
if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
xrot += 0.035;
if (xrot > 360) {
xrot -= 360;
}
}
if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) {
xrot -= 0.035;
if (xrot > 360) {
xrot += 360;
}
}
if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) {
yrot += 0.035;
if (xrot > 360) {
xrot -= 360;
}
}
if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) {
yrot -= 0.035;
if (xrot > 360) {
xrot += 360;
}
}
我的翻译功能:
glTranslated(xpos, ypos, zpos - 30);
关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
您可能希望参考相机指向的位置移动。这意味着在适用时将增量添加到x,y和z位置。
幸运的是,当你从欧拉角(xrot,yrot)计算你的摄像机viewMatrix时,旋转矩阵包含了要添加的值:
[rx ux fx - ]
[ry uy fy - ] = viewMatrix
[rz uz fz - ]
[ - - - - ]
忽略标有' - '的元素,你应当在向右/向左移动时添加/减去“右”列vector =(rx,ry,rz),“向上”向量=(ux,uy,uz)当向前/向后移动时向上/向下移动和前向量(fx,fy,fz)。
如果高度保持不变,那么只需忽略ry,uy,fy组件,但要准备将两个剩余组件标准化。
答案 1 :(得分:0)
可能会根据旧的gluLookAt查看相机,然后您可以更好地控制相机位置及其指向的位置。
这里有一些链接: