您需要 登录 才可以下载或查看,没有账号?注册
x
Hello . 大家好
今天我们试一下用GPT4帮我们写代码 我是Vee
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 -
|