我有一個三角形,它的每個點都由一個位置 (X,Y,Z) 和一個 UV 坐標 (U,V) 定義:
struct Vertex
{
Vector mPos;
Point mUV;
inline Vector& ToVector() {return mPos;}
inline Vector& ToUV() {return mUV;}
};
使用此功能,我可以獲取特定 XYZ 位置的 UV 坐標:
Point Math3D::TriangleXYZToUV(Vector thePos, Vertex* theTriangle)
{
Vector aTr1=theTriangle->ToVector()-(theTriangle 1)->ToVector();
Vector aTr2=theTriangle->ToVector()-(theTriangle 2)->ToVector();
Vector aF1 = theTriangle->ToVector()-thePos;
Vector aF2 = (theTriangle 1)->ToVector()-thePos;
Vector aF3 = (theTriangle 2)->ToVector()-thePos;
float aA=aTr1.Cross(aTr2).Length();
float aA1=aF2.Cross(aF3).Length()/aA;
float aA2=aF3.Cross(aF1).Length()/aA;
float aA3=aF1.Cross(aF2).Length()/aA;
Point aUV=(theTriangle->ToUV()*aA1) ((theTriangle 1)->ToUV()*aA2) ((theTriangle 2)->ToUV()*aA3);
return aUV;
}
我試圖對其進行逆向工程,以制作一個從特定 UV 位置獲取 XYZ 坐標的函式:
Vector Math3D::TriangleUVToXYZ(Point theUV, Vertex* theTriangle)
{
Point aTr1=theTriangle->ToUV()-(theTriangle 1)->ToUV();
Point aTr2=theTriangle->ToUV()-(theTriangle 2)->ToUV();
Point aF1 = theTriangle->ToUV()-theUV;
Point aF2 = (theTriangle 1)->ToUV()-theUV;
Point aF3 = (theTriangle 2)->ToUV()-theUV;
float aA=gMath.Abs(aTr1.Cross(aTr2)); // NOTE: Point::Cross looks like this: const float Cross(const Point &thePoint) const {return mX*thePoint.mY-mY*thePoint.mX;}
float aA1=aF2.Cross(aF3)/aA;
float aA2=aF3.Cross(aF1)/aA;
float aA3=aF1.Cross(aF2)/aA;
Vector aXYZ=(theTriangle->ToVector()*aA1) ((theTriangle 1)->ToVector()*aA2) ((theTriangle 2)->ToVector()*aA3);
return aXYZ;
}
這在大多數情況下都有效。然而,它似乎以指數方式“接近”三角形的直角 - 或其他東西。我不太確定發生了什么,只是結果越接近直角,結果就會變得非常不準確。
我需要對這個 TriangleUVtoXYZ 函式做些什么才能使其回傳準確的結果?
uj5u.com熱心網友回復:
我沒有測驗你的實作,但你只需要計算兩個引數坐標——第三個是多余的,因為它們的總和應該為 1。
Vector Math3D::TriangleUVToXYZ(Point theUV, Vertex* theTriangle)
{
// T2-T1, T3-T1, P-T1
Point aTr12 = theTriangle[1].ToUV() - theTriangle[0].ToUV();
Point aTr13 = theTriangle[2].ToUV() - theTriangle[0].ToUV();
Point aP1 = theUV - theTriangle[0].ToUV();
// don't need Abs() for the denominator
float aA23 = aTr12.Cross(aTr13);
// parametric coordinates [s,t]
// s = (P-T1)x(T2-T1) / (T3-T1)x(T2-T1)
// t = (P-T1)x(T3-T1) / (T2-T1)x(T3-T1)
float aA12 = aP1.Cross(aTr12) / -aA23;
float aA13 = aP1.Cross(aTr13) / aA23;
// XYZ = V1 s(V2-V1) t(V3-V1)
return theTriangle[0].ToVector()
aA12 * (theTriangle[1].ToVector() - theTriangle[0].ToVector())
aA13 * (theTriangle[2].ToVector() - theTriangle[0].ToVector());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474838.html
下一篇:Sympy回傳空結果
