起因只是因为我买了一批钻头,想随手画个盒子。然后我想在模型上直接刻上钻头直径,省的我贴标签。然后又想到我经常会买各种规格组合的钻头,每次去建模去修改也挺麻烦的,就准备用openscad做个参数化模型,目标是我只需要输入一堆钻头直径,它就会自动生成合适的模型。然后就想试试看,看AI能否帮我把这个事情给办了。
于是我开了claude 3.5 sonnet,把需求输入进去:
渲染下结果是这样的:
这个结果怎么说呢,有点意思,但很明显有一些小错误,比如文字并没有刻上。我实际看了下是因为它把文字的坐标差了1mm,导致雕了个空气。但这些只是无伤大雅的小问题,我让他自己检查下,告诉他:“标记文字这里好像有点问题,我完全没看到文字在哪里,你检查下是不是坐标错了”,它就自己修好了:
然后这个结果虽然能用,但也太呆板了,我告诉他:“文字这样刻不容易看到,我希望上边做个倒角,然后文字刻在倒角上,你能帮我调整吗?”,结果它就又一次几乎做对了:
当然,实际上文字是并没有刻在模型上的,我这里只是高亮了文字雕刻的部分,来确认发生了什么问题。它把坐标算错了一点点,于是刚好擦肩而过没雕刻上,但它已经几乎做对了。而且说实话我描述的是很含糊的,它完全get到了我的意图。比如我后来换了个AI,这个AI做出来就是这个样子的:
文字没切对位置之类的问题先不提,这个AI完全没理解我做倒角是为了什么,所以它给我整体做了倒角,而不像claude.ai精确的理解我的需求。但claude.ai在细节上算出来的值总是差了几毫米,虽然它几乎是做对了,但还是需要我自己来微调下参数值:
下面需要进一步实现多排堆叠的功能,我告诉他:“下面第二步,因为小的钻头和大的钻头体积相差极大,我需要分两排做,所以你能把代码改成多排设计吗?具体第一排放多大的第二排放多大的可以不用管,你把代码写好,我根据情况调整”,然后它给我做成了这样:
我告诉他:“你理解的不太对,第一排肯定比第二排的钻头小,所以第一排肯定比第二排矮,这样才能实现多排堆叠同时不干扰后面的”。但结果它只是调整了下顺序,整个模型还是和这次差不多。于是我开始喷它:“怎么感觉你还是没get到我的想法?每排都有自己的高度,前排矮后排高,你这里整个就是一个盒子”,然后它给了我这个:
这个模型很显然已经体现了三排堆叠,每排高度不同的效果,只是堆叠的不正确,都混到一起去了。我稍微看了下它的代码,发现它犯了一个弱智错误,继续指出:“你应该知道openscad是functional的吧?这种y_offset=y_offset+xxx的形式肯定是不work的”。然后它意识到自己的错误之后,就改对了:
三排的间距是它自己设置的,只要把参数改成0就会贴合在一起,这恰恰也是我需要的,当然刻字以及钻孔的问题我先忽略,这些都是坐标系数值上的微调。我先让它把核心逻辑做对,于是我接着告诉它:“我看到有一些效果,但还是有根本性的问题。这里最大的问题是宽度不确定,你只能约定一个值。实际上这个值应该用三排里面的最大值。所以你这么做,create_row里传入宽度值,并把钻头孔均匀平铺在这个宽度值内。这样三排就等宽,并且也不会显得很挤了。”
这次的结果和上次差不多,我看了下它内部用了一些比较复杂的坐标系转换逻辑,自己把自己绕晕了。于是继续指出:“create_row这里不需要传入y_pos,默认圆点开始计算,最后整体平移拼接起来。否则有些细节你算不清”。然后它给了我这个结果:
虽然看起来这个结果更糟了,但其实恰恰相反,它已经在逻辑层面做正确了,出错的只是坐标值上的一些偏移量没算好,我简单补偿下就搞好了:
后面我还进行了大概7-8次对话,基本都是在修正各种小问题和小细节,比如我要求他孔要安装中心对齐,孔位要均匀平铺分布,要考虑两边的留白,要调整每层的高度等等。一番对话之后基本达到了我的预期:
打印出来之后把钻头丢进去,发现一个问题,它对于钻头长度的估算太简单粗暴了,直接按照直径乘以一个系数,以至于钻头越粗,对长度的估算就约高估:
继续让它修复,告诉它问题:“但我发现一个小问题,就是钻头的长度估算并不准确,比如3.2mm的钻头长60mm左右,5.2长70,7长85,8.5长90,9.5长95。很显然他们并不按照一个直径与长度完全相等的关系。你应该知道标准钻头的尺寸规格数据,你能否建立一个函数,能更准确的获得钻头的近似长度呢?因为我们的模型长度偏离太离谱了,以致于对于9.5以后的钻头,一半的长度可以磨灭整支钻头,取出很不方便了。”
结果它就按照DIN 338标准,写出了一个分段函数能准确估算钻头的长度。更进一步我要求它把钻头也渲染出来方便我观察它到底做的如何,它也是迅速搞定:
最后打印出来的效果(顺便,这种镶嵌钻头是垃圾,这镶嵌的绝对不是合金钢的,我感觉只是M35高速钢,总之看到这种几块钱一支的称镶的是合金钢的不要买就对了)
其实光这个例子可能大家觉得还不算很夸张,毕竟这个零件比较简单,真自己用solidworks建模也就是分分钟的事,但下一个例子就没这么简单了,这是我朋友的需求,要做一个多口挤出头,能把一段压入的肉泥均匀分配到10个出口。我大概跟ai聊了7个版本,得到最终的结果:
这个和上一个一样,里面没有一行是我写的代码,一切都是让AI写的,我只进行一些参数微调。虽然从外观上看还挺丑的,但这只是因为我不关心外观,这个分配挤出头重点是内部的腔道,因为近得要走的距离比远端要短,所以近处挤出压力小,中心挤出量会大于两边的挤出量,因此要进行压力补偿,我也是把这些问题和思路描述给AI,让它自己构造一个函数能动态调整近端和远端内部的管道直径,从而微调补偿这个压力值:
当然具体的补充值还是需要通过试验确定,但重点是,这样的模型代码可以通过聊天,在半小时左右就能让AI准备好,我们只需要调整参数多打几个模型做下实验就行了,这在以前是不可能的。gpt4刚出来的时候我就评估过它进行3d建模的能力,可以说约等于幼儿园小朋友画画,完全无法实用。但现在claude 3.5 sonnet已经可以用来解决一些事情了,虽然这些模型依然是一目了然般的简单,但记住AI并不像人类一样可以跑下代码看到模型的样子,这里面的一切都是需要自行脑补的。即使是我,也不一定能在不运行openscad观察结果的前提下,完全凭借想象力把代码写正确。曾经我判断AI对三维世界还缺乏足够的理解力,现在我已经不能再这么说了。