math - 绘制带有 3D 顶点的 2D 面

标签 math rotation trigonometry face

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

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

Face in 3D space

Face in 2D space

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

  1. 使用 2 个顶点,计算与轴的角度偏差(例如,使用四边形的顶部 2 个顶点来计算旋转 Y)。 Using delta X and delta Y to calculate rotation Y对所有三个轴执行此操作后,我可以将顶点旋转相反的旋转,以希望使其平坦(我不知道如何在数学上做到这一点)。然而,我在这个解决方案中看到的问题是,x 坐标可以通过 2 次旋转(y 和 z)进行更改,而不仅仅是 1 次(y 和 z 坐标也是如此)。
  2. 我没有旋转脸部,而是重新创建了形状。与解决方案 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)

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

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

关于math - 绘制带有 3D 顶点的 2D 面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55821460/

相关文章:

php - 添加百分比的更优雅的方式?

function - 神经激活函数 - Logistic/Tanh/等之间的差异

java - DecimalFormat 未正确格式化我的数字

javascript - 从旋转的元素中查找元素的实际高度和宽度

python - 三角恒等式

android - 绘制行进路径的最佳方法

algorithm - 如何生成二维凹多边形的 "inner shape"?

python - sge-pygame 旋转父子 Sprite

java - 旋转对象以放置在二维数组中

c++ - 在 C++ 中实现 Rodrigues 的旋转公式时遇到问题