使用DirectMath的XMMatrixPerspectiveLH生成投影矩阵,对一个长,宽,高都是50.0f的立方体投影
结果如下

应该是红圈的部分在x方向小于黄圈的部分。但是,事实是红圈部分被过分拉长,这是什么原因?
使用DirectMath的XMMatrixPerspectiveLH生成投影矩阵,对一个长,宽,高都是50.0f的立方体投影
结果如下

关注引自免费微信小程序:皆我百晓生
透视投影中的问题通常与视口、视角、以及对象到摄像机的距离有关。在您的情况下,看起来可能是由于视角(field of view, FOV)设置过大导致的物体在x轴上的伸展。为了纠正这个问题,您可以尝试减小视角,这样可以减少在x轴方向上的透视效果。
这里是一个示例代码片段,用于创建一个更窄的视角(例如,从90度降低到45度),并确保立方体位于摄像机的正前方。这个例子假设您已经有一个指向立方体中心的摄像机位置(cameraPosition)和一个朝向立方体正前方的摄像机朝向(cameraForward)。同时,我们需要一个摄像机向上向量(cameraUp),默认为(0,1,0)。
#include <DirectXMath.h>
using namespace DirectX;
// 假设这些已经被定义了
XMVECTOR cameraPosition;
XMVECTOR cameraForward;
XMVECTOR cameraUp = XMVectorSet(0, 1, 0, 0);
float nearPlaneDistance = 0.1f;
float farPlaneDistance = 100.0f;
float aspectRatio = (float)width / height; // 使用实际窗口宽度和高度替换 width 和 height
// 更窄的视角,从90度降低到45度
float fovY =XMConvertToRadians(45.0f);
// 创建透视投影矩阵
XMATRIX projectionMatrix = XMMatrixPerspectiveFovLH(fovY, aspectRatio, nearPlaneDistance, farPlaneDistance);
接下来,确保立方体的中心点距离摄像机的位置适当,并且在正确的缩放范围内。这可以通过调整立方体的中心位置或者改变其世界坐标系下的大小来实现。如果立方体离摄像机太远,透视效果会更加明显,所以保持它们之间的距离在一个合理的范围内也很重要。
// 确保立方体中心距离摄像机适中
XMVECTOR cubeCenter = XMVectorSet(0, 0, 0, 0); // 这里是立方体的中心
XMVECTOR cubeScale = XMVectorSet(50.0f, 50.0f, 50.0f, 1.0f); // 立方体的原始尺寸
// 将立方体移动到摄像机前方一定距离
cubeCenter += cameraForward * 5.0f; // 调整这个值以控制立方体到摄像机的距离
// 缩放立方体,使其适应视角
cubeScale *= 0.8f; // 可能需要调整这个值,使立方体在视口中看起来合适
// 创建立方体的世界变换矩阵
XMATRIX worldMatrix = XMMatrixScaling(cubeScale.x, cubeScale.y, cubeScale.z) *
XMMatrixTranslation(cubeCenter.x, cubeCenter.y, cubeCenter.z);
// 最终的模型-视图-投影矩阵组合
XMATRIX MVP = worldMatrix * XMMatrixInverse(XMMatrixTranspose(cameraWorld), false) * projectionMatrix;
将MVP矩阵传递给着色器进行渲染。通过调整视角、立方体到摄像机的距离和立方体的大小,应该能得到预期的透视效果。如果问题仍然存在,请提供更多信息,比如立方体的渲染代码和具体的输入数据,以便进一步分析。