iOS - 2D图片如何转换成3D?

18
我正在查看一个很酷的应用程序,叫做 Morfo。根据他们的产品描述 -
使用 Morfo 可以快速将朋友脸部照片转换为说话、跳舞、疯狂的 3D 角色!一旦捕捉到,你可以让你的朋友用傻瓜声音说任何你想说的话,摇滚出去,化妆,戴上一对巨大的绿色猫眼睛,突然增加 300 磅等等。
因此,如果您拍摄了史蒂夫·乔布斯的普通 2D 图像并将其输入该应用程序,则会将其转换为该图像的 3D 模型,并且用户可以与之交互。

enter image description here

以下是我的问题 -
1. 他们是如何做到这一点的? 2. iPad 上如何实现这一点? 3. 将2D图像渲染和转换为3D不是计算密集型吗?
非常感谢任何指针、网站或使用objectiveC的库。
更新:此产品的演示显示了morfo如何使用模板机制进行转换。也就是说,在输入2D图像后,需要设置面部边界、眼睛位置、嘴唇大小和长度。然后它会将其转换为3D模型。这部分是如何完成的?他们可能使用了哪些框架或库?

为什么关闭这个问题?有什么问题吗? - Srikar Appalaraju
5
@rob 之所以很宽泛,是因为我不知道从哪里开始。一年前,这还是一个进行此类讨论的地方。但现在,过度热衷于管理已经削弱了乐趣。 - Srikar Appalaraju
@Srikar 我的主要目标:在 iOS 中将 2D 图像转换为 3D。我正在寻找任何可以将 2D 转换为 3D 的 API,也就是说,如果我上传一个 2D 图像到该 API,它应该能够返回一个 3D 图像作为输出。是的,我看过了,但我没有时间学习 opengles。我想知道是否有任何快速解决方案?请帮帮忙! - NSCry
@Srikar。非常感谢!你的帖子让我有了朝着像morfo这样的应用程序前进的希望。正如大家在这里建议的那样,我遵循了所有要点(lamarche教程),模型加载,blender2.64a,将模型导出到obj或.h。一切都进行得很顺利,但现在感觉陷入了困境。没有想到如何进一步发展,因为仍然需要完成更多的工作,如3D动画制作。虽然加载3D模型很好,但他们是如何制作动画模型的呢?请分享你的经验,你是怎么提高的?你已经完成了多远?如果有任何值得赞赏的地方,在此提前致以感谢。 - Splendid
1
@Srikar 我开始了一个悬赏,希望能在这个问题上获得更多的积分。我需要将一个2D图像映射到一个3D人脸上。我需要在openglES中完成这个任务。如果有任何提示或代码片段,那就太好了。 - 2vision2
显示剩余7条评论
4个回答

15

这是一个广泛的问题,但我可以给你指出3D渲染是如何工作的方向,相信我这是一个庞大的主题,背后有数十年的工作,无法在此详细讨论。不确定您对3D渲染技术的了解程度,所以我将介绍一下纹理的基本概念,并为您提供一组良好的教程。

  1. 他们是如何做到这一点的?
    想法是在3D渲染中,3D模型可以用称为纹理映射的2D图像进行纹理化。您可以使用2D图像将其包裹在3D模型周围,无论是简单的基元(例如球体或正方体)还是更高级的模型(例如经典的茶壶或人头模型等)。纹理可以来自任何地方,过去我曾使用相机流中的视频为网格创建纹理,也使用过相机中的照片,这就是他们所做的。因此,这就是面部呈现为3D模型的方式。

  2. 这是否有效率?
    在iOS和大多数移动设备上,3D渲染使用OpenGL ES利用硬件加速。就您的问题而言,这取决于您实现渲染代码的方式,可以非常快。

正如anticyclope所提到的,它使用映射(视频中的比例旋转模板),使纹理适合于模型并放置眼睛,这是他们渲染代码的一部分。

因此,如果您想要掌握此技能,我建议您首先阅读Jeff Lamarche的教程“从头开始”:

http://iphonedevelopment.blogspot.com/2009/05/opengl-es-from-ground-up-table-of.html

