所以,我觉得自己像个白痴,我对自己理解三维数学的能力失去了信心。
我想将三维空间中的三角形投影到二维空间。听起来很简单,只需使用模型 - 视图 - 投影矩阵。明白了,很容易。但是,我似乎并没有掌握如何实现近夹平面交叉点。
请参阅,只要所有顶点位于查看器前面,将三角形转换为二维就很容易了。只要一个或更差的两个顶点位于查看器后面,我就无法计算这些顶点的屏幕坐标。
当然,问这里是最后一根稻草,我已经阅读了很多文章和讨论,并花了很多时间试图解决这个问题,但无济于事。
我读过的解决方案听起来很简单:找到前面的顶点和观察者后面的顶点与近剪裁平面之间的交点(这样W=1
)。我理解推理和必要性,但是有一个案例会让我大脑破裂:
在这个视频中,当一个顶点位于观察者后面时,我切换观察者前面的哪个顶点用于计算每帧与近剪裁平面的交点,从而在一帧中产生正确的屏幕坐标,并且另一个坐标错误。
- 编辑 - 我刚才意识到我可能无法以必要的帧速率将视频上传到YouTube,因此我上传的视频并未完全显示我所指的内容。
正如您所看到的,将近剪裁平面与前方两个不同顶点相交会产生不同的结果。
我只是不知道如何确定查看器前面的哪一个顶点用于计算查看器后面顶点的正确屏幕空间坐标。
此代码与近剪裁平面(1.0
):
float s = (1.0 - bw) / (fw - bw);
// fx, fy, fw is the vertex in front of the viewer
// bx, by, bw is the vertex behind the viewer
float screen_x = bx + (fx - bx) * s;
float screen_y = by + (fy - by) * s;
提前感谢任何类型的帮助!
- 编辑 -
原来,我是一个白痴。 当然将近剪裁平面与两条不同的线相交(共享观察者后面的顶点)会产生不同的交叉点,因为用近剪裁平面剪切三角形会将三角形变成四边形(形成通过观察者前面的两个顶点和来自与近剪裁平面的交叉点的两个顶点。)
森林隐藏在所有树木后面。