这是一个有点复杂的问题,所以我会尽力把它分解成块。
为了学习/乐趣,我正在编写一个 3D Python 库(而不是我打算让其他人使用的库)。在我开发的系统中,三维点一般会被展平到图像上,如下所示:
width
通过将点移动到中心消失点的一半来增加 Z 索引。- 在
Z = 0
处,X 和 Y 值直接对应于 X、Y 处的像素。
(这个方法可能有名字,但如果有,我不熟悉。)
在 Python 中:
# vx and vy are the vanishing point's coordinates
def flatten_point(width, vx, vy, x, y, z):
distance = (x - vx, y - vy)
flat_distance = [d / (1 + float(z) / width) for d in distance]
return (vx + flat_distance[0], vx + flat_distance[1])
在这一点上,我能够通过展平它的顶点并使用重心坐标来查找和填充落在这三个点之间的像素来稍微有效地创建三角形。如果我不需要知道这些像素对应的三角形上的实际点,这已经足够好用了,但是如果我想对三角形进行着色以使更深的点绘制得更暗,我需要知道什么未展平点像素对应的三角形。
math.stackexchange 上的 joriki建议使用重心坐标作为权重来查找原点。这似乎确实有效了一段时间——如果我使用线性深度系统,它可能会有效——但是当三角形点的深度相差足够大时,它就会分崩离析。三角形似乎比实际更快地接近最大深度,就好像它向后弯曲一样。
所以,简而言之:如何反转点展平功能以获得展平三角形上任意 2D 像素的实际 3D 点?或者,如果有更好/更有效的方法来展平三角形而不丢失每个像素的深度,那也可以。