M5Stick 上的体感 3D 模型查看器
前段时间做了一个小玩具,如下图所示,也可以看这个视频。写出来记录一下心路历程。
那几日沉迷淘宝推荐流不能自拔,于是在清晨迷糊中买下了一个 M5Stick 带 MPU9250 的版本。不贵,100 元不到的价格,想着买都买了不玩一玩对不起自己的冲动消费。
搭建环境
好久没玩 Arduino 了,上次还是 13 年做的门铃。发现 VSCode 也有插件,比原来的 Arduino app 可好用多了。
其他的依赖和板子信息按照官方文档安装即可。
遇到一个坑,刚开始问了淘宝卖家也没解决。Mojave 上连接了 M5Stick 之后,怎么都看不到对应的串口。但系统设备里可以看到这个设备叫
CP2104 USB to UART Brige Controller
于是顺藤摸瓜,找到了对应的驱动,下载安装重启搞定~~ 顺便告诉了淘宝卖家,希望能帮到今后遇到这个问题的人。
3D图形
首先有兴趣的是屏幕,一个 128x64 的液晶屏,显示些什么比较有意思的呢。网上的例子多是用来显示纯文本。比如原厂的几个例子多是用到了 u8x8。其实我们的 ESP32 这么强大,为啥没人做做 3D 的图形。
于是经过一番研究,发现图形还得用 u8g2。另外我并不熟悉 3D projection 的算法,在动手写一个自己的算法前无意找到了 menehune23/projection,一个非常不错的封装但只有4个star。
简单试了一下发现十分靠谱,改了个他的 demo 画出了一个正立方体。
作者还提供了转换代码,可以把 .obj
的模型轻松转成程序要求的数据格式(虽然这个转换工具其实并不能真的工作,后面会详细展开)。想到之后随意换模型也不难,于是放下没再继续折腾。
体感操作
放了一些时间,突然想起我买的是个带 MPU9250 的版本,Google 了一番发现这个芯片功能也非常强大,如官网所说 gyro + accelerometer + compass 一应俱全(陀螺仪、加速计、磁感应)。那么最简单的,做个体感操作 3D 模型的功能如何。
又是经过一番研究,在 M5Stack 官方库里找到了一个 MPU9250 的封装,虽然 M5Stick(似乎)不能直接用 M5Stack 的库,但这个封装一样可以用。参考官方的 example,用起来并不是难事,不用去了解太多通信的实现。
给之前的程序加上用加速计(绝对位置)来计算用户在各个轴移动的差值,以此作为转动模型的速度。于是一个用倾斜控制模型转动的功能就完成了。还发了推,官方也来点赞了,高兴。
模型转换
有了模型显示和操作,就想要看看换别的模型玩。虽然在即刻上喊了几句希望有人给个模型,不过拿来主义的阴谋最终没有得逞。鉴于我 CGJ18 之前修得一身 C4D 简单建模的功夫,加之当时还真是做了一个即刻图标的 3D 版本,于是轻松撸了一个 3D 的 J 字,多边形不多,适合我们的小硬件。
正如前面提到的,转换的时候出了问题,原作者提供的转换代码只转出了「顶点」,却没有「边」的信息,转出来的是信息都是 nan nan
。看着情形是转换出了计算问题,不得已开始看他的代码。查了 Wikipedia 的 Wavefront .obj file
词条发现 C4D export 的 .obj 并没有 l v1 v2 ...
的信息,而是 f v1/vt1/vn1 ...
这样的格式,原作者在 f
的处理犯了错。改正后提了一个 PR,可惜作者似乎是个电子行业的开发,远离 github 已久,想继续玩下去的朋友就暂时用我的 fork 吧 作者在我发文的第二天中午 merge 了(那么巧,不会是我的文章惊动了他吧 :P)。
之后就成功把即刻模型显示到了小小的屏幕上,帧数还挺高。
开源代码
没什么动力继续做些什么了,于是把代码也放到了 Github 上。
其实理论上这个硬件还可以链接网络,下载 .obj
文件。而且 .obj
转换其实用 C 语言来写也不难,projection 的作者好像也有一个简单的 C 的实现。所以其实完全可以做个从网上下载模型,然后在板上完成转换直接渲染的功能。
另外我没有加 deep sleep 的代码。所以每次都会跑到没电为止。
有兴趣的同学不妨继续玩下去撒。