如何从相邻顶点UV计算/推导新的顶点UV

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从相邻顶点UV计算/推导新的顶点UV相关的知识,希望对你有一定的参考价值。

我有一个3D模型,它已经拥有我梦寐以求的每一个缓冲区:位置,法线,紫外线等。我想修改它的几何形状(移动现有的顶点或创建一个新的顶点),例如,对我的边缘进行倒角。我可以轻松计算新位置和新法线(3D矢量),但我想知道如何计算新的UV(2D矢量),或者更确切地说,从相邻的顶点UVs推导出它们。

如果有人知道如何以通用的方式做到这一点,那可能会很酷。但也许我的特定用例提供了更多有用的数据:

enter image description here

在我的具体用例中,新的顶点(D)将位于角度α(BAC)的平分线上,我知道。而且,据我所知,每个顶点的3D位置,我都有距离AC,AB和AD。

好像我应该修改我的几何课程。三角学是否足以解决这个问题?

提前致谢 !

答案

在这种特殊情况下,您可以使用ABC三角形来查找D.计算Bisector和BC的交点(我们称之为E),找到它的UV和AE距离。然后根据这些距离在A和E之间进行插值。如果D点在三角形之外,它可能在某些情况下仍然有效。

在更一般的方法中,我会在图像上方包含一些点(比如说F),但是没有显示。基本上你想要找到包围新点的最小多边形并用它来计算新的UV。

另一答案

终于找到完美回答问题的this solution

使用重心插值,可以轻松地从新的点位置检索新的UV。以下是使用BabylonJS进行矢量类和操作的javascript中的通用代码:

var f1 = p1.subtract(f);
var f2 = p2.subtract(f);
var f3 = p3.subtract(f);

var va = BABYLON.Vector3.Cross(p1.subtract(p2), p1.subtract(p3));
var va1 = BABYLON.Vector3.Cross(f2, f3);
var va2 = BABYLON.Vector3.Cross(f3, f1);
var va3 = BABYLON.Vector3.Cross(f1, f2);

var a = va.length();
var a1 = va1.length() / a * Math.sign(BABYLON.Vector3.Dot(va, va1));
var a2 = va2.length() / a * Math.sign(BABYLON.Vector3.Dot(va, va2));
var a3 = va3.length() / a * Math.sign(BABYLON.Vector3.Dot(va, va3));

return uv1.scale(a1).addInPlace(uv2.scale(a2)).addInPlace(uv3.scale(a3));

附:

  • p1,p2,p3三个Point3的三角点位置
  • f新点位置的Vector3
  • uv1,uv2,uv3三个点的uvs三个Vector2

这适用于三角形p1p2p3平面上的任何点,包括三角形外的点。

显然,如果三个点对齐,这不起作用,它们必须形成面积大于零的三角形。

以上是关于如何从相邻顶点UV计算/推导新的顶点UV的主要内容,如果未能解决你的问题,请参考以下文章

为啥 3D 模型具有不同 uv 坐标的重复顶点位置

OpenGL |在 UV 坐标处渲染顶点

unity,mesh里的顶点数组和uv数组好像是一一对应的,那接缝处的顶点可能会对应两三个uv坐标点啊,要怎么办

搅拌机可以按顶点 UV 坐标导出吗?

在meshlab中将顶点颜色转换为UV纹理

从 FBX 文件中提取顶点数据?