Карта треугольника и линии от 3d до 2d - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть треугольник в 3d и линия, они лежат в одной плоскости.Как я могу сопоставить 5 точек с 3d на 2d?

Я могу преобразовать треугольник в 2d, но не могу сделать то же самое с линией.

Vector2[] ConvertTo2d(Vector3 a, Vector3 b, Vector3 c)
{
    var aN = new Vector2(0, 0);
    var bN = new Vector2(0, 0);
    bN.x = Mathf.Sqrt(Mathf.Pow(b.x - a.x, 2f) + Mathf.Pow(b.y - a.y, 2f) + Mathf.Pow(b.z - a.z, 2f));
    var cN = new Vector2(0, 0);
    cN.x = ((b.x - a.x) * (c.x - a.x) + 
            (b.y - a.y) * (c.y - a.y) + 
            (b.z - a.z) * (c.z - a.z)) / bN.x;
    cN.y = Mathf.Sqrt(Mathf.Pow(c.x - a.x, 2f) + Mathf.Pow(c.y - a.y, 2f) + Mathf.Pow(c.z - a.z, 2f) - Mathf.Pow(cN.x, 2f));

    return new[] {aN, bN, cN};
}

1 Ответ

1 голос
/ 09 апреля 2019

Преобразовал его в код, и он работает!

var points = new Vector3[]
{
    triangleA,
    triangleB,
    triangleC,
    lineStart,
    lineEnd
};

var pointsIn2D = To2D(points);
Vector2[] To2D(Vector3[] points)
{
    var A = points[0];
    var B = points[1];
    var C = points[2];

    var U = B - A;
    var V = C - A;
    U /= U.magnitude;
    V /= U.magnitude;

    var W = Vector3.Cross(U, V);
    U = Vector3.Cross(V, W);

    Vector2[] pNew = new Vector2[points.Length];
    for (int i = 0; i < points.Length; i++)
    {
        var P = points[i];
        var xNew = Vector3.Dot(U, P);
        var yNew = Vector3.Dot(V, P);
        pNew[i] = new Vector2(xNew, yNew);
    }
    return pNew;
}
...