如何只使用手势绘制3D图像
扫描二维码
随时随地手机看文章
该项目使您能够使用手势在3D中绘制,雕刻和制作陶器,在全息图中查看并导出3D打印。
本文档探讨了我们项目的不同阶段,在MDEF硕士课程的IAAC Microchallenge II研讨会期间开发的3D手绘画布。这个项目一开始是一个简单的想法,从我们过去的经验中产生的类似的切线(一个涉及使用手势的2D绘图,另一个涉及以全息格式可视化手部运动),但制作一个更可行的工具,允许实时3D绘图,被可视化为全息图,然后转化为可打印的3D模型。
为了实现这一点,我们开始尝试各种不同的软件工具和编程语言,改进我们的方法以找到最有效的解决方案。虽然这个项目并不完美,但它在一定程度上是有效的,并为我们提供了宝贵的学习点和经验,作为一个团队和未来努力的燃料。
在本文档中,我们将走过我们旅程的每一步,从概念到执行,分享一路上获得的挑战,发现和见解。
Github链接:AuxenceD/HAND-3D-DRAWING:这个存储库是我们在IAAC, MDEF大师的微挑战II周期间的所有工作。我们尝试只用手绘制3D图像,用手识别,我们使用了python, mediapipe, opencv和pygame。
使用p5.js的前几个(三个)方法
在项目的初始阶段,我们考虑过使用p5.js来探索实验的潜力。我们每个人都专注于不同的方面:一个人使用手势识别进行2D绘图,而另一个人使用鼠标控制探索空间中的3D绘图,最终能够将两者结合在一起。
最初的方法之一是尝试在一个象限系统中以对称和旋转的方式复制相同的绘图,以便能够使用放置在屏幕中心的简单DIY全息图来观察投影是如何工作的。从那里开始,我们开始可视化并在明显的3D空间中进行更改。
我们在p5.js中面临的主要挑战之一是深度感知。当尝试使用鼠标绘制3D时,系统通常会将笔画解释为在同一平面上,从而难以创建真正的深度。为了解决这个问题,我们尝试实现一个可移动的2D平面,它将根据面对相机的平面改变方向,允许用户在2D中绘制,但在3D中影响整个空间。然而,这种解决方案也被证明是不可靠和难以控制的,因为图纸变得过于复杂和难以管理。
最终,我们设法创建了一种3D绘图形式,但结果是不可预测的和不一致的,因为绘图只能粘在平面上,并且绘图的平移变得困难。由于缺乏精确性和可控性,p5.js对我们的愿景有很大的限制,这促使我们去探索其他的工具和方法。
所以在所有这些尝试之后,我们决定尝试另一个软件。
探索Three.js
在面对p5.js的限制后,我们转向Three.js,一个专门为3D渲染设计的库。起初,它似乎是我们项目的一个很有前途的工具,为在空间中创建3D绘图提供了更大的灵活性和精度。
然而,我们很快就遇到了一个主要的挑战:我们不熟悉Three.js,并且将它与MediaPipe和opencv(主要用于python)集成起来非常困难。尽管探索了各种各样的资源,但我们发现很少能直接满足我们的特定需求。
由于这些障碍和陡峭的学习曲线,我们决定在早期放弃这种方法,并寻找更适合我们的工作流程和技术限制的替代解决方案。
在Blender上运行Python, OpenCV和MediaPipe
我们探索的另一种方法是将Python, OpenCV和MediaPipe集成到Blender中,直接在3D环境中绘制线条。这似乎是一个有趣的解决方案,因为Blender提供了一个强大的3D空间,使用Python可以让我们更有效地利用手部跟踪和计算机视觉工具。
然而,我们很快就遇到了兼容性问题。Blender需要特定版本的Python和OpenCV,而MediaPipe有自己的版本依赖。试图让所有东西一起工作变成了一个令人沮丧的过程,因为解决一个问题往往会产生另一个问题。我们花了很多时间来排除这些冲突,但在实现我们的实际目标方面进展甚微。
由于这些持续的技术障碍,我们决定不直接在Blender中运行我们的Python代码,而是寻找替代的工作流程来实现我们想要的结果。
用Python和Pygame绘制3D
经过多次迭代和使用其他工具的失败尝试,我们最终使用Python和Pygame在3D空间中绘制。通过利用Pygame可视化3D环境,我们能够创建一个用户可以自由绘制的交互式空间。
我们的第一个突破是成功地使用鼠标绘制3D线条,同时允许实时旋转环境。这对我们之前的p5.js尝试来说是一个重大的改进,因为它让我们可以完全控制深度和视角。然而,在我们让它正常工作之前,实现这个功能需要多次迭代。在我们的GitHub存储库中,该功能在文件draw3d.py中实现。
一旦我们用鼠标进行了基本的3D绘图,我们就转向了更高级的交互方法:使用MediaPipe和OpenCV进行手动跟踪来绘制和控制摄像机。经过多次改进,我们得到了一个令人信服的结果,尽管还有很大的改进空间
我们的系统的核心依赖于一个动态绘图平面,它总是垂直于相机的法线。当摄像机移动时,平面也随之移动,确保绘图面与用户的视角相适应。平面的坐标存储在一个矩阵中,并根据相机的方向不断更新。
对于基于手势的绘图,我们检测拇指和食指之间的距离。如果这个距离低于预定义的阈值(即用户正在进行“捏”动作),则创建点并与线条连接,形成连续的绘图。
为了增强功能,我们还实现了:
截图捕获以保存绘图的不同阶段。
3D对象导入,允许用户在现有模型周围绘制。
出口。obj格式,使得在Blender或Rhino等软件中打开和修改图纸成为可能。
这种方法最终为我们提供了我们一直在寻找的灵活性和深度控制,使我们更接近我们最初的直观,手动控制的3D绘图工具的愿景。
现在,结合捏(左手食指和拇指)绕3D空间旋转和平移的能力,以及捏(右手食指和拇指)绘图的能力,我们终于可以创建一个3D功能环境,也可以生成3D表面,这取决于你能画得多好。
探索新的应用:数字陶器
由于我们达到了我们的初始目标早于预期,我们决定探索替代方法来使用我们的3D绘图系统。其中一个想法是模拟陶轮来创造数字陶器形式。
为了实现这一目标,我们修改了环境,使其以恒定的速度旋转,模仿传统陶轮的运动。当我们在空间中绘画时,我们的笔触形成了圆形图案,使我们能够塑造类似3D陶器形式的东西,而你仍然可以像以前一样(使用你的食指和右手拇指)平移和旋转。
然而,我们很快就遇到了一个限制:我们的图纸仍然只是线条,而不是真正的3D表面。这意味着,虽然我们可以可视化陶器形状,但它们不能直接3D打印。
我们进行了研究,做了几次试验,直到我们终于有了突破。所以,我们有不同的制陶方法:
1. 第一种模式允许你在预先设想的表面上进行雕刻,你可以根据你捏在一起的手指进行添加和减去(食指和拇指添加,中指和拇指减去右手)。
2. 您可以通过使用相同的捏紧机制从头开始创建3D可打印的网格。
以下是在游戏过程中可以帮助你的键盘快捷键:
•Esc:退出应用程序
•C:清理图纸
•R:复位相机(当按下Ctrl键时)。在Profile Pottery模式中,循环渲染模式(实体、线框、点)。
•E:将3D模型导出为STL文件进行3D打印
•G:从当前的绘图线生成曲面
•I:显示绘图信息(线数和面数)
•左移或右移:在绘图模式之间切换(线条,直接雕刻陶器,轮廓陶器)
•选项卡:循环通过活动参考网格平面(XY, XZ, YZ)
•V:切换顶点的可见性(线与线之间的连接点)
•空间:切换陶器旋转开关(仅适用于陶器模式)
•P:在Profile Pottery模式下,切换Profile line的可见性
•Ctrl+Z:在Profile Pottery模式下,撤销上次Profile的修改
•方向键(左,右,上,下):移动摄像机
•W:把镜头向前移动(进入场景)
•S:向后(移出镜头)
本文编译自hackster.io