我需要创建这个软件光栅化器,给定投影(V
),视图(M
)和模型(pc
)矩阵,可以创建点云的2D图像(pc' = (P x V x M) x pc
)从给定的角度以位图格式(单色位图)。
我已经完成了数学计算(事情似乎在很大程度上起作用):
w
(注意点云已经在同构系统中)w
(同时小心丢弃P
接近零的点。x
中提取平截头体平面)y
和(x + 1) * imageWidth / 2
将每个点的(-y + 1) * imageHeight / 2
和x
坐标转换为屏幕坐标(以获得正确的y坐标)。y
(带边界检查)将生成的(int)y * imageWidth + (int)x
和M
坐标映射到位图线性索引。似乎一切正常:我得到了精确的位图,好像我用OpenGL渲染它一样,通过任意四元数旋转点云仍能得到有效的结果。
在我在矩阵^[\x20-\x7E]+$
中有翻译组件之前,情况一直很好!一旦我有最轻微的平移量,图像就会中断:点云变得严重失真(好像已经应用了非仿射变换)。翻译应用于哪个方向并不重要,任何翻译都会使一切变得混乱,直至点云无法识别。起初我虽然我的模型矩阵被转置(导致非仿射变换),但事实并非如此。
如果需要,我可以发布一些代码,但鉴于上述概述,我错过了什么?是否有任何特殊需要考虑?
答案 0 :(得分:1)
这个问题太愚蠢了,以为浪费这么多时间我感到很惭愧。
原来我的点云中的一些点有错误的w
组件。我没有在OpenGL方面遇到任何问题,因为着色器是手动将所有w
s设置为1.在光栅化器方面,错误的w
导致了距离较远的点w
相机投影在错误的视角位置。
我使用的测试领域没有任何问题,因为他们拥有正确的x'
组件。
修改强>
我以为我也会提到这一点:没有必要提取视锥体平面来确定投影点是否落在视锥体内。可以通过确定转换后的点y'
中的所有z'
,(x', y', z', w')
和P x V x M
成分(即乘以矩阵w'
后)来执行此检查在-w'
和RxJava
范围内。如果所有三个组件都落在该范围内,则该点是可见的,否则该点位于视锥体之外。