3d 基于二维摄影机计算三维摄影机位置
我有一个2D侧滚游戏引擎,希望能够添加3D对象。所以我需要一台3D相机。为了使2D对象看起来与以前完全一样,我需要计算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 =
- 我的所有二维对象都处于Z=0
- 我的2D相机定义为位置(X,Y)和宽度
- 视图的纵横比自动确定相机的高度
- 对于3D摄像机,用户设置FOVx
(来源:) 我想我可以这样计算摄影机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的方式不对?