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

时间:2017-12-21 15:57:57

标签: 3d geometry coordinates uv-mapping

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

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

enter image description here

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

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

最后发现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三个点位置的三个Vector3
  • f新点位置的Vector3
  • uv1,uv2,uv3三角点uvs的三个Vector2

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

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

相关问题