C++ 使用视锥体的三维到二维投影存在平移问题
我需要创建此软件光栅化器,该光栅化器在给定投影(C++ 使用视锥体的三维到二维投影存在平移问题,c++,graphics,rendering,homogenous-transformation,C++,Graphics,Rendering,Homogenous Transformation,我需要创建此软件光栅化器,该光栅化器在给定投影(p)、视图(V)和模型(M)矩阵的情况下,可以从给定的点以位图格式(单色位图)创建点云(pc)的二维图像 我已经算下来了(大部分情况下似乎都是这样): 变换点云的点pc'=(P x V x M)x pc(请注意,点云已在同构系统中) 对于每个点,将所有组件除以其w(同时小心丢弃w接近零的点 丢弃位于视锥台外部的点(使用所述方法从P中提取视锥台平面) 使用(x+1)*imageWidth/2和(-y+1)*imageHeight/2)将每个点的x和y
p
)、视图(V
)和模型(M
)矩阵的情况下,可以从给定的点以位图格式(单色位图)创建点云(pc
)的二维图像
我已经算下来了(大部分情况下似乎都是这样):
pc'=(P x V x M)x pc
(请注意,点云已在同构系统中)w
(同时小心丢弃w
接近零的点P
中提取视锥台平面)(x+1)*imageWidth/2
和(-y+1)*imageHeight/2
)将每个点的x
和y
坐标转换为屏幕坐标(以获得正确的y坐标)(int)y*imageWidth+(int)x
(带绑定检查)将生成的x
和y
坐标映射到位图线性索引M
中有一个平移组件之前一切都很好!只要有一点点平移,图像就会中断:点云会严重扭曲(好像对其应用了非仿射变换)。沿哪个方向应用平移并不重要,任何平移都会将所有内容弄乱,直到点云不再可识别。起初,我认为我的模型矩阵被转置(导致非仿射变换),但情况似乎并非如此
如果需要的话,我可以发布一些代码,但是考虑到上面的概述,我是否遗漏了什么?是否需要任何特别的考虑呢?这个问题太愚蠢了,我为浪费这么多时间而感到羞愧 结果表明,我的点云中的一些点具有错误的
w
组件。我在OpenGL方面没有遇到任何问题,因为着色器正在手动将所有w
s设置为1。在光栅化器方面,错误的w
导致距离摄影机较远的点以错误的角度l投影定位
我使用的测试球体没有任何问题,因为它们有正确的w
组件
编辑:我想我还应该提到这一点:不需要提取视锥体平面来确定投影点是否落在视锥体内。只需通过确定转换点
(x',y',z',w')中的所有x'
,y'
和z'
组件来执行此检查即可(即乘以矩阵pxvxm
)位于范围w'
和-w'
内。如果所有三个组件都位于该范围内,则该点可见,否则该点位于视锥体之外。看起来没问题。查看这些相关的QA:以便进行比较。矩阵的顺序为OpenGL样式,因此您还需要使用相同样式的矩阵(专栏主修)否则,这些操作将表现出不同的行为,因为转置矩阵是它们的逆矩阵。我会将矩阵渲染为坐标系轴向量,以查看它们在转换后是否正常。问题的视频将help@Spektre谢谢,我会看一看。直觉告诉我问题在于视锥检查…再次检查今天,奇怪的是,通过平移,相机后面的点看起来还不错!而且,用一些人造球体测试,它们看起来都很好。我感觉平移并没有移动视锥。奇怪的是,当使用张贴链接中的方法时,它说如果P
矩阵是PxVxM,那么视锥平面就变了是在模型空间中计算的…有没有办法在不提取平面的情况下检查点是否落在视锥体内?我会尝试更改点的颜色…对于zzfar
使用red
,对于其余部分使用green
…这样你应该可以看到剪裁是否正常…还可以覆盖视锥多边形。。。