gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:26:00 33 4
gpt4 key购买 nike

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

我已经掌握了数学知识(而且大部分情况似乎都有效):

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

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

一切都很好,直到我在矩阵 M 中有了翻译组件!只要我有最少量的平移,图像就会中断:点云会严重扭曲(就好像对它应用了非仿射变换一样)。沿哪个方向应用平移并不重要,任何平移都会弄乱一切,直到点云不再可识别。起初我虽然我的模型矩阵被转置(导致非仿射变换),但情况似乎并非如此。

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

最佳答案

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

事实证明,我的点云中的一些点有错误的 w 组件。我在 OpenGL 方面没有遇到任何问题,因为着色器手动将所有 w 设置为 1。在光栅器方面,错误的 w 导致点与相机的距离较远,导致转换到错误的透视位置。

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

编辑:
只是想我还要提到这一点:不需要提取视锥体平面来确定投影点是否落在视锥体内。可以通过确定变换点 (x' , y', z', w')(即乘以矩阵 P x V x M 后)落在 w' 范围内-w'。如果所有三个分量都落在该范围内,则该点可见,否则该点在视锥之外。

关于c++ - 使用视锥体的 3D 到 2D 投影存在平移问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38036173/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com