如何从相邻顶点UV计算/推导新的顶点UV
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从相邻顶点UV计算/推导新的顶点UV相关的知识,希望对你有一定的参考价值。
我有一个3D模型,它已经拥有我梦寐以求的每一个缓冲区:位置,法线,紫外线等。我想修改它的几何形状(移动现有的顶点或创建一个新的顶点),例如,对我的边缘进行倒角。我可以轻松计算新位置和新法线(3D矢量),但我想知道如何计算新的UV(2D矢量),或者更确切地说,从相邻的顶点UVs推导出它们。
如果有人知道如何以通用的方式做到这一点,那可能会很酷。但也许我的特定用例提供了更多有用的数据:
在我的具体用例中,新的顶点(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的主要内容,如果未能解决你的问题,请参考以下文章