math - 用 3D 顶点绘制 2D 面
问题描述
请多多包涵,因为我从未处理过与此相关的任何事情,而且过去两周我一直在处理这个问题。
我正在开发一个从 3D 模型中读取人脸的程序。通过在 XYZ 坐标中连接一系列 3 或 4 个顶点来绘制每个面。我的程序(或至少是意图)将遍历每个面部,将纹理图像映射到面部,然后保存图片。我可以处理后两个部分,但我无法将人脸映射到 2D 表面。我无法访问法线,我相信这会有所帮助。(四边形的顶点将始终位于同一平面上,因此四边形不会“弯曲”)。
至
我考虑过的潜在解决方案(但不知道如何实施):
- 使用 2 个顶点,计算与轴的角度偏差(例如,使用四边形的顶部 2 个顶点来计算旋转 Y)。在对所有三个轴执行此操作后,我可以将顶点旋转相反的旋转以希望使其平坦(我不知道如何在数学上做到这一点)。但是,我在此解决方案中看到的问题是 x 坐标可以通过 2 次旋转(y 和 z)来更改,而不仅仅是 1 次(y 和 z 坐标也是如此)。
- 我没有旋转脸部,而是重新创建了形状。就像在解决方案 1 中一样,我使用两个顶点。我没有计算旋转,而是计算 ege 的长度和斜率。然后,我可以在 2D 空间中绘制同一条线并重复其他边缘。我找到了边缘的斜率,所以我可以得到正确的相交边缘的角度(想想极坐标)。我对如何做到这一点有一个想法,但我不确定这是最好的解决方案。
我猜,代码答案被接受但不是必需的。(VB、C#、JS,无论你喜欢什么)我也想知道我正在做的事情背后的数学原理。鼓励进行详尽的解释。
解决方案
要获得面上点的 2D 坐标,您需要在同一平面上的两个正交单位向量。我们称它们为u和v。然后对于平面中的每个 3D 点p,其 2D 坐标为(uv, vp),其中 '.' 是点积。
首先计算曲面的法线。平面中任何两个向量的叉积都可以。您可能想四处走动,将面部每个角度的叉积相加,以平均所有错误。将法线的长度标准化为 1 并将其称为n。
现在我们需要一个与法线正交的任意向量。在n中选择坐标最小的轴,沿该轴创建一个单位向量x,沿n移除其分量(即x -= n*(xn))并将其长度归一化以获得u。
然后只需取n和u的叉积即可得到v。
推荐阅读
- reactjs - 架构 x86_64 react-native firebase 的未定义符号
- regex - xml 模式检查因模式匹配而失败
- javascript - 异步 forEach 循环返回一个数组
- r - 如何从 R 中的数据框列表中选择特定值?
- python - 基于生成器的协程在 python 3.7 中被弃用
- apache-spark - SparkSQL - 提取多个正则表达式匹配(仅使用 SQL)
- amazon-web-services - 本地 Docker 运行失败(未找到清单中指定的程序集)
- mysql - MySQL 如何处理对非关键属性的选择查询?
- jquery - 通过搜索/过滤部分选项文本和输出值作为 jQuery 变量从选择选项中获取值
- r - 通过 R 中的 googlesheets4 从 googledoc 将日期列作为列表导入