使用视锥体的3D到2D投影存在平移问题

3D to 2D projection using view frustum has issues with translation

本文关键字:存在 投影 问题 2D 视锥 3D      更新时间:2023-10-16

我需要创建这个软件光栅化器,给定投影(P),视图(V)和模型(M)矩阵,可以从给定的角度以位图格式(单色位图)创建点云(pc)的2D图像。

我已经把数学计算下来了(事情似乎在大多数情况下都是有效的):

  1. 变换点云的点pc' = (P x V x M) x pc(注意点云已经是同质系统)
  2. 对于每个点,将所有组件除以其w(同时小心丢弃w接近于零的点)。
  3. 丢弃落在视图截锥体之外的点(通过使用这里描述的方法从P中提取截锥体平面)
  4. 使用(x + 1) * imageWidth / 2(-y + 1) * imageHeight / 2将每个点的xy坐标转换为屏幕坐标(以获得正确的y坐标)。
  5. xy坐标映射到使用(int)y * imageWidth + (int)x(带绑定检查)的位图线性索引。

看起来一切都很好:我得到了精确的位图,就好像我用OpenGL渲染它一样,通过任意四元数旋转点云仍然给出了有效的结果。

事情很好,直到我有一个矩阵M翻译组件!只要我有一点点的平移,图像就会破裂:点云被严重扭曲(就好像对它进行了非仿射变换)。沿着哪个方向平移并不重要,任何平移都会使一切变得混乱,直到点云不再可识别。起初,我认为我的模型矩阵是转置的(导致非仿射变换),但情况似乎并非如此。

如果需要的话,我可以发布一些代码,但是鉴于上面的概述,我错过了什么吗?有什么需要特别考虑的吗?

这个问题太愚蠢了,我很惭愧浪费了这么多时间。

结果是我的点云中的一些点有错误的w组件。我在OpenGL方面没有遇到任何问题,因为着色器手动将所有w设置为1。在光栅化方面,错误的w会导致距离相机较远的点投射到错误的透视位置。

我使用的测试球体没有任何问题,因为它们有正确的w组件。

编辑:


我还想提一下:没有必要提取视锥面来确定投影点是否落在视锥内。可以简单地通过确定变换点(x', y', z', w')(即乘以矩阵P x V x M后)中的所有x', y'z'分量是否落在w'-w'范围内来执行此检查。如果三个组件都在这个范围内,则该点是可见的,否则该点在视锥台之外。