C++ 用于UV贴图的多边形点从3D到2D的正交投影

C++ 用于UV贴图的多边形点从3D到2D的正交投影,c++,math,orthographic,xsi,C++,Math,Orthographic,Xsi,我想在平面上使用简单的正交投影变换或投影多边形点的位置-用于UV贴图,并被卡住 . 守则: CPolygonFaceRefArray lPolygons = lPolygonMesh.GetPolygons(); for( long f=0; f < lPolygons.GetCount(); f++ ) { PolygonFace lFace = lPolygons[ f ]; CPointRefArray lPoints = l

我想在平面上使用简单的正交投影变换或投影多边形点的位置-用于UV贴图,并被卡住 . 守则:

    CPolygonFaceRefArray lPolygons = lPolygonMesh.GetPolygons();

    for( long f=0; f < lPolygons.GetCount(); f++ )
    {
        PolygonFace lFace = lPolygons[ f ];
        CPointRefArray lPoints = lFace.GetPoints();

        Point lPoint1 = lPoints[ 0 ];
        Point lPoint2 = lPoints[ 1 ];
        Point lPoint3 = lPoints[ 2 ];

        CVector3 lPoint1Position = lPoint1.GetPosition();
        CVector3 lPoint2Position = lPoint2.GetPosition();
        CVector3 lPoint3Position = lPoint3.GetPosition();

        _LogValue2( f, L"--------------------------------------" );

        // Vector A->B, that becomes the X axis of the local plane.
        CVector3 lLocalX = lLocalX.Sub( lPoint1Position, lPoint2Position );
        lLocalX.NormalizeInPlace();

        // Vector A->C
        CVector3 lVector13 = lVector13.Sub( lPoint1Position, lPoint3Position );
        lVector13.NormalizeInPlace();

        // Determine the Z vector of the local plane:.
        CVector3 lLocalZ = lLocalZ.Cross( lLocalX, lVector13 );
        lLocalZ.NormalizeInPlace();

        // Determine Y vector of the local plane, assuming that it’s perpendicular to already known X and Z.
        CVector3 lLocalY = lLocalY.Cross( lLocalZ, lLocalX );
        lLocalY.NormalizeInPlace();

        // In result we got three axis of the local plane:
        // lLocalX.Dot( lLocalY ) == lLocalX.Dot( lLocalZ ) ==  lLocalY.Dot( lLocalZ ) == 0;

        /*
        Now use system of equations to determine the positions of all points in reference to the local plane.

        double GetBase(const double& a1, const double& b1, const double& c1, const double& a2, const double& b2, const double& c2, const double& a3, const double& b3, const double& c3 )
        {return (a1*b2*c3)+(a3*b1*c2)+(a2*b3*c1)-((a3*b2*c1)+(a1*b3*c2)+(a2*b1*c3));}

        double GetX(const double& a1, const double& b1, const double& c1, const double& d1, const double& a2, const double& b2, const double& c2, const double& d2, const double& a3, const double& b3, const double& c3, const double& d3, const double& in_Base)
        {return ( (d1*b2*c3)+(d2*b1*c2)+(d2*b3*c1)-((d3*b2*c1)+(d1*b3*c2)+(d2*b1*c3)) ) / in_Base;}

        double GetY(const double& a1, const double& b1, const double& c1, const double& d1, const double& a2, const double& b2, const double& c2, const double& d2, const double& a3, const double& b3, const double& c3, const double& d3, const double& in_Base)
        {return ( (a1*d2*c3)+(a3*d1*c2)+(a2*d3*c1)-((a3*d2*c1)+(a1*d3*c2)+(a2*b1*c3)) ) / in_Base;}

        double GetZ(const double& a1, const double& b1, const double& c1, const double& d1, const double& a2, const double& b2, const double& c2, const double& d2, const double& a3, const double& b3, const double& c3, const double& d3, const double& in_Base)
        {return ( (a1*b2*d3)+(a3*b1*d2)+(a2*b3*d1)-((a3*b2*d1)+(a1*b3*d2)+(a2*b1*d3)) ) / in_Base;}
        */

        double fU; 
        double fV; 
        double fW;
        double fBase;

        // For each point, except the first one (lPoint1Position), which we aleady know.

        for( long p=1; p < lPoints.GetCount(); p++ )
        {
            Point lPoint = lPoints[ p ];
            CVector3 lPointPosition = lPoint.GetPosition();
            CVector3 lPointVector = lPointVector.Sub( lPoint1Position, lPointPosition );

            fBase = GetBase( 
                        lLocalX.GetX(), lLocalY.GetX(), lLocalZ.GetX(),
                        lLocalX.GetY(), lLocalY.GetY(), lLocalZ.GetY(),
                        lLocalX.GetZ(), lLocalY.GetZ(), lLocalZ.GetZ() ); 

            fU = GetX( lLocalX.GetX(), lLocalY.GetX(), lLocalZ.GetX(), lPointVector.GetX(),
                       lLocalX.GetY(), lLocalY.GetY(), lLocalZ.GetY(), lPointVector.GetY(),
                       lLocalX.GetZ(), lLocalY.GetZ(), lLocalZ.GetZ(), lPointVector.GetZ()
                       ,fBase ); 

            fV = GetY( lLocalX.GetX(), lLocalY.GetX(), lLocalZ.GetX(), lPointVector.GetX(),
                       lLocalX.GetY(), lLocalY.GetY(), lLocalZ.GetY(), lPointVector.GetY(),
                       lLocalX.GetZ(), lLocalY.GetZ(), lLocalZ.GetZ(), lPointVector.GetZ()
                       ,fBase ); 

            fW = GetZ( lLocalX.GetX(), lLocalY.GetX(), lLocalZ.GetX(), lPointVector.GetX(),
                       lLocalX.GetY(), lLocalY.GetY(), lLocalZ.GetY(), lPointVector.GetY(),
                       lLocalX.GetZ(), lLocalY.GetZ(), lLocalZ.GetZ(), lPointVector.GetZ()
                       ,fBase ); 

            _LogRoundValue3( p, fU, fV, fW );
        }

        // Result for a cube with the center in 0,0,0 (global coords) is:
        // INFO : Values: 0, --------------------------------------
        // INFO : 1 = 0, 0, 0
        // INFO : 2 = 0, 1, 0
        // INFO : 3 = 0, 1, 0
        // INFO : Values: 1, --------------------------------------
        // INFO : 1 = 1, 1, 0
        // INFO : 2 = 1, 1, 0
        // INFO : 3 = 0, 1, 0
        // INFO : Values: 2, --------------------------------------
        // INFO : 1 = 1, 0, 0
        // INFO : 2 = 1, 1, 0
        // INFO : 3 = 0, 1, 0
        // INFO : Values: 3, --------------------------------------
        // INFO : 1 = 1, 0, 0
        // INFO : 2 = 1, 1, 0
        // INFO : 3 = 0, 1, 0
        // INFO : Values: 4, --------------------------------------
        // INFO : 1 = 1, 0, 0
        // INFO : 2 = 1, 1, 0
        // INFO : 3 = 0, 1, 0
        // INFO : Values: 5, --------------------------------------
        // INFO : 1 = 0, 0, 0
        // INFO : 2 = 0, 1, 0
        // INFO : 3 = 0, 1, 0

        // and for a rotated cube at the same place:
        // INFO : Values: 0, --------------------------------------
        // INFO : 1 = 0.027506, 0.033672, 0
        // INFO : 2 = 0.487751, 0.969746, 0
        // INFO : 3 = 0.460245, 1, 0
        // INFO : Values: 1, --------------------------------------
        // INFO : 1 = 1.15549, 0.753083, 0
        // INFO : 2 = 1.03428, 1, 0
        // INFO : 3 = -0.121205, 1, 0
        // INFO : Values: 2, --------------------------------------
        // INFO : 1 = 1, 0.04442, 0
        // INFO : 2 = 1, 1.04442, 0
        // INFO : 3 = 0, 1, 0
        // INFO : Values: 3, --------------------------------------
        // INFO : 1 = 1, -0.093859, 0
        // INFO : 2 = 1, 0.906141, 0
        // INFO : 3 = 0, 1, 0
        // INFO : Values: 4, --------------------------------------
        // INFO : 1 = 1, -0.04442, 0
        // INFO : 2 = 1, 0.95558, 0
        // INFO : 3 = 0, 1, 0
        // INFO : Values: 5, --------------------------------------
        // INFO : 1 = 0.027506, 0.09418, 0
        // INFO : 2 = -0.43274, 1.03025, 0
        // INFO : 3 = -0.460245, 1, 0
    }
CPolygonFaceRefArray lPolygons=lPolygonMesh.GetPolygons();
for(长f=0;fB,成为局部平面的X轴。
CVector3 lLocalX=lLocalX.Sub(lpoint1位置,lpoint2位置);
lLocalX.NormalizeInPlace();
//向量A->C
CVector3 lVector13=lVector13.Sub(LPoint1位置,LPoint3位置);
lVector13.NormalizeInPlace();
//确定局部平面的Z向量:。
CVector3-lLocalZ=lLocalZ.Cross(lLocalX,lVector13);
lLocalZ.NormalizeInPlace();
//确定局部平面的Y向量,假设它垂直于已知的X和Z。
CVector3 lLocalY=lLocalY.Cross(lLocalZ,lLocalX);
lLocalY.NormalizeInPlace();
//结果我们得到了局部平面的三个轴:
//lLocalX.Dot(lLocalY)==lLocalX.Dot(lLocalZ)==lLocalY.Dot(lLocalZ)==0;
/*
现在使用方程组确定所有点相对于局部平面的位置。
双基地(双基地和a1、双基地和b1、双基地和c1、双基地和a2、双基地和b2、双基地和c2、双基地和a3、双基地和b3、双基地和c3)
{返回(a1*b2*c3)+(a3*b1*c2)+(a2*b3*c1)-(a3*b2*c1)+(a1*b3*c2)+(a2*b1*c3));}
双GetX(常数双和a1、常数双和b1、常数双和c1、常数双和d1、常数双和a2、常数双和b2、常数双和c2、常数双和d2、常数双和a3、常数双和b3、常数双和c3、常数双和d3、常数双和内底)
{返回((d1*b2*c3)+(d2*b1*c2)+(d2*b3*c1)-(d3*b2*c1)+(d1*b3*c2)+(d2*b1*c3))/in_Base;}
双槽(双槽和a1、双槽和b1、双槽和c1、双槽和d1、双槽和a2、双槽和b2、双槽和c2、双槽和d2、双槽和a3、双槽和b3、双槽和c3、双槽和d3、双槽和内底)
{返回((a1*d2*c3)+(a3*d1*c2)+(a2*d3*c1)-(a3*d2*c1)+(a1*d3*c2)+(a2*b1*c3))/in_Base;}
双GetZ(常数双精度和a1、常数双精度和b1、常数双精度和c1、常数双精度和d1、常数双精度和a2、常数双精度和b2、常数双精度和c2、常数双精度和d2、常数双精度和a3、常数双精度和b3、常数双精度和c3、常数双精度和d3、常数双精度和内底)
{返回((a1*b2*d3)+(a3*b1*d2)+(a2*b3*d1)-(a3*b2*d1)+(a1*b3*d2)+(a2*b1*d3))/in_Base;}
*/
双福;
双fV;
双fW;
双fBase;
//对于每个点,除了我们已经知道的第一个点(LPoint1位置)。
对于(长p=1;pfU = lPointVector.Dot(lLocalX);
fV = lPointVector.Dot(lLocalY);
fW = lPointVector.Dot(lLocalZ); // should be zero if points lie in plane