3d 基于二维摄影机计算三维摄影机位置

3d 基于二维摄影机计算三维摄影机位置,3d,camera,2d,game-engine,direct3d,3d,Camera,2d,Game Engine,Direct3d,我有一个2D侧滚游戏引擎,希望能够添加3D对象。所以我需要一台3D相机。为了使2D对象看起来与以前完全一样,我需要计算3D摄影机的位置,但不知何故,我的计算被关闭了:它放大得太远了。情况: 我的所有二维对象都处于Z=0 我的2D相机定义为位置(X,Y)和宽度 视图的纵横比自动确定相机的高度 对于3D摄像机,用户设置FOVx 所以我想真正的问题是:如何根据宽度和FOVx计算相机的Z位置 我想我可以用棕褐色。看看这张图片: (来源:) 我想我可以这样计算摄影机Z: cameraPos.z =

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

  • 我的所有二维对象都处于Z=0
  • 我的2D相机定义为位置(X,Y)和宽度
  • 视图的纵横比自动确定相机的高度
  • 对于3D摄像机,用户设置FOVx
所以我想真正的问题是:如何根据宽度和FOVx计算相机的Z位置

我想我可以用棕褐色。看看这张图片:


(来源:)

我想我可以这样计算摄影机Z:

cameraPos.z = width / 2 / tan(FOVx / 2)
但是,结果是不正确的:相机放大太远。过远的程度随FOVx I设置的不同而不同,因此甚至不一致

这是用于此操作的总代码:

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);
我做错了什么


(我找到并借用了他们的图像,但不幸的是,那里的答案太笼统,无法提供帮助。)

D3DXMatrixLookAtLH的文档说明FOV是在y方向指定的,因此您可能希望根据高度而不是宽度进行计算


与此同时,我终于解决了我的问题。:)事实证明,从fovX到fovY并不是简单地除以纵横比的问题。所以这条线就是问题所在:

fovX.valueRadians() / aspectRatio
从fovX到fovY可以通过多种方式完成,具体取决于您使用的参数。这里有一种方法:

fovY = 2 * atan((cameraHeight / 2) / ((cameraWidth / 2) / tan(fovX / 2)))
我计算的相机的Z位置已经正确了!:)

谢谢回复!:)正如您在我发布的DirectX代码中所看到的,我已经通过除以aspectRatio:
FOVx.valueRadians()/aspectRatio
对其进行了补偿。你是否忽视了这一点,或者你的意思是我从FOVx到FOVy的方式不对?