GPT-4能搞定小众的脚本代码么?
14109 0
实名

通过了实名认证的内容创造者

发布于 2023-4-27 12:07:50

您需要 登录 才可以下载或查看,没有账号?注册

x

81206981b603f57a91c07389ac43df78.jpg




Hello . 大家好
今天我们试一下用GPT4帮我们写代码
我是Vee


a8e7f8990925571c6f19c9a600dbce26.png


ChatGPT有没有帮大家提升了很多工作效率?我们也来蹭蹭热度试一下用它来写小众代码,比如CityEngine的CGA建筑生成规则脚本。

先尝试过ChatGPT后,觉得这篇文章完全没有写的必要了,它基本没有写出过能用的规则。于是砸重金升级Plus之后,我们来试试GPT-4的表现如何。


1  整体描述规则
首先我们试着描述整个规则,让GPT-4直接生成最终代码。
第一次生成的代码运行报错,直接将报错位置反馈给GPT-4,修改代码,7次debug后,GPT-4终于给出了可以顺利运行的如下代码:
version "1.0"
attr buildingHeight = 50
attr facadeColor = "#808080"attr windowColor = "#1C1C1C"attr groundFloorColor = "#4B4B4B"attr roofColor = "#595959"
@StartRuleLot -->    extrude(buildingHeight) Building    comp(f) { top: Roof | side: Facade | bottom: GroundFloor }
Facade -->    split(y){ ~floor(rand(2, 4)) : Floor }*    comp(f) { all: FacadeElement }
Floor -->    split(x){ ~floor(rand(3, 6)) : Window | ~1 : Wall }*
FacadeElement -->    case geometry.area < 1 : Wall    else: Window
Window -->    color(windowColor)    set(material.name, "Window")    s(scope.sy / scope.sx, 1, 1)    projectUV(0)    i("builtin:cube")
Wall -->    color(facadeColor)    set(material.name, "Wall")    s(scope.sy / scope.sx, 1, 1)    projectUV(0)    i("builtin:cube")
GroundFloor -->    color(groundFloorColor)    set(material.name, "GroundFloor")    s(scope.sy / scope.sx, 1, 1)    projectUV(0)    i("builtin:cube")
Roof -->    color(roofColor)    set(material.name, "Roof")    s(scope.sy / scope.sx, 1, 1)    projectUV(0)    i("builtin:cube")
一眼看去莫名其妙他为什么要给我插这么多cube到这个楼上,运行了一下这个结果让人崩溃,这就是GPT-4眼中通用的写字楼:

2  分步引导生成
想象一下将外观描述得非常细致让GPT-4生成整个代码然后再帮它Debug会是一个非常痛苦的过程,我们再尝试一下按照步骤,一步一步引导它逐步丰富代码是否可行。

首先做一个简单的切分。
上图中GPT-4给出代码如下:
version "1.0"
attr height = 10.0 // 控制立方体的总高度,您可以根据需要更改
Lot -->    extrude(height) Building
Building -->    comp(f) { top: Roof | side: Facade | bottom: Bottom }
Bottom -->    color("#808080")
Facade -->    split(y){ 4: BottomFacade | ~1: TopFacade }
BottomFacade -->    color("#00ff00")
TopFacade -->    color("#0000ff")
Roof -->    color("#ff0000")
运行结果:


不错的开始,甚至还帮我们对不同的部分区分了材质,代码备注也很贴心。

接下来试一下横向切割楼层,纵向切割窗户,顺便把默认高度改一下。


上图中GPT-4给出代码如下:
version "1.0"
attr height = 50.0 // 修改建筑物的总高度为 50 米
Lot -->    extrude(height) Building
Building -->    comp(f) { top: Roof | side: Facade | bottom: Bottom }
Bottom -->    color("#808080")
Facade -->    split(y){ 4: BottomFacade | ~1: UpperFloors }
BottomFacade -->    color("#00ff00")
UpperFloors -->    split(y){ 3: Floor }* // 每层高度为 3 米
Floor -->    split(x){ ~0.8: Wall | 0.8: Window }* // 每层等比切分出宽度为 0.8 米的窗户
Wall -->    color("#0000ff")
Window -->    color("#ffffff") // 窗户颜色为白色
Roof -->    color("#ff0000")
运行结果:


堪称完美,除了我们给的窗户宽度小了点。将错就错,直接放飞自我继续测试。先让它把前面定义的窗户部分挤出一个厚度,顺便在底层切个门出来。


