来自逆 vp 矩阵和相机位置的光线方向不正确
Incorrect ray direction from inverse vp matrix and camera position
我的射线生成有一个我不明白的问题。我的射线方向计算错误。我把这段代码从 DirectX 11 移植到 Vulkan,在那里它工作得很好,所以我很惊讶我无法让它工作:
vec4 farPos = inverseViewProj * vec4(screenPos, 1, 1);
farPos /= farPos.w;
r.Origin = camPos.xyz;
r.Direction = normalize(farPos.xyz - camPos.xyz);
然而,这段代码运行完美:
vec4 nearPos = inverseViewProj * vec4(screenPos, 0, 1);
nearPos /= nearPos.w;
vec4 farPos = inverseViewProj * vec4(screenPos, 1, 1);
farPos /= farPos.w;
r.Origin = camPos.xyz;
r.Direction = normalize(farPos.xyz – nearPos.xyz);
[编辑] 矩阵和相机位置设置如下:
const glm::mat4 clip(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 1.0f);
projMatrix = clip * glm::perspectiveFov(FieldOfView, float(ViewWidth), float(ViewHeight), NearZ, FarZ);
viewMatrix = glm::inverse(glm::translate(glm::toMat4(Rotation), -Position));
buffer.inverseViewProjMatrix = glm::inverse(projMatrix * viewMatrix);
buffer.camPos = viewMatrix[3];
[编辑2] 如果我从原点开始,我在屏幕上看到的是正确的。但是,例如,如果我向左移动,看起来好像我在向右移动。我所有的光线似乎都被扰动了。在某些情况下,扫射相机看起来就像我在空间中的不同点移动。我假设相机位置不等于我的透视矩阵的奇点,但我无法弄清楚为什么。
我想我误解了一些基本的东西。我错过了什么?
多亏了评论,我发现了问题。我错误地构建了我的视图矩阵,其方式与这篇文章完全相同:
glm::inverse(glm::translate(glm::toMat4(Rotation), -Position));
这等于先翻译然后旋转,这当然会导致一些不需要的东西。此外,Position
为负数,camPos
是使用视图矩阵的最后一列而不是反向视图矩阵获得的,这是错误的。
我的分形光线投射器并没有注意到这一点,因为我从未远离原点。这一点,以及在这样的环境中没有参考点的事实。
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 了解 GLM- openGL 中的相机转换
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- OPENCV(C ) - 从已知的3D对象和相机位置计算图像的2D坐标
- 在构造函数以外的任何其他位置访问相机时,我的相机指针返回 null
- 将相对相机位置添加到现有相机位置
- 我如何使用opencv从相机的所有位置检测android的人脸
- OpenCV 计算相机位置和旋转
- 计算第三人称相机的位置
- 在单目视觉里程计中使用 3D-2D 运动估计的相机位置
- 我如何知道像素的位置与相机的相应位置(以厘米或毫米为单位)
- 3D 几何:从相机位置、最小和最大视角长度、指向角度和视角查找观看边界
- 相机在世界坐标中的位置来自 cv::solvePnP
- OpenGL相机位置和天空盒
- 修改相机位置基于按键
- 将相机位置传递给着色器OpenGL
- OpenGL ES-从相机位置获取2D像素坐标