其次,我已经阅读了关于OpenGL ES的4本书籍,包括通用设计和特定平台的书籍。我推荐这本书:

这里

是一本关于 iPhone 编程和图形应用开发的书籍,可以在亚马逊上购买。

我认为我知道那个应用程序是如何制作的。首先构建一个通用的3D人头模型。然后,当它将2D照片拍摄并围绕这个3D模型包裹时,你就有了这个应用程序。如果这个流程是正确的,那么你能否尝试回答我上面的问题?如何创建一个通用的3D人头模型?以及如何将2D图像贴在3D模型上?谢谢... - Srikar Appalaraju
1
仔细阅读Lamarche的教程,最后他介绍了如何在Blender中制作模型。我们使用Blender,但是我们的艺术家负责建模,因为我只有3岁孩子用粉彩的艺术技能。但是阅读Lamarche的内容,他向您展示了如何导出.OBJ文件并导入它。但是不要试图在掌握这些知识之前就急于求成,我花了很长时间才理解它,我后悔自己尝试着匆忙应对。那么我可以得到赏金吗? - Dev2rights
@Sirkar,你学习Lamarche的教程怎么样了?我赢得了分数吗? - Dev2rights
尽管@anticyclop提出了一些好的观点,但由于您提供了正确的指引并帮助我提供了链接,因此您获得了赏金。 - Srikar Appalaraju
@Dev2rights,你有没有相机拍摄照片渲染成3D模型的示例代码? - Ajay.km
显示剩余2条评论

9
在我看来,这是他们的做法。这只是我的想法,我没有在现实生活中看到这个应用程序。
他们有一个人头的3D模型。当你在2D图像上点击某些点时,它们会调整3D模型中对应的点,从而表示特定脸部特征,例如眼睛之间的距离、嘴唇的宽度等。接下来,使用控制点将2D图像的纹理应用于3D模型,因此我们有了一个带纹理的人头3D模型。考虑到我们的感知能够从2D图像中重构出三维形状(比如说,我们看着2D照片仍然能想象出一个三维的人物),所以没有必要精确地重建三维形状,纹理就可以完成工作。

2
这一定是他们的做法,因为这种技术并不难。实际上,纹理映射(点击链接查看代码)-从2D平面图像到3D模型的映射-是最基本的3D图形技术之一,并且在硬件中进行了极度优化,使其非常廉价。它是如此基础,我会认为他们自己开发了这个技术,这就是为什么你不会得到类似“使用FaceMapping库”的答案。这就像要求一个库来执行整数加法一样简单。 - Matt
@Matt,这展示了OpenGL的工作原理而不是OpenGLES的工作原理,请注意下面的答案更明确地回答了“在iOS上如何实现”,这也是最初的问题。 - Dev2rights

4

在渲染3D图像时存在一个问题,称为UV映射,它获取3D模型并定义一组边缘,从而创建用于生成不同纹理的图像。

现在,如果您注意到Morfo中,您定义了头部、眼睛、嘴和鼻子的边缘。有了这些信息,Morfo就知道如何将纹理放置到已定义的模型上。

在模型上加载纹理的过程并不复杂,可以在任何支持OpenGL等技术的设备上完成。


1
如果在OpenGLES中可行的话,您能否提供OpenGL中的API以实现此功能? - 2vision2
直接在OpenGL ES中实现并不简单,需要实现多个方面,但你可以通过阅读相关资料开始学习。这里有一篇iPhone的教程可供参考。 - rkmax
谢谢...通过教程,我了解了纹理映射的作用和如何进行纹理映射...那么,在Morfo中,仅仅使用纹理映射就足够了吗?如果可能的话,您能提供更多信息让我开始吗? - 2vision2
我想做和morfo一样的东西,应该怎么做?有什么帮助吗?谢谢。 - Vaibhav Limbani

1
渲染和将2D图像转换为3D不是计算密集型吗?苹果正在投入数十亿美元开发定制芯片,最近的型号在考虑电池寿命和低运行温度(无风扇)的情况下具有令人印象深刻的性能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接