之前说的关于3D Renderer问题解决方法的一些思考

突然想起来之前说的有关于3D Renderer想法的事情

目前的一个很严重的问题是 摄像机后面的点 因为目前的思路是把几个三维顶点通过与三位摄像机点连线 连线与摄像机前的一个平面的交点在平面上的二维相对坐标就是转换后的坐标 如果原顶点在摄像机后方那么投影的二维坐标就会因为不是A字型而是8字型(参考初中数学的三角形和平行线)导致反了 所以把这些点的二维坐标关于二维平面原点对称一下 即(x, y)变为(-x, -y) 然后把二维点按预设方式连直线 计算二维连线的每个对应二维坐标 删除超出显示范围的坐标然后输出就好了 这就导致了一个问题 可以看到身后的点 因为当后方顶点距离自己较远时 和摄像机的连线与平面的交点在视野范围内 如下图(画图软件yyds)

先分析这个问题的原因 因为现实里看东西不是由顶点决定的 而是线上的每个点 所以直接删除超出画面的点就行了
目前对于这个问题我能大概想到了4种解决思路
前两个方法和导致问题的原因直接挂钩似乎
1 目前采取的 删除摄像机后方的点 可以一定程度的解决这个 但是也有问题 当摄像机进入几何体内部时在长方体的情况下会有一般的顶点即4个顶点被删除 那么只能连出来4条棱 而不是应该看到的8条 如下面2张图 而且面对将来可能遇到的凹凸不平的多面体 这个影响可能会很大


2 很暴力的方法 肯定有效 但是不知道速度怎么样 直接计算三维线上每个点的点坐标 步长的话有两种思路 一个是按离摄像头最近的点的步长计算 遇到长的(深的)会浪费很多 还有一个就是按照两个点和摄像机的距离使用动态的步长 怎么得到还没想过 可能会有亿堆if之类的 也许也会影响性能 总结 大概会有用 但是计算量很大 不知道对性能有多大影响 以及 需要我先人工算亿堆东西
3 我听过一个东西叫做细分三角形 虽然不知道具体是什么 但是给了我一个想法 (还有一个这个想法的来源是有些游戏如果进入模型有些地方似乎会缺失 不过大概是3D引擎故意的设计) 虽然大概下面这个思路和细分三角形毫无关系 如果我把一个长方体分成很多块 最简单的 多取顶点 在边上 中点 三等分点 四等分点... 然后把摄像机后面点的删掉 仍可以保留不少 只有画面边缘会缺少一部分的线段 听起来不错 但是还是有问题 首先就是会缺少一部分 似乎可以通过裁小最终输出的画面面积解决 但是 引出了第二个问题 如果转头怎么办 如果不规则多面体怎么办 每段线段的长度是不确定的 你不知道应该缩小多少面积 而且对于比较极端的图形会由较大的误差 结论 计算量似乎还好 但是画面不好
4 这个方法也许是最折中的? 既然看不到是因为棱的一个顶点没了 那么让它再出现就好了 通过一些方法计算出画面边缘的点的坐标然后在连上就好了 总结 没思路...