3d 如何从相邻顶点UV计算/推断新顶点UV

3d 如何从相邻顶点UV计算/推断新顶点UV,3d,geometry,coordinates,uv-mapping,3d,Geometry,Coordinates,Uv Mapping,我有一个3D模型,它已经有了我能想到的所有缓冲区:位置、法线、UV等等。 我想修改其几何体(移动现有顶点或创建新顶点),例如,对边进行倒角。 我可以很容易地计算新的位置和新的法线(3D向量),但我想知道如何计算新的UV(2D向量),或者更确切地说,从相邻的顶点UV推断它们 如果有人知道如何用一种通用的方式来做,那就太酷了。但也许我的特定用例提供了更有用的数据: 在我的特定用例中,新顶点(D)将位于角度α(BAC)的平分线上,我知道。此外,因为我知道每个顶点的三维位置,所以我有所有的距离AC,A

我有一个3D模型,它已经有了我能想到的所有缓冲区:位置、法线、UV等等。 我想修改其几何体(移动现有顶点或创建新顶点),例如,对边进行倒角。 我可以很容易地计算新的位置和新的法线(3D向量),但我想知道如何计算新的UV(2D向量),或者更确切地说,从相邻的顶点UV推断它们

如果有人知道如何用一种通用的方式来做,那就太酷了。但也许我的特定用例提供了更有用的数据:

在我的特定用例中,新顶点(D)将位于角度α(BAC)的平分线上,我知道。此外,因为我知道每个顶点的三维位置,所以我有所有的距离AC,AB和AD

看来我应该复习几何课了。。三角学足以解决这个问题吗


提前谢谢

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

在更一般的方法中,我会包括一些位于图像上方但未显示的点(比如F)。基本上,您希望找到包围新点的最小多边形,并使用它来计算新UV。

最终发现这完美地回答了问题

使用重心插值可以很容易地从新点位置检索新UV。 下面是javascript中的通用代码,它使用JS实现向量类和操作:

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三角形点位置的三个矢量3
  • f新点位置的矢量3
  • uv1、uv2、uv3三角形点UV的三个矢量2
这适用于三角形p1p2p3平面上的任何点,包括三角形外的点

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

E(u,v)=(B(u,v)+C(u,v))/2;;D(u,v)=A(u,v)+(E(u,v)-A(u,v))*(| | AD | | |/| AE |);;嘿,你说得对,这也应该行!