上图中代码如下:
version "1.0"
attr height = 50.0 // 修改建筑物的总高度为 50 米attr windowExtrudeDepth = 0.15 // 窗户挤出深度为 15 厘米attr doorWidth = 2.5 // 门的宽度为 2.5 米
Lot -->    extrude(height) Building
Building -->    comp(f) { top: Roof | side: Facade | bottom: Bottom }
Bottom -->    color("#808080")
Facade -->    split(y){ 4: BottomFacade | ~1: UpperFloors }
BottomFacade -->    split(x) { ~doorWidth: Wall | doorWidth: Door | ~doorWidth: Wall } // 在底层的每个面中间切分出一个宽度为 2.5 米的门    Door -->        color("#ff9900") // 门的颜色为橙色
UpperFloors -->    split(y){ 3: Floor }*
Floor -->    split(x){ ~0.8: Wall | 0.8: Window }*
Wall -->    color("#0000ff")
Window -->    extrude(windowExtrudeDepth) // 将窗户挤出 15 厘米    color("#ffffff") // 窗户颜色为白色
Roof -->    color("#ff0000")
运行结果:


依然完美,继续加工,给一楼做个屋檐,再把屋顶的结构做出来。


上图中代码如下:
version "1.0"
attr height = 50.0 // 修改建筑物的总高度为 50 米attr windowExtrudeDepth = 0.15 // 窗户挤出深度为 15 厘米attr doorWidth = 2.5 // 门的宽度为 2.5 米attr eaveHeight = 1.5 // 屋檐高度为 1.5 米attr roofInset = 0.5 // 屋顶缩进为 50 厘米attr roofExtrudeDepth = 1.0 // 屋顶向下挤出深度为 1 米
Lot -->    extrude(height) Building
Building -->    comp(f) { top: Roof | side: Facade | bottom: Bottom }
Bottom -->    color("#808080")
Facade -->    split(y){ 4: BottomFacade | eaveHeight: Eave | ~1: UpperFloors } // 底层上面再挤出 1.5 米的屋檐
Eave -->    extrude(eaveHeight)    color("#804000") // 屋檐颜色为棕色
BottomFacade -->    split(x) { ~doorWidth: Wall | doorWidth: Door | ~doorWidth: Wall } // 在底层的每个面中间切分出一个宽度为 2.5 米的门    Door -->        color("#ff9900") // 门的颜色为橙色
UpperFloors -->    split(y){ 3: Floor }*
Floor -->    split(x){ ~0.8: Wall | 0.8: Window }*
Wall -->    color("#0000ff")
Window -->    extrude(windowExtrudeDepth) // 将窗户挤出 15 厘米    color("#ffffff") // 窗户颜色为白色
Roof -->    inset(roofInset) // 屋顶缩进 50 厘米    extrude(-roofExtrudeDepth) // 屋顶向下挤出 1 米    color("#ff0000")   


我们给它一次机会,只提示它报错位置,看看会不会一次改对。

上图中代码如下:
version "1.0"
attr height = 50.0 // 修改建筑物的总高度为 50 米attr windowExtrudeDepth = 0.15 // 窗户挤出深度为 15 厘米attr doorWidth = 2.5 // 门的宽度为 2.5 米attr eaveHeight = 1.5 // 屋檐高度为 1.5 米attr roofInset = 0.5 // 屋顶缩进为 50 厘米attr roofExtrudeDepth = 1.0 // 屋顶向下挤出深度为 1 米
Lot -->    extrude(height) Building
Building -->    comp(f) { top: Roof | side: Facade | bottom: Bottom }
Bottom -->    color("#808080")
Facade -->    split(y){ 4: BottomFacade | eaveHeight: Eave | ~1: UpperFloors } // 底层上面再挤出 1.5 米的屋檐
Eave -->    extrude(eaveHeight)    color("#804000") // 屋檐颜色为棕色
BottomFacade -->    split(x) { ~doorWidth: Wall | doorWidth: Door | ~doorWidth: Wall } // 在底层的每个面中间切分出一个宽度为 2.5 米的门    Door -->        color("#ff9900") // 门的颜色为橙色
UpperFloors -->    split(y){ 3: Floor }*
Floor -->    split(x){ ~0.8: Wall | 0.8: Window }*
Wall -->    color("#0000ff")
Window -->    extrude(windowExtrudeDepth) // 将窗户挤出 15 厘米    color("#ffffff") // 窗户颜色为白色
Roof -->    innerRectangle(roofInset, roofInset, 0, 0) // 屋顶缩进 50 厘米    extrude(-roofExtrudeDepth) // 屋顶向下挤出 1 米    color("#ff0000")
于是直接提醒它正确的操作让它改。GPT-4又毫不犹豫地进行了道歉。

