2025-3-5-中南海改造-第6个建筑

这个建筑来自天地玄黄式建筑的变化,设计参考来源于20250104的blend,手动拼接了下面3个

再加上了天地玄黄1式的立柱铺垫1层,有了下面这个立面参考,这栋完全是盒子房,结构上没啥难度,技术细节方面。

1.楼顶的紧密宽度不同且有厚度差次不齐的钢琴键式栅格,我用一个blender python script实现了一键创建。

2.顶楼的金属阵列窗花我查找pinterest door grill\window grill作为参考对于一个圆圈截取部分修改收尾然后上下对称,再mirror左右旋转90度成为4叶草型,把曲线添加bevel厚度,注意段数保持原样即可这种装饰在顶楼远看就看个大概,我一开始添加16分段,之后拿去阵列成型后模型面数太高blender都卡了。

3.顶楼与中间层当中有一圈像cobble stone的东西我打算用材质实现

创建具有随机宽度和厚度的立方体栅格阵列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

import bpy
import random

# 删除所有对象(包括默认立方体)
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)

# 创建 10 个立方体
cubes = []
for i in range(10):
bpy.ops.mesh.primitive_cube_add(size=1, location=(0, 0, 0))
cube = bpy.context.object
cube.name = f"Cube_{i+1}"
cubes.append(cube)

# 设置随机宽度(X)和厚度(Y),高度(Z)固定
for cube in cubes:
cube.scale.x = random.uniform(0.05, 0.06) # 随机宽度
cube.scale.y = random.uniform(0.1, 0.135) # 随机厚度
cube.scale.z = 0.646 # 高度固定

# 将所有立方体原点设置为几何中心
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY')

# 打乱立方体顺序
random.shuffle(cubes)

# 沿 X 轴无缝排列立方体
current_x = 0
for cube in cubes:
cube_width = cube.dimensions.x
cube.location.x = current_x + cube_width / 2
cube.location.y = 0
cube.location.z = 0
current_x += cube_width

# 输出调试信息
print(f"Cube '{cube.name}':")
print(f" Location X: {cube.location.x:.4f}")
print(f" Dimensions X: {cube.dimensions.x:.4f}")
print(f" Next start X: {current_x:.4f}")

最终做出来的效果window grill部分要很近距离才能看清楚,我试着对grill提取曲线重新生成,中远距离看起来可以,这种规则排列的grill虽然传输起来卡占用面数高但是好像还是做mesh好,我发现用midjourney好像不太好生产这种整齐的几何体排列。

不规则宽度厚度层次栅格只有近距离能看出来,远处完全看不出,说明厚度不够,调整厚度之后还是可以的。

这次建筑所有内景都用busStop那个内景材质,之前我也发现了个别需要旋转不规则角度,原来和uv有关系,一般来说对于整体部件打包让bakemaster unwrap不会发生这种情况。busStop内景材质我加入了uvscale,无需对内景uv做后期手动调大小,今天做了些调整后它的玻璃反射对天空的映射趋于完美了,配合blueprint修改了custum num data可以按照空间位置随机分配。内景scale为-1的mesh会出现显示有“薄暮”的怪相,另一方面scale-1意味着内景镜像显示若有重复也会显得诡异,因此对于包含内景的mesh需要解除instance然后apply scale再重新link object data成为instance,这里让chatgpt写了个python script解决了,注意不必对所有scale -1的mesh做这个带来额外的mesh。

自动筛选所有scale为 -1的mesh,解除instance,apply scale,再建立instacne
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

import bpy

def select_negative_scale_objects():
# 取消所有对象的选中状态
bpy.ops.object.select_all(action='DESELECT')

for obj in bpy.context.scene.objects:
if obj.type == 'MESH': # 只筛选网格对象
# 检查对象是否在任意轴上有 -1 的缩放
if any(s == -1 for s in obj.scale):
obj.select_set(True) # 选中对象
print(f"Selected: {obj.name}")

def unlink_apply_relink():
selected_objects = bpy.context.selected_objects
if not selected_objects:
print("No objects selected.")
return

# 记录原来的 Object Data 关联情况
obj_data_map = {}
for obj in selected_objects:
if obj.type == 'MESH':
mesh = obj.data
if mesh.name not in obj_data_map:
obj_data_map[mesh.name] = []
obj_data_map[mesh.name].append(obj)

# 解除链接(复制 mesh data)
for obj in selected_objects:
if obj.type == 'MESH':
obj.data = obj.data.copy()

# 应用缩放
bpy.ops.object.transform_apply(location=False, rotation=False, scale=True)

# 重新建立 Link Object Data
for mesh_name, objs in obj_data_map.items():
if len(objs) > 1:
shared_mesh = objs[0].data
for obj in objs[1:]:
obj.data = shared_mesh

print("Unlink, apply scale, and relink completed.")

# 运行函数
select_negative_scale_objects()
unlink_apply_relink()


bakemaster 每次自动的smart uv unwrap烘焙部分mesh的packed a texture不理想,导致最终显示的污渍、水渍很不正常,原因多种多样,这次由于起初忘记导入packed A texture发现其实对于没有雕花的建筑其立体感还是过得去的,金属部分稍微差一些,或许意味着建筑制作时,先不用太在意packed A texture?从以往经历来看,这部分到最后要花不少力气做修复。

2025-5-24-midjourney生产blend建筑部件 2025-5-19-midjourney中式连环画

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×