2024-12-27-中南海改造-第3个建筑

第3栋建筑初始参考是这个后来不知道为什么被我完全推翻按照图2来做了,我的想法是按照图2把图1的里面两个建筑合二为一,但是整体风格好像味道变了。

为了让转角连接上我做了环绕柱廊,折边黑墙。立柱方面用相交圆做了层叠再分段选循环面法线挤出然后旋转复制夹1个立方体,柱头成功测试了复杂雕花用curve deform变形吸附柱头,不过这个方法只能对垂直方向一体化拉伸的柱头,对于科林斯这种有上下缩进的还没测试,感觉上可以用lattice来调整局部缩放。再是duplicate along curve添加了cornice下面的滴水式雕花。二楼的拱门上镶金是提取曲线后给厚度转换mesh而成的,这个技巧很实用,对强调边缘立体的装饰能轻松解决。一楼隐约看是两个窗格,我在大门的间距上没处理好这个比例看起来有问题,或者说问题出在了整体的长宽设置就不合理?相对于原图而言我拉长了很多,但没有额外配套的房型,这样显得黑色折叠墙十分单调。其实这涉及另一个问题就是当给定地块后,只是参考设计效果图,并不好照搬,涉及比例问题尽管可以用midjourney生产相似,持续抽到比例合适的,但这么做有些耗时,有时候自己想当然就动手“微调”结果样式、部件到位了却因为比例问题整体上看还是不满意。图2我改了下比例明显感觉好点了,到时候看情况是不是要调整。

房型单一的问题或许可以通过imagine extend 图片参考建筑类型来解决,比如8 storey 12 storey hotel building facade.抽空测试下。

圆拱门是否可以做出带有中国色彩的建筑?从这个角度看这套的柱廊上方可以做出类似太和殿的结构从而保留中式风格,看起来和开间大小有关系,门拱不能尖或完全圆需要“磨平一些,两侧可以模拟中式柱头的那个翼型托梁。

以上是最初的版本,我感觉太单调了,且缺乏创新说辞。在与黄色航天飞机墙布多次blend尝试进一步与黑金建筑blend我得到了天地玄黄式建筑的初版。这样看来天地玄黄来自于黄色调背景与太空飞船的硬表面细节,这样误打误撞生产了金字书法于黑色圆柱、木板上的装饰技法,理解这一点意味着天地玄黄可以往太空主题发展,其立意将更进一步。

天地玄黄是古代中国人对天地宇宙最初始状态的一种认知与思索,“玄”:本义是黑色,有深远、高深莫测的意味,用来形容天的那种幽远深邃、神秘难测的特质。“黄”:本意是指黄色,用以描述大地的颜色和一种承载万物的厚重、质朴之感。据记载我国夏商周时期以黑为尊,后世则以黄为贵,以玄黄体现中华元素的建筑装饰体系过往是没有的。

在制作这套时我遇到了电脑意外卡屏,黑屏无法显示的问题,似乎是主板上什么线松动了,我插了一插又好了,不过过程中我并没有感到哪里松,傅文辉说是pcie线松了。总之好了之后再次打开,修改packed a texture转换virutual texture第一次卡了很久。另外window interior材质扩展添加不同贴图第一次也会卡很久。

多保存,反复退出重进,避免那个update texture streaming卡死白做!!!

在认准了一个建筑装饰亮点后,通过它的blend原料可以生产其装饰特征的同分异构体,然后ps拼接出房型。这个案例中的拼接十分简单仅仅是现成的叠成3层,之前我过度依赖midjourney,以为可以通过它直接生产整体,现在看来这是不现实的,通过imaine extend就可以看出来对于人类世界未知的无法用文字准确描述的装饰特征,midjourney无法再现,因此只有图和图blend使其丧失逻辑的情况下可能产生创意,而创意出现后需要人为组织修正。

bakemaster自动smart unwrap对于许多部件看起来效果不好尤其是超长cornice。折腾了一天很多复杂部件的matrix材质效果不理想,最后还是整体smart unwrap解决,原理不明,为什么批量smart unwrap时出现问题了呢?

一开始我把这个黑金阵列理解为金色浮雕板阵列嵌在黑木板上

然而这样的浮雕效果不好,感觉应该是带有大片空隙的木雕能透出更多黑色木板,但这样要搞很多几何体。

我后来改成了整面的平板金字书法,技法是matrix材质直接改albedo贴图,效果看起来可以,为了保证接缝问题,需要midjourney生产–tile,为适应不同规格么,需要大批量的–ar。1楼的盾纹花雕是几何体duplicate along curve因为几何体面数太大,所以没法combine楼上的简易盾纹则combine,几何体数量太多导入时会占用很长时间,据说几何体数量太多对性能也有影响。

