0

我正在使用CGKitRTree在 python 中编写一个非常简单的光线追踪器。在将射线与三角形相交后,我想从顶点的 U、V 推断出交点的 U、V。这样做的合适方法是什么?

目前我正在使用与相对边缘的距离的加权平均值,如下所示。除了 CGKit 相关的东西,我有 3 个顶点 v1、v2、v3 和 3 个 UV 的 vt1、vt2、vt3。hit_p 是 CGKit 交集返回的三角形上的 xyz 点。

def extract_hit_vt(tri_geom, tri_vt,hit_p, oa_face):

    hit_face = tri_geom.faces[oa_face]

    vt1 = np.array(vec3(tri_vt[oa_face * 3]))
    vt2 = np.array(vec3(tri_vt[oa_face * 3 + 1]))
    vt3 = np.array(vec3(tri_vt[oa_face * 3 + 2]))

    v1 = tri_geom.verts[hit_face[0]]
    v2 = tri_geom.verts[hit_face[1]]
    v3 = tri_geom.verts[hit_face[2]]

    d1 = ptlined(v2, v3, hit_p)
    d2 = ptlined(v3, v1, hit_p)
    d3 = ptlined(v1, v2, hit_p)

    hit_vt = (d1*vt1+d2*vt2+d3*vt3)/(d1+d2+d3)

    return hit_vt
4

2 回答 2

4

这是取自 LuxRays ( http://src.luxrender.net/luxrays ) 的代码。要获得重心坐标:

static bool GetBaryCoords(const Point &p0, const Point &p1, const Point &p2,
        const Point &hitPoint, float *b1, float *b2) {
    const Vector u = p1 - p0;
    const Vector v = p2 - p0;
    const Vector w = hitPoint - p0;

    const Vector vCrossW = Cross(v, w);
    const Vector vCrossU = Cross(v, u);

    if (Dot(vCrossW, vCrossU) < 0.f)
        return false;

    const Vector uCrossW = Cross(u, w);
    const Vector uCrossV = Cross(u, v);

    if (Dot(uCrossW, uCrossV) < 0.f)
        return false;

    const float denom = uCrossV.Length();
    const float r = vCrossW.Length() / denom;
    const float t = uCrossW.Length() / denom;

    *b1 = r;
    *b2 = t;

    return ((r <= 1.f) && (t <= 1.f) && (r + t <= 1.f));
}

p0, p1, p2 是三角形的顶点,hitPoint 是射线/三角形的交点,重心坐标在 b1, b2 中返回。有了 b1, b2 后,您可以通过以下方式获得插值 (u, v) 值:

const float b0 = 1.f - b1 - b2;
const u = b0 * u_v0 + b1 * u_v1 + b2 * u_v2;
const v = b0 * v_v0 + b1 * v_v1 + b2 * v_v2;

其中 u_v0、v_v0 等是三角形顶点的 (u, v) 坐标。

于 2013-06-19T08:34:55.570 回答
-1

要决定的主要事情是您希望如何在三角形内部插入 UV。既然你说你只有三点,你不可能比简单的线性插值做得更好。

在这种情况下,您需要三角形内点的重心坐标:http ://en.wikipedia.org/wiki/Barycentric_coordinate_system

简而言之,三角形内部的每个点都可以表示为其顶点的加权和,其中每个权重都在 0 和 1 之间。通过求解 2x2 线性方程组可以找到权重。

当您拥有这些权重时,您可以使用它们来获得 UV 坐标的加权和。

于 2013-06-18T12:39:51.473 回答