Math 使用三维顶点绘制二维面

Math 使用三维顶点绘制二维面,math,rotation,trigonometry,face,Math,Rotation,Trigonometry,Face,请容忍我,因为我从来没有处理过与此相关的任何事情,在过去的两周里,我一直在讨论这个问题 我正在开发一个程序,可以从3D模型中读取人脸。通过在XYZ坐标系中连接一系列3或4个顶点来绘制每个面。我的程序(或者至少是意图)将遍历每个人脸,将纹理图像映射到人脸上,然后保存图片。我可以处理后两个部分,但在将面映射到二维曲面时遇到了问题。我无法获得正常值,我相信这会有所帮助。(四边形的顶点将始终位于同一平面上,因此四边形不会“弯曲”) 到 我考虑过的潜在解决方案(但不知道如何实施): 使用两个顶点,计算

请容忍我,因为我从来没有处理过与此相关的任何事情,在过去的两周里,我一直在讨论这个问题

我正在开发一个程序,可以从3D模型中读取人脸。通过在XYZ坐标系中连接一系列3或4个顶点来绘制每个面。我的程序(或者至少是意图)将遍历每个人脸,将纹理图像映射到人脸上,然后保存图片。我可以处理后两个部分,但在将面映射到二维曲面时遇到了问题。我无法获得正常值,我相信这会有所帮助。(四边形的顶点将始终位于同一平面上,因此四边形不会“弯曲”)

我考虑过的潜在解决方案(但不知道如何实施):

  • 使用两个顶点,计算与轴的角度偏差(例如,使用四边形顶部的两个顶点计算旋转Y)。对所有三个轴执行此操作后,我可以将顶点反向旋转,希望使其平坦(我不知道如何从数学上做到这一点)。然而,我看到的这个解决方案的问题是,x坐标可以通过2次旋转(y和z)来改变,而不仅仅是1次(y和z坐标也是如此)
  • 我没有旋转面,而是重新创建了形状。与解决方案1一样,我使用两个顶点。我没有计算旋转,而是计算ege的长度和坡度。然后,我可以在2D空间中绘制同一条线,并对其他边重复。我找到边的斜率,这样我就可以得到相交边上正确的角度(想想极坐标)。我有一个想法如何做到这一点,但我不确定这是最好的解决方案

  • 我想代码答案是可以接受的,但不是必需的。(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坐标


    最后,您还可以根据需要执行二维变换,如平移和二维旋转。

    要获得面上点的二维坐标,需要在同一平面中使用两个正交单位向量。让我们称它们为uv。然后,对于平面中的每个3D点p,其2D坐标为(u.v,v.p),其中“.”是点积

    首先计算曲面的法线。平面上任意两个向量的叉积即可。您可能需要将面上每个角度的叉积相加,以平均出所有错误。将法线的长度规格化为1,并将其称为n

    现在我们需要一个与法线正交的任意向量。选择具有n中最小坐标的轴,沿该轴制作一个单位向量x,沿n移除其分量(即x-=n*(x.n)),并将其长度规格化以获得u

    然后取nu的叉积,得到v