叠涩斗拱上的浮雕使其质感有一定提升但是还达不到想象中要做的冠冕立柱。黑黄相间可以突出天地玄黄的概念。

整版黑底金字书法用一个url引导imagine extend可以得到各种规格的效果,说明对于简单特征的图片midjourney imagine extend可以把我较为准确。

酒杯柱头立柱柱身加入了浮雕,其做法和书法一样也是利用修改matrix材质不过还需要把normal也改了,为此我让deepseek写了一个python程序可以批量把图片改为1024x1024平铺,以及另一个程序可以使图片直接转换为normal贴图,实测效果非常棒,酒杯柱头上用的matrix材质改normal。可以说在这个案例中我把浮雕雕塑的运用进一步提升熟练了,理论上实现了浮雕有间隙的情况下雕在不同颜色的其他材质上,如镀金金属雕塑雕在黑木板上。

cornice上用浮雕平铺效果也是不错的

屋顶我采用duplicate along curve马头柱加回纹不规则排布的护栏形式作为屋脊,一开始我想的是聚拢的三重屋脊,但中间那道想不到用什么搞。马头雕塑来源于midjourney生产后切分图片给aiuni生产3d模型。这个管道我用的圆柱体拼一段段拼接,并没有用curve,curve有时候gizmo会找不到导致移动不方便,不过感觉还是得用curve,圆柱的话不好转折,得多次复制。我一开始用的curve,不停调整不同的圆柱直径,感觉效果不好,非常的混乱改为相同直径之后好多了,不过整体效果还是不理想。另外顶楼的柱体以及多联窗框是偏红的,抽空修改一下,看看是不是能提升效果,现在好像黄色太多了些。

天地玄黄式建筑可以说是我的第一个创新式可拓展建筑装饰语言体系,我打算继续在第5栋建筑上使用并延伸这个体系。

autotile1024自动批量将目标图片以1024x1024尺寸平铺
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  

import os
from PIL import Image

def tile_image_to_1024(img, output_path):
"""将单张图片平铺为1024x1024大小并保存"""
img_width, img_height = img.size

# 计算缩放比例
if img_width > img_height:
# 图片是横向的,以宽度为基准缩放
scale = 1024 / img_width
tile_width = 1024
tile_height = int(img_height * scale)
else:
# 图片是纵向的,以高度为基准缩放
scale = 1024 / img_height
tile_height = 1024
tile_width = int(img_width * scale)

# 缩放图片
img_resized = img.resize((tile_width, tile_height), Image.Resampling.LANCZOS)

# 创建1024x1024的画布
canvas = Image.new('RGB', (1024, 1024))

# 计算平铺次数
x_tiles = 1024 // tile_width
y_tiles = 1024 // tile_height

# 平铺图片
for y in range(y_tiles + 1): # +1 确保覆盖边缘
for x in range(x_tiles + 1): # +1 确保覆盖边缘
# 计算粘贴位置
paste_x = x * tile_width
paste_y = y * tile_height
# 将图片粘贴到画布上
canvas.paste(img_resized, (paste_x, paste_y))

# 保存生成的图片
canvas.save(output_path)
print(f"图片已平铺并保存到: {output_path}")

def process_folder(input_folder, output_folder):
"""处理指定文件夹下的所有图片"""
# 确保输出文件夹存在
if not os.path.exists(output_folder):
os.makedirs(output_folder)

# 遍历文件夹中的所有文件
for filename in os.listdir(input_folder):
file_path = os.path.join(input_folder, filename)

# 检查文件是否为图片
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.tiff')):
try:
# 打开图片
with Image.open(file_path) as img:
# 生成输出路径
output_path = os.path.join(output_folder, filename)
# 平铺图片并保存
tile_image_to_1024(img, output_path)
except Exception as e:
print(f"处理文件 {filename} 时出错: {e}")
else:
print(f"跳过非图片文件: {filename}")

# 示例调用
input_folder = r"F:\SendToUE练习\中式酒樽高脚园林式布局\tile" # 输入文件夹路径
output_folder = r"F:\SendToUE练习\中式酒樽高脚园林式布局\tile\output" # 输出文件夹路径
process_folder(input_folder, output_folder)

pictonormal自动批量将图片转换为1024x1024的normal贴图,若尺寸不足1024则以黑色填充剩余部分再转换
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141

import os
from PIL import Image
import numpy as np

def resize_to_1024(image, target_size=(1024, 1024)):
"""
将输入图像调整为 1024x1024 尺寸。
图像会等比例缩放,不足部分用黑色填充。

:param image: 输入的 PIL 图像
:param target_size: 目标尺寸,默认为 (1024, 1024)
:return: 调整后的 PIL 图像
"""
# 获取原始尺寸
original_width, original_height = image.size

