使用视锥体进行3D到2D投影存在翻译问题

时间:2016-06-26 07:28:19

标签: c++ graphics rendering homogenous-transformation

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

我已经完成了数学计算(事情似乎在很大程度上起作用):

  1. 转换点云的点w(注意点云已经在同构系统中)
  2. 对于每个点,将所有组件除以w(同时小心丢弃P接近零的点。
  3. 丢弃落在视锥体之外的点(通过使用描述的here方法从x中提取平截头体平面)
  4. 使用y(x + 1) * imageWidth / 2将每个点的(-y + 1) * imageHeight / 2x坐标转换为屏幕坐标(以获得正确的y坐标)。
  5. 使用y(带边界检查)将生成的(int)y * imageWidth + (int)xM坐标映射到位图线性索引。
  6. 似乎一切正常:我得到了精确的位图,好像我用OpenGL渲染它一样,通过任意四元数旋转点云仍能得到有效的结果。

    在我在矩阵^[\x20-\x7E]+$ 中有翻译组件之前,情况一直很好!一旦我有最轻微的平移量,图像就会中断:点云变得严重失真(好像已经应用了非仿射变换)。翻译应用于哪个方向并不重要,任何翻译都会使一切变得混乱,直至点云无法识别。起初我虽然我的模型矩阵被转置(导致非仿射变换),但事实并非如此。

    如果需要,我可以发布一些代码,但鉴于上述概述,我错过了什么?是否有任何特殊需要考虑?

1 个答案:

答案 0 :(得分:1)

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

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

我使用的测试领域没有任何问题,因为他们拥有正确的x'组件。

修改
我以为我也会提到这一点:没有必要提取视锥体平面来确定投影点是否落在视锥体内。可以通过确定转换后的点y'中的所有z'(x', y', z', w')P x V x M成分(即乘以矩阵w'后)来执行此检查在-w'RxJava范围内。如果所有三个组件都落在该范围内,则该点是可见的,否则该点位于视锥体之外。