我正在尝试使用我在 Blender 中创建的 3D 模型来制作地图瓦片。该地图在 Blender 中大小为16 x 16 个单位,并且包含了4个不同的缩放级别。每个瓦片的像素大小为 100 x 100,而整个地图在最缩小的级别下构成了一个 4 x 4 的瓦片网格,总大小为 400 x 400 像素。最放大的级别则拥有 256 x 256 的瓦片,总大小为 25600 x 25600 像素。
我的目标是创建一个 Blender 脚本,能够从模型自动生成这些瓦片。由于我之前没有 Python 的经验,因此我决定尝试改编一些现有的脚本。
解决方案:
import bpy
import os
import math
# 初始化变量
thumbsize = 200
camera_height = 4.4
y_start = -8
y_move = 4
x_start = -8
x_move = 4
zoom_level = 1
path = "/Images/Map/"
# 定义导出地图瓦片的函数
def export_map_tiles():
# 获取当前场景并设置渲染上下文
scene = bpy.context.scene
context = scene.render
#计算瓦片数量
tile_count = 4 ** zoom_level
# 设置摄像机属性
camera = scene.camera
camera.location.z = camera_height / zoom_level
camera.rotation_euler = (0, 0, 0) # 将相机指向正下方
# 遍历地图瓦片
for y_tile in range(tile_count):
camera.location.y = y_start + (y_move / 2) + (y_tile * y_move)
for x_tile in range(tile_count):
camera.location.x = x_start + (x_move / 2) + (x_tile * x_move)
# 设置渲染属性
context.resolution_x = context.resolution_y = thumbsize
context.image_settings.file_format = 'PNG'
# 渲染图像并保存
context.render_path = os.path.join(path, f"Z{zoom_level}_X{x_tile+1}_Y{tile_count-y_tile}.png")
bpy.ops.render.render(write_still=True)
# 创建用户界面面板
def create_ui_panel(self, context):
layout = self.layout
row = layout.row()
row.prop(bpy.context.scene, "thumbsize")
row = layout.row()
row.prop(bpy.context.scene, "camera_height")
row = layout.row()
row.prop(bpy.context.scene, "y_start")
row = layout.row()
row.prop(bpy.context.scene, "y_move")
row = layout.row()
row.prop(bpy.context.scene, "x_start")
row = layout.row()
row.prop(bpy.context.scene, "x_move")
row = layout.row()
row.prop(bpy.context.scene, "zoom_level")
row = layout.row()
row.prop(bpy.context.scene, "path")
row = layout.row()
row.operator("export_map_tiles.export_tiles", text="Export Tiles")
# 注册导出地图瓦片的操作符和面板
class ExportMapTilesOperator(bpy.types.Operator):
bl_idname = "export_map_tiles.export_tiles"
bl_label = "Export Map Tiles"
def execute(self, context):
export_map_tiles()
return {'FINISHED'}
class ExportMapTilesPanel(bpy.types.Panel):
bl_idname = "export_map_tiles.panel"
bl_label = "Export Map Tiles"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = "Export"
def draw(self, context):
create_ui_panel(self, context)
# 注册导出地图瓦片的操作符和面板
def register():
bpy.utils.register_class(ExportMapTilesOperator)
bpy.utils.register_class(ExportMapTilesPanel)
bpy.types.Scene.thumbsize = bpy.props.IntProperty(name="Thumbsize", default=thumbsize, min=1)
bpy.types.Scene.camera_height = bpy.props.FloatProperty(name="Camera Height", default=camera_height, min=0)
bpy.types.Scene.y_start = bpy.props.FloatProperty(name="Y Start", default=y_start)
bpy.types.Scene.y_move = bpy.props.FloatProperty(name="Y Move", default=y_move, min=0)
bpy.types.Scene.x_start = bpy.props.FloatProperty(name="X Start", default=x_start)
bpy.types.Scene.x_move = bpy.props.FloatProperty(name="X Move", default=x_move, min=0)
bpy.types.Scene.zoom_level = bpy.props.IntProperty(name="Zoom Level", default=zoom_level, min=1)
bpy.types.Scene.path = bpy.props.StringProperty(name="Export Path", default=path)
def unregister():
bpy.utils.unregister_class(ExportMapTilesOperator)
bpy.utils.unregister_class(ExportMapTilesPanel)
if __name__ == "__main__":
register()
在这个脚本中,我首先定义了一些变量,包括图像大小、摄像机高度、摄像机起始位置和移动距离、缩放级别以及输出路径。
接下来,我定义了一个 export_map_tiles() 函数,该函数负责遍历地图瓦片并渲染和保存图像。
然后,我创建了一个用户界面面板,允许用户修改这些变量并触发导出地图瓦片的动作。
最后,我注册了 ExportMapTilesOperator 和 ExportMapTilesPanel 类,以便用户可以在 Blender 中使用该脚本。
除了上面的脚本代码外,我还在 Blender 中添加了一些额外的设置,以确保渲染的图像具有正确的外观。例如,我禁用了抗锯齿并设置了适当的图像格式。
现在,您可以使用这个脚本轻松地从 Blender 中导出地图瓦片,并将其用于创建自己的游戏或应用程序。