如何计算用于XMVector3Unproject(),DirectX11的摄像机光线位置?

时间:2016-07-01 20:21:31

标签: directx directx-11 raycasting

我正在尝试使用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***
        }
    }

希望我能正确理解这一点。任何帮助确定射线起源或修正都将非常感激。

1 个答案:

答案 0 :(得分:0)

根据the documentationXMVector3Unproject函数为您提供在相机空间中提供的光线坐标(标准化设备坐标),在对象空间中(给定模型矩阵)。

要生成相机光线,请考虑相机针孔(所有光线都通过一个点,即相机(0, 0, 0),然后选择光线方向。假设您要生成{{1}相机光线,你的循环可能看起来像这样

W*H

您可能还想看一下有趣的this link