我想在OpenGL中实现一个简单的例子来测试第一个透视图(不使用看设备),但它让我疯狂!第一视角透视:旋转让我疯狂
我用Processing做了一个小原型(对于这个东西和OpenGL非常相似),但是当相机开始移动时,我有了奇怪的行为!
我不清楚它是转换顺序(我已经试过所有的组合;-))!
我想,它应该是简单和一个可能的解决方案可以是:
- 转换为相机
- 旋转的位置由摄像机
- 的角度转换的每个对象在其位置
在我的简单示例中,我在(0,0,-400)中定位了一个框和一个网格,但它不像预期的那样工作。当我沿X或Z轴移动相机时,围绕Y轴的旋转似乎围绕错误的中心旋转!我想模拟相机围绕自己的Y轴旋转,就像经典的FPS游戏一样。
这里我的示例代码,其中用户可以移动相机并旋转(绕Y轴),您可以使用Processing或使用OpenProcessing进行测试。 只有前几行与问题相关...所以这是一个非常小的测试!
float cameraXPos = 0;
float cameraYPos = 0;
float cameraZPos = 0;
float cameraYAngle = 0;
float moveIncrement = 5;
float angleIncrement = 5;
// Keys:
// W
// ^
// |
// A <- -> D
// |
// V
// S
//
// F and R for Z+/Z-
// O and P for rotation around Y axis
void setup()
{
size(640, 480, OPENGL);
resetCameraPos();
}
// Reset camera
void resetCameraPos()
{
cameraXPos = width/2;
cameraYPos = height/2;
cameraZPos = (height /2)/tan(PI/6);
cameraYAngle = 0;
}
void draw()
{
// Clear screen
background(0);
// View transform
translate(cameraXPos, cameraYPos, cameraZPos);
rotateY(radians(cameraYAngle));
// World transform
translate(0, 0, -400);
// Draw a red box and a grid in the center
stroke(255, 0, 0);
noFill();
box(100);
drawGrid();
// Check if user is pressing some key and update the camera position
updateCameraPos();
}
/////////////////////////////////////////////////////////////////////
// The following part is not so relevant to the problem (I hope! ;-))
/////////////////////////////////////////////////////////////////////
void drawGrid()
{
// Draw a white grid (not so important thing here!)
stroke(255, 255, 255);
float cellSize = 40;
int gridSize = 10;
float cY = 100;
for(int z = 0; z < gridSize; z++)
{
float cZ = (gridSize/2 - z) * cellSize;
for(int x = 0; x < gridSize; x++)
{
float cX = (x - gridSize/2) * cellSize;
beginShape();
vertex(cX, cY, cZ);
vertex(cX + cellSize, cY, cZ);
vertex(cX + cellSize, cY, cZ - cellSize);
vertex(cX, cY, cZ - cellSize);
vertex(cX, cY, cZ);
endShape();
}
}
}
// Just update camera position and angle rotation
// according to the pressed key on the keyboard
void updateCameraPos()
{
if (keyPressed)
{
switch(this.key)
{
case 'w': // Y++
cameraYPos += moveIncrement;
break;
case 's': // Y--
cameraYPos -= moveIncrement;
break;
case 'a': // X--
cameraXPos += moveIncrement;
break;
case 'd': // X++
cameraXPos -= moveIncrement;
break;
case 'r': // Z++
cameraZPos += moveIncrement;
break;
case 'f': // Z--
cameraZPos -= moveIncrement;
break;
case ' ': // RESET
resetCameraPos();
break;
case 'o': // Angle++
cameraYAngle += angleIncrement;
break;
case 'p': // Angle--
cameraYAngle -= angleIncrement;
break;
}
}
}
你能更清楚地描述问题吗?另外,如果你使用'lookAt',会发生什么?那它有用吗? – Xymostech 2013-04-30 18:44:20
@Xymostech似乎当我在X或Z轴上移动摄像头(所以我改变cameraXPos或cameraZPos)时,围绕Y轴的旋转不是围绕摄像头轴进行的,而是围绕另一个中心进行的。我不知道如何使用lookAt,并且我在考虑对于这个简单的测试,它不是必要的......不是吗? – 2013-04-30 18:56:00