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 をどの程度正確に補間するかです。ポイントが 3 つしかないと言ったので、単純な線形補間よりもうまくいく可能性はほとんどありません。

この場合、三角形の内側の点の重心座標が必要です: http://en.wikipedia.org/wiki/Barycentric_coordinate_system

つまり、三角形の内側のすべての点は、その頂点の加重和として表すことができます。ここで、すべての加重は 0 から 1 の間です。加重は、2x2 の線形方程式系を解くことによって見つけることができます。

これらの重みがある場合、それらを使用して UV 座標の重み付き合計を取得できます。

于 2013-06-18T12:39:51.473 に答える