# 计算等比例缩放尺寸
scale_factor = min(target_size[0] / original_width, target_size[1] / original_height)
new_width = int(original_width * scale_factor)
new_height = int(original_height * scale_factor)

# 缩放图像
resized_image = image.resize((new_width, new_height), Image.Resampling.LANCZOS)

# 创建目标尺寸的画布并填充黑色
padded_image = Image.new('RGB', target_size, (0, 0, 0))

# 计算粘贴位置,使图像居中
offset_x = (target_size[0] - new_width) // 2
offset_y = (target_size[1] - new_height) // 2
padded_image.paste(resized_image, (offset_x, offset_y))

return padded_image

def grayscale_to_normal_map(image, strength=5.0):
"""
将灰度图像转换为法线贴图。

:param image: 输入的 PIL 图像(灰度图)
:param strength: 法线贴图的强度,默认为 5.0
:return: 生成的法线贴图(PIL 图像)
"""
pixels = np.array(image, dtype=np.float32) / 255.0

# 使用 Sobel 算子计算梯度
kernel_x = np.array([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]], dtype=np.float32)
kernel_y = np.array([[-1, -2, -1],
[ 0, 0, 0],
[ 1, 2, 1]], dtype=np.float32)

gradient_x = np.zeros_like(pixels)
gradient_y = np.zeros_like(pixels)

# 对图像进行卷积,计算梯度
for i in range(1, pixels.shape[0] - 1):
for j in range(1, pixels.shape[1] - 1):
gradient_x[i, j] = np.sum(pixels[i-1:i+2, j-1:j+2] * kernel_x)
gradient_y[i, j] = np.sum(pixels[i-1:i+2, j-1:j+2] * kernel_y)

# 归一化梯度
normal_map = np.zeros((pixels.shape[0], pixels.shape[1], 3), dtype=np.float32)
normal_map[..., 0] = gradient_x * strength # R 通道
normal_map[..., 1] = gradient_y * strength # G 通道
normal_map[..., 2] = 1.0 # B 通道

# 归一化法线向量
norm = np.sqrt(normal_map[..., 0]**2 + normal_map[..., 1]**2 + normal_map[..., 2]**2)
normal_map[..., 0] /= norm
normal_map[..., 1] /= norm
normal_map[..., 2] /= norm

# 将法线向量从 [-1, 1] 映射到 [0, 255]
normal_map = (normal_map + 1.0) * 127.5
normal_map = np.clip(normal_map, 0, 255).astype(np.uint8)

return Image.fromarray(normal_map, 'RGB')

def process_image(image_path, output_path, strength=5.0):
"""
处理单张图像:
1. 调整尺寸为 1024x1024。
2. 转换为法线贴图。
3. 保存结果。

:param image_path: 输入图像的路径
:param output_path: 输出图像的路径
:param strength: 法线贴图的强度,默认为 5.0
"""
# 打开图像
image = Image.open(image_path)

# 调整尺寸为 1024x1024
resized_image = resize_to_1024(image)

# 转换为灰度图
grayscale_image = resized_image.convert('L')

# 转换为法线贴图
normal_map = grayscale_to_normal_map(grayscale_image, strength=strength)

# 保存结果
normal_map.save(output_path)

def process_folder(input_folder, output_folder, strength=5.0):
"""
处理指定文件夹下的所有图片:
1. 调整尺寸为 1024x1024。
2. 转换为法线贴图。
3. 保存结果到输出文件夹。

:param input_folder: 输入文件夹路径
:param output_folder: 输出文件夹路径
:param strength: 法线贴图的强度,默认为 5.0
"""
# 确保输出文件夹存在
if not os.path.exists(output_folder):
os.makedirs(output_folder)

# 遍历输入文件夹中的所有文件
for filename in os.listdir(input_folder):
# 检查文件是否为图片(支持常见格式)
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff')):
input_path = os.path.join(input_folder, filename)
output_path = os.path.join(output_folder, filename)

# 处理图片
print(f'Processing: {filename}')
try:
process_image(input_path, output_path, strength=strength)
print(f'Saved: {output_path}')
except Exception as e:
print(f'Error processing {filename}: {e}')

# 使用示例
input_folder = r'F:\SendToUE练习\中式酒樽高脚园林式布局\fudiaotu'
output_folder = r'F:\SendToUE练习\中式酒樽高脚园林式布局\fudiao2'
process_folder(input_folder, output_folder, strength=5.0)

2024-12-25-中南海改造-第2个建筑

评论

Your browser is out-of-date!

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

×