Matrix 将UV坐标从平面映射到网格

Matrix 将UV坐标从平面映射到网格,matrix,graphics,transformation,texture-mapping,uv-mapping,Matrix,Graphics,Transformation,Texture Mapping,Uv Mapping,我正在寻找将UV坐标平面映射到网格的帮助,类似于您在3DSMax中看到的工具(UV展开,此处视频:) 我有一个任意的网格,我想把一个平面上的UV坐标投影到它上面,也就是说,每个UV坐标都被设置为平面上最近的点 我真的以为这很容易。。。但事实并非如此!以下是我试图做的一些伪代码: ForEachVertex { Vector aUV=Point(vertex.x-upperleftofplane.x,vertex.y-upperleftofplane.y,0);

我正在寻找将UV坐标平面映射到网格的帮助,类似于您在3DSMax中看到的工具(UV展开,此处视频:)

我有一个任意的网格,我想把一个平面上的UV坐标投影到它上面,也就是说,每个UV坐标都被设置为平面上最近的点

我真的以为这很容易。。。但事实并非如此!以下是我试图做的一些伪代码:

    ForEachVertex
    {
        Vector aUV=Point(vertex.x-upperleftofplane.x,vertex.y-upperleftofplane.y,0);

        Matrix aMat;
        aMat.Align(planenormal,vertex->normal); // creates a rotation axis to rotate the plane's normal to the vertex's normal
        Vector aNewUV=aMat.ProcessPoint(aUV);
        vertex->u=aNewUV.x;
        vertex->v=aNewUV.v;
    }
这很奇怪。被映射面的轻微滚动或偏航会产生严重的错误因素。我希望所有UV都能直接穿过网格(所以在方格立方体上,在侧面创建条纹,在朝向/远离面的面上使用棋盘格),但是在点=1的面上,我会将UV锁定为整数,其他任何东西都会对UV产生某种指数失真

我做错了什么

(编辑)我玩得更远了。此代码执行得更好:

    Plane aPlane;
    aPlane.Create(Vector(objectcenter.x,objectcenter.y,objectcenter.z-arbitrarynumber),Vector(0,0,1));

ForEachVertex
{
    float aDist=aPlane.SignedDistanceTo(vertex.position);

    Vector aPos=vertex.position+aPlane.normal*aDist;
    vertex.u=aPos.x;
    vertex.v=aPos.y;
}

现在,这实际上“起作用…”除非被映射的顶点与平面有法线平行。关于如何处理那个案子有什么建议吗