微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将 UV 坐标从平面映射到网格上

我正在寻求将 UV 坐标平面映射到网格上的帮助,类似于您在 3DSMax 中看到的工具(UV 展开,视频在这里https://www.youtube.com/watch?v=CgnyaEg7sfI

我有一个任意网格,我想将一个平面的 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 直接穿过网格(所以在方格立方体上,在侧面创建条纹,在朝向/远离的面上创建棋盘格)但是在 dot=1 的面上,我将 uv 锁定为整数,其他任何东西都会得到对紫外线的某种指数失真。

我做错了什么?

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

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

ForEachVertex
{
    float adist=aPlane.Signeddistanceto(vertex.position);

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

现在,这实际上“有效......”,除非被映射的顶点与平面有法线平行。关于如何处理这种情况有什么建议吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。