上图中代码如下:
version "1.0"
attr height = 50.0 // 修改建筑物的总高度为 50 米attr windowExtrudeDepth = 0.15 // 窗户挤出深度为 15 厘米attr doorWidth = 2.5 // 门的宽度为 2.5 米attr eaveHeight = 1.5 // 屋檐高度为 1.5 米attr roofInset = 0.5 // 屋顶缩进为 50 厘米attr roofExtrudeDepth = 1.0 // 屋顶向下挤出深度为 1 米
Lot -->    extrude(height) Building
Building -->    comp(f) { top: Roof | side: Facade | bottom: Bottom }
Bottom -->    color("#808080")
Facade -->    split(y){ 4: BottomFacade | eaveHeight: Eave | ~1: UpperFloors } // 底层上面再挤出 1.5 米的屋檐
Eave -->    extrude(eaveHeight)    color("#804000") // 屋檐颜色为棕色
BottomFacade -->    split(x) { ~doorWidth: Wall | doorWidth: Door | ~doorWidth: Wall } // 在底层的每个面中间切分出一个宽度为 2.5 米的门    Door -->        color("#ff9900") // 门的颜色为橙色
UpperFloors -->    split(y){ 3: Floor }*
Floor -->    split(x){ ~0.8: Wall | 0.8: Window }*
Wall -->    color("#0000ff")
Window -->    extrude(windowExtrudeDepth) // 将窗户挤出 15 厘米    color("#ffffff") // 窗户颜色为白色
Roof -->    offset(roofInset) // 屋顶缩进 50 厘米    extrude(-roofExtrudeDepth) // 屋顶向下挤出 1 米    color("#ff0000")

手动修改代码如下:
version "1.0"
attr height = 50.0 // 修改建筑物的总高度为 50 米attr windowExtrudeDepth = 0.15 // 窗户挤出深度为 15 厘米attr doorWidth = 2.5 // 门的宽度为 2.5 米attr eaveHeight = 1.5 // 屋檐高度为 1.5 米attr roofInset = -0.5 // 屋顶缩进为 50 厘米attr roofExtrudeDepth = 1.0 // 屋顶向下挤出深度为 1 米
Lot -->    extrude(height) Building
Building -->    comp(f) { top: Roof | side: Facade | bottom: Bottom }
Bottom -->    color("#808080")
Facade -->    split(y){ 4: BottomFacade | 0.1: Eave | ~1: UpperFloors } // 底层上面再挤出 1.5 米的屋檐
Eave -->    extrude(eaveHeight)    color("#804000") // 屋檐颜色为棕色
BottomFacade -->    split(x) { ~doorWidth: Wall | doorWidth: Door | ~doorWidth: Wall } // 在底层的每个面中间切分出一个宽度为 2.5 米的门    Door -->        color("#ff9900") // 门的颜色为橙色
UpperFloors -->    split(y){ 3: Floor }*
Floor -->    split(x){ ~0.8: Wall | 0.8: Window }*
Wall -->    color("#0000ff")
Window -->    extrude(windowExtrudeDepth) // 将窗户挤出 15 厘米    color("#ffffff") // 窗户颜色为白色
Roof -->    offset(roofInset) // 屋顶缩进 50 厘米    comp(f){inside:Roof_I|border:Roof_O}Roof_O -->    extrude(roofExtrudeDepth) // 屋顶向下挤出 1 米(屋顶外圈向上挤出1米)    color("#ff0000")

45行做完offset之后,用comp将屋顶分为内外两部分,再对外部进行挤出。


完成上面的例子之后,我又做了几次测试,GPT-4每次的表现结果不一,经常出现的问题是自己捏造操作函数和参数格式用错。

最后看一下UE中加了材质的渲染效果,图里的楼没有用本文写的规则,本文写的规则出来的效果应该会更好,不过懒得试了:





- End -


   

8e3187475ccd0992c220e2f4d7ddee34.png
91278315603c3013241eee37a92bea7d.png
还没有设置签名!您可以在此展示你的链接,或者个人主页!
使用道具 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表