// 線形補間
private Vector2 Lerp(Vector2 start, Vector2 end, float t)
{
return start + t * (end - start);
}
// 四角形内の点のUV座標を計算
public Vector2 CalculateUV(Vector2 A, Vector2 B, Vector2 C, Vector2 D, Vector2 E)
{
// 辺ABとCDに沿った補間
Vector2 AB = B - A;
Vector2 DC = C - D;
float tAB = Vector2.Dot(E - A, AB) / AB.sqrMagnitude;
float tDC = Vector2.Dot(E - D, DC) / DC.sqrMagnitude;
Vector2 AB_E = Lerp(A, B, tAB);
Vector2 DC_E = Lerp(D, C, tDC);
// 辺ADとBCに沿った補間
Vector2 AD = D - A;
Vector2 BC = C - B;
float tAD = Vector2.Dot(E - A, AD) / AD.sqrMagnitude;
float tBC = Vector2.Dot(E - B, BC) / BC.sqrMagnitude;
Vector2 AD_E = Lerp(A, D, tAD);
Vector2 BC_E = Lerp(B, C, tBC);
// 辺に沿った補間からUV座標を計算
float u = (E - AB_E).magnitude / (DC_E - AB_E).magnitude;
float v = (E - AD_E).magnitude / (BC_E - AD_E).magnitude;
// 最終的なUV座標を算出
return new Vector2(u, v);
}