我正在寻找一种更好的方法(或注意这是最好的方法)将像素坐标从任意相机位置/方向传输到其相应的光线方向。
我目前的方法如下。我将“相机”定义为位置向量、观察向量和向上向量,命名为这样。(注意,lookat 向量是相机所面对方向上的单位向量,而不是(位置-lookat)是方向,就像 XNA 的 Matrix.CreateLookAt 中的标准一样)这三个向量可以唯一地定义一个相机位置。这是实际代码(嗯,不是真正的实际代码,是简化的抽象版本)(语言是 HLSL)
float xPixelCoordShifted = (xPixelCoord / screenWidth * 2 - 1) * aspectRatio;
float yPixelCoordShifted = yPixelCoord / screenHeight * 2 - 1;
float3 right = cross(lookat, up);
float3 actualUp = cross(right, lookat);
float3 rightShift = mul(right, xPixelCoordShifted);
float3 upShift = mul(actualUp, yPixelCoordShifted);
return normalize(lookat + rightShift + upShift);
(返回值是射线的方向)
所以我要问的是——有什么更好的方法来做到这一点,也许使用矩阵等。这种方法的问题是,如果你的视角太宽,屏幕的边缘会有点“径向拉伸” ”。