我有一个2D侧面游戏引擎,希望能够添加3D对象。所以我需要一台3D相机。为了使2D对象看起来像以前一样,我需要计算3D摄像机位置,但不知何故我的计算是关闭的:它放大了太远。情况:
所以我想问的问题是:如何根据宽度和FOVx计算相机的Z位置?
我想我可以用棕褐色。看这张图片:
camera http://www.proun-game.com/Random/CameraMath.gif
我想我可以像这样计算相机Z:
cameraPos.z = width / 2 / tan(FOVx / 2)
但结果不正确:相机放大太远。我设定的FOVx有多远太多,所以它甚至不一致。
这是用于此的总代码:
float cameraZ = -cameraWidth / 2 / tan(FOVx.valueRadians() / 2);
D3DXMATRIX viewMatrix;
D3DXMatrixLookAtLH(&viewMatrix,
&D3DXVECTOR3(cameraPos.x, cameraPos.y, cameraZ), // the eye point
&D3DXVECTOR3(cameraPos.x, cameraPos.y, 0), // the camera look-at target
&D3DXVECTOR3(0.0f, 1.0f, 0.0f)); // the current world's up direction
D3DXMATRIX projectionMatrix;
D3DXMatrixPerspectiveFovLH(&projectionMatrix,
FOVx.valueRadians() / aspectRatio, // Field of view in the y direction, in radians
aspectRatio, // Aspect ratio, defined as view space width divided by height
0.01f, // Z-value of the near view-plane
100.0f); // Z-value of the far view-plane
DXMatrix multiplied = worldMatrix * viewMatrix * projectionMatrix;
D3DXMatrixTranspose(&totalMatrixForCurrentObject, &multiplied);
我在这里做错了什么?
(我发现this similar question并借用了他们的形象,但不幸的是,那里的答案太笼统而无法提供帮助。)
答案 0 :(得分:0)
D3DXMatrixLookAtLH的文档说明FOV是在y方向指定的,因此您可能希望根据高度而不是宽度进行计算。
https://msdn.microsoft.com/en-us/library/windows/desktop/bb205350(v=vs.85).aspx
答案 1 :(得分:0)
与此同时,我终于解决了我的问题。 :)错误结果是从fovX到fovY不仅仅是按宽高比划分的问题。所以这就是问题所在:
fovX.valueRadians() / aspectRatio
从fovX到fovY可以通过多种方式完成,具体取决于您使用的参数。这是一种方法:
fovY = 2 * atan((cameraHeight / 2) / ((cameraWidth / 2) / tan(fovX / 2)))
我正在计算的相机Z位置已经正确了! :)