【问题标题】:Draw 2D face with 3D vertices用 3D 顶点绘制 2D 面
【发布时间】:2019-04-24 02:16:26
【问题描述】:

请多多包涵,因为我从未处理过与此相关的任何事情,而且过去 两周我一直在处理这个问题。

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

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

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

我猜,代码答案被接受但不是必需的。 (VB、C#、JS,无论你喜欢什么)我也想知道我正在做的事情背后的数学原理。鼓励详尽的解释。

【问题讨论】:

    标签: math rotation trigonometry face


    【解决方案1】:

    一种方法是计算将面法线映射到(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)
    

    一旦你有了这个,你就可以将旋转应用到脸部(例如,converting the rotation to a rotation matrix)。然后,只需放下 z 坐标。

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

    【讨论】:

      【解决方案2】:

      要获得面上点的 2D 坐标,您需要在同一平面上的两个正交单位向量。我们称它们为 uv。那么对于平面中的每个 3D 点 p,其 2D 坐标为 (u.v, v.p),其中 '.'是点积。

      首先计算表面的法线。平面中任何两个向量的叉积都可以。您可能想四处走动,将面部每个角度的叉积相加,以平均所有错误。将法线的长度归一化为 1 并将其命名为 n

      现在我们需要一个与法线正交的任意向量。选取n中坐标最小的轴,沿该轴做一个单位向量x,去掉其沿n的分量(即 >x -= n*(x.n)) 并对其长度进行归一化得到u

      那么只需将nu的叉积得到v

      【讨论】:

        猜你喜欢
        • 2015-12-18
        • 2018-05-29
        • 2014-06-07
        • 1970-01-01
        • 2023-04-09
        • 2015-04-16
        • 1970-01-01
        • 2014-01-31
        • 1970-01-01
        相关资源
        最近更新 更多