基于2D相机计算3D相机位置

时间:2016-12-31 13:14:15

标签: 3d camera 2d game-engine direct3d

我有一个2D侧面游戏引擎,希望能够添加3D对象。所以我需要一台3D相机。为了使2D对象看起来像以前一样,我需要计算3D摄像机位置,但不知何故我的计算是关闭的:它放大了太远。情况:

  • 我的所有2D对象都在Z = 0。
  • 我的2D相机被定义为位置(X,Y)和宽度。
  • 视图的宽高比会自动确定相机的高度。
  • 对于3D相机,用户设置FOVx。

所以我想问的问题是:如何根据宽度和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并借用了他们的形象,但不幸的是,那里的答案太笼统而无法提供帮助。)

2 个答案:

答案 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位置已经正确了! :)