Math 使用三维顶点绘制二维面
请容忍我,因为我从来没有处理过与此相关的任何事情,在过去的两周里,我一直在讨论这个问题 我正在开发一个程序,可以从3D模型中读取人脸。通过在XYZ坐标系中连接一系列3或4个顶点来绘制每个面。我的程序(或者至少是意图)将遍历每个人脸,将纹理图像映射到人脸上,然后保存图片。我可以处理后两个部分,但在将面映射到二维曲面时遇到了问题。我无法获得正常值,我相信这会有所帮助。(四边形的顶点将始终位于同一平面上,因此四边形不会“弯曲”) 到 我考虑过的潜在解决方案(但不知道如何实施):Math 使用三维顶点绘制二维面,math,rotation,trigonometry,face,Math,Rotation,Trigonometry,Face,请容忍我,因为我从来没有处理过与此相关的任何事情,在过去的两周里,我一直在讨论这个问题 我正在开发一个程序,可以从3D模型中读取人脸。通过在XYZ坐标系中连接一系列3或4个顶点来绘制每个面。我的程序(或者至少是意图)将遍历每个人脸,将纹理图像映射到人脸上,然后保存图片。我可以处理后两个部分,但在将面映射到二维曲面时遇到了问题。我无法获得正常值,我相信这会有所帮助。(四边形的顶点将始终位于同一平面上,因此四边形不会“弯曲”) 到 我考虑过的潜在解决方案(但不知道如何实施): 使用两个顶点,计算
我想代码答案是可以接受的,但不是必需的。(VB、C#、JS,不管你喜欢什么)我也想知道我所做的事情背后的数学原理。鼓励详细解释。一种方法是计算将面法线映射到
(0,0,1)
的旋转。将该旋转应用于面将使其位于xy平面中
要计算面法线,请取任意三个点p1、p2、p3
并进行计算
n = normalize((p2 - p1) x (p3 - p1)),
其中,x
是叉积
然后,旋转轴为:
rotAxis = n x (0, 0, 1) = (ny, -nx, 0)
旋转角度为:
cos rotAngle = n * (0, 0, 1) = nz
sin rotAngle = sqrt(1 - nz * nz)
完成此操作后,可以将旋转应用于面(例如,通过)。然后,简单地放下z坐标
最后,您还可以根据需要执行二维变换,如平移和二维旋转。要获得面上点的二维坐标,需要在同一平面中使用两个正交单位向量。让我们称它们为u和v。然后,对于平面中的每个3D点p,其2D坐标为(u.v,v.p),其中“.”是点积 首先计算曲面的法线。平面上任意两个向量的叉积即可。您可能需要将面上每个角度的叉积相加,以平均出所有错误。将法线的长度规格化为1,并将其称为n 现在我们需要一个与法线正交的任意向量。选择具有n中最小坐标的轴,沿该轴制作一个单位向量x,沿n移除其分量(即x-=n*(x.n)),并将其长度规格化以获得u 然后取n和u的叉积,得到v