我正在尝试使用XMVector3Unproject()在DirectX11中创建光线投射相机。根据我的理解,我将通过近平面上像素的(Vector3)位置,并在单独的调用中,在远平面上的相应位置。然后我会减去这些矢量以获得光线的方向。然后原点将是近平面上的未投影坐标。我的问题是计算要传入的光线的原点。
实施例
// assuming screenHeight and screenWidth are the number of pixels.
const uint32_t screenHeight = 768;
const uint32_t screenWidth = 1024;
struct Ray
{
XMFLOAT3 origin;
XMFLOAT3 direction;
};
Ray rays[screenWidth * screenHeight];
for (uint32_t i = 0; i < screenHeight; ++i)
{
for (uint32_t j = 0; j < screenWidth; ++j)
{
// 1. ***calculate and store the current pixel position on the near plane***
// 2. ***calculate the corresponding point on the far plane***
// 3. ***pass both positions separately into XMVector3Unproject() (2 total calls to the function)***
// 4. ***store the returned vectors' difference into rays[i * screenWidth + j].direction***
// 5. ***store the near plane pixel position's returned vector into rays[i * screenWidth + j].origin***
}
}
希望我能正确理解这一点。任何帮助确定射线起源或修正都将非常感激。
答案 0 :(得分:0)
根据the documentation,XMVector3Unproject
函数为您提供在相机空间中提供的光线坐标(标准化设备坐标),在对象空间中(给定模型矩阵)。
要生成相机光线,请考虑相机针孔(所有光线都通过一个点,即相机(0, 0, 0)
,然后选择光线方向。假设您要生成{{1}相机光线,你的循环可能看起来像这样
W*H
您可能还想看一下有趣的this link