三角纹理映射与重心坐标

时间:2014-06-01 14:13:18

标签: c math geometry raytracing

我想在我的光线追踪器中映射纹理三角形以进行3D渲染。 我使用重心坐标来定位三角形上的点。 但结果不正确。 这就是我所做的:

3个三角形顶点:a b c

1个交叉点(光线追踪):p

顶点坐标为a.x a.y a.z / b.x b.y b.z / c.x c.y c.z

纹理坐标为a.tx a.ty / b.tx b.ty / c.tx c.ty

首先,我得到交点和其中一个三角形顶点之间的距离:

d1 = get_distance(p, a);
d2 = get_distance(p, b);
d3 = get_distance(p, c);

其次,我计算每个顶点的重心比:

r1 = d1 / (d1 + d2 + d3);
r2 = d2 / (d1 + d2 + d3);
r3 = d3 / (d1 + d2 + d3);

最后,我确定了图像上点的坐标:

x_img = (r1 * a.tx) + (r2 * b.tx) + (r3 * c.tx);
y_img = (r1 * a.ty) + (r2 * b.ty) + (r3 * c.ty);

但它不起作用。 你能解释一下为什么好吗?

Kik-Ass Head的渲染:

![kickass]:http://imgur.com/3LAjrWm

1 个答案:

答案 0 :(得分:0)

你的重心计算似乎是错误的 - 从我准备你的代码的方式来看,一个组件会越远离顶点影响越多。

我想它应该是表格上的内容

r1 = (1/d1) / ( (1/d1) + (1/d2) + (1/d3) )

虽然除数为零或接近于零会有一些问题。请查看http://en.wikipedia.org/wiki/Barycentric_coordinate_system#Converting_to_barycentric_coordinates以获得有关如何计算此问题的更好解决方案。 enter image description here enter image description here enter image description here