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
    坐标映射到位图线性索引
  • 看起来一切都很好:我得到了精确的位图,就像我用OpenGL渲染它一样,通过任意四元数旋转点云仍然可以得到有效的结果

    在矩阵
    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
    …这样你应该可以看到剪裁是否正常…还可以覆盖视锥多边形。。。