用Blender批量创建3DNFT藏品
我想为大约 1000 多个 NFT 收藏品创建 3D 角色,但不知道该怎么做。手动一个一个地创建所有模型是愚蠢的。
实际上,我喜欢使用 Blender 来创建 3D 模型,所以也想使用它。
当我在互联网上搜索时,我发现 Blender Scripting(Python) 可以用于随机组合各种特征以编程方式创建3D模型的解决方案。它使用 Python 语言。 1、NFT藏品目录结构
目录树如下:
parts ——其中包含的每个 3D 零件。 body ——身体。 head ——头。 misc — 其他文件(背景、灯光、相机等)。 outputs——由 Blender 脚本生成的图像和元数据。 script - Python脚本文件。 2、创建3D部件
这一次,创建 2 种类型的零件,包括 头部 , 身体 。和 misc(包括背景图像、相机、灯光的文件) 。
步骤如下: 打开 Blender 并创建一个新文件并删除所有默认对象,并将其保存在 body 或 head 文件夹中。(例如 nft-collectibles/parts/head/head_rabbit.blend ) 在 Blender 中,创建一个与文件名相同的新集合。(例如,如果文件名为 head_rabbit.blend ,则集合名称为 head_rabbit ) 在刚刚创建的集合中创建一个零件模型。 调整大小和位置,使角色看起来自然。 最后保存。 2.1 3D NFT 头部件示例
文件名: nft-collectibles/parts/head/head_rabbit.blend
收藏名: head_rabbit
文件名: nft-collectibles/parts/head/head_frog.blend
收藏名: head_frog
2.2 3D NFT身体部件示例
文件名: nft-collectibles/parts/body/body_shirt.blend
收藏名: body_shirt
文件名: nft-collectibles/parts/head/body_zombie.blend
收藏名: body_zombie
2.3 3D NFT 辅助部件示例
文件名: nft-collectibles/parts/misc/misc.blend
收藏名: misc
3、创建Blender Python脚本文件
要创建脚本文件,请在 Blender的 脚本工作区 中打开你喜欢的代码/文本编辑器或文本编辑器。 3.1 gen_metadata.py
这是为了为 NFT 生成随机元数据: import bpy # The module for Blender Python import json import random # This time, 100 characters will be generated. TOTAL_CHARACTERS = 100 # Specify the directory in which generate images finally. OUTPUTS_DIR = "c:/nft-collectibles/outputs/" # List of parts (the file name (collection name) of each created part is included in this.) list_body = [ "hoodie", "overall", "pants", "shirt", "tanktop", "t_shirt", "zombie" ] list_head = [ "devil", "dragon", "frog", "king", "pirate", "rabbit", "robot", "skull", "warrior" ] def random_attributes(): # Select parts randomly from lists random_head = random.choice(list_head) random_body = random.choice(list_body) # Format each name for the value of attributes in metadata (e.g. "head_rabbit" -> "Head Rabbit") random_head = random_head.replace("_", " ").title() random_body = random_body.replace("_", " ").title() attributes = [ { "trait_type": "Body", "value": random_body }, { "trait_type": "Head", "value": random_head } ] return attributes def main(): print("Start generating metadata...") # Create a tempolary dict dict_list = [] for i in range(TOTAL_CHARACTERS): attributes = random_attributes(i) d = { "attributes": attributes } dict_list.append(d) # Create a list of unique data removed duplicates unique_list = list(map(json.loads, set(map(json.dumps, dict_list)))) # If the duplicated found, cancel scripting and try again if len(unique_list) < TOTAL_CHARACTERS: print("ERROR: Properties duplicate") return # Save metadata files (.json) to outputs folder for i, attr_dict in enumerate(unique_list): # Create a metadata object obj = { "name": "Character #" + str(i), "description": "A collection of 3D character", "image": "https://example.com/"+ str(i) + ".png", "external_url": "https://example.com/", "attributes": attr_dict["attributes"] } with open(OUTPUTS_DIR + str(i) + ".json", "w") as outjson: json.dump(obj, outjson, indent=4) print("Generated metadata id: {} ".format(i)) main()3.2 gen_model.py
这是为了从元数据生成模型。 import bpy import json import random import shutil # This time, 100 characters will be generated. TOTAL_CHARACTERS = 100 # Path PARTS_DIR = "c:/nft-collectibles/parts/" OUTPUTS_DIR = "c:/nft-collectibles/outputs/" # Initialize the scene (deleting the all default objects) def init(): for obj in bpy.data.objects: bpy.data.objects.remove(obj) for col in bpy.data.collections: bpy.data.collections.remove(col) # Set configurations for rendering def set_render_config(): # For example, set the rendering engine "EEVEE" (but Blender may be configured EEVEE default. if so, you don"t need to do that) r = bpy.context.scene.render r.engine = "BLENDER_EEVEE" r.resolution_x = 1024 r.resolution_y = 1024 # Set the output file format r.image_settings.file_format = "PNG" def append_misc(): path = PARTS_DIR + "misc/" + "misc.blend/Collection/" collection_name = "misc" bpy.ops.wm.append(filename=collection_name, directory=path) # Link camera to scene cam = bpy.data.objects["camera"] scene = bpy.context.scene scene.camera = cam def append_body(trait_value): body_name = "body_" + trait_value path = PARTS_DIR + "body/" + body_name + ".blend/Collection/" bpy.ops.wm.append(filename=body_name, directory=path) def append_head(trait_value): head_name = "head_" + trait_value path = PARTS_DIR + "head/" + head_name + ".blend/Collection/" bpy.ops.wm.append(filename=head_name, directory=path) def render(id): # Render bpy.ops.render.render(write_still=1) # Save bpy.data.images["Render Result"].save_render(filepath=OUTPUTS_DIR + id + ".png") def remove_parts(): # Remove all parts except "misc" for col in bpy.data.collections: if col.name != "misc": for obj in col.objects: bpy.data.objects.remove(obj) bpy.data.collections.remove(col) continue def generate(id, metadata): for attr in metadata["attributes"]: # Body if attr["trait_type"] == "Body" and attr["value"] != "": append_body(attr["value"]) # Head if attr["trait_type"] == "Head" and attr["value"] != "": append_head(attr["value"]) render(str(id)) # After rendered, remove all parts remove_parts() def main(): print("Start generating models...") init() set_render_config() append_misc() # Regarding "misc", add it to the scene in advance because it is common to all characters. # Generate character images for i in TOTAL_CHARACTERS: with open(OUTPUTS_DIR + str(i) + ".json", "r") as metaJson: data = json.load(metaJson) generate(i, data) print("Generated model id: {} ".format(id)) main()4、 运行脚本
创建脚本文件后,你可以运行它们。
打开 Blender 并单击编辑器顶部 几何节点 旁边的 脚本工作区。
要检查处理过程中的状态,可以通过单击顶部菜单中的 "窗口"->"切换系统控制台"来打开控制台。 4.1、生成元数据
单击 Open -> 选择 gen_metadata.py -> 单击 Run Script 。
如上源代码所示( gen_metadata.py ,第68-73行),如果数据组合重复,该过程将被取消。在这种情况下,你需要再次单击 运行脚本 。
之后,可以看到在 output 文件夹中生成了 0.json 、 1.json 等元数据文件。 4.2 生成3D NFT角色
点击 Open -> 选择一个 gen_model.py -> 点击 Run Script 。
之后,可以看到在 output 文件夹中生成了 0.png 、 1.png 等渲染图像文件。
原文链接:http://www.bimant.com/blog/blender-nft-scripts/
深圳市宝安区深创投投资运营有限公司揭牌成立3月31日,宝安区携手深创投集团共同组建的深圳市宝安区深创投投资运营有限公司,在海纳百川总部大厦举办成立仪式,标志着宝安区与深创投集团战略合作迈入实质性新阶段。宝安区委常委区政府党
主场逆转战胜山东男篮,强硬的广东宏远拒绝连败!千万不要打开,高清免费全球赛事都在里面大家好,我是璐璐!10293,恭喜广东宏远战胜来势汹汹的山东男篮,成功避免遭遇两连败!赛前,广东队被同城兄弟深圳队完成常规赛双杀,让球队在常规
Telegram安全通讯应用还是犯罪团伙的交流工具?Telegram是一款备受争议的通讯应用,一些人认为它是一款安全的通讯工具,能够保护用户的隐私和安全但另一些人则认为,它成为了一些犯罪团伙的交流工具。其的匿名和加密特性,使得一些犯
砸对方大巴,唱歌侮辱曼城与利物浦之间什么仇什么怨?英超第29轮曼城主场4比1大胜利物浦,比赛前后出现了一些不愉快的场面,利物浦主帅克洛普被球迷的投掷物砸,曼城球迷还在歌词中嘲讽了希尔斯堡惨案(1989年4月15日,在英国谢菲尔德希
记者穆阿尼希望加盟拜仁,他与于帕有着很好的友谊直播吧4月1日讯据sport1记者KerryHau的消息,法兰克福前锋穆阿尼希望加盟拜仁。该记者报道称,穆阿尼希望加盟拜仁,拜仁正是穆阿尼的首选球队。穆阿尼也希望留在德甲,他对拜仁
300块的香港游,坑惨多少中国人前几天,有香港网友上传了一些照片,让人看了心里很不是滋味图片中,一群头戴旅行团小红帽的内地旅游团,一字排开,或站或蹲,在土瓜湾某行人路上吃盒饭。根据香港媒体报道,这个团的餐标本来是
孕妇可以擦口红吗?爱美之心人皆有之,很多女性为了有好气色包包里都会准备一支口红,但怀孕后,孕妇还能涂口红吗?重庆安琪儿妇产医院妇产医生邓沁表示,首先,无论是唇膏唇彩,还是唇蜜唇冻口红,都是由各种油脂
这需要设计,更需要勇气!4月份了,天气转暖,在家里我穿着一件衬衫和单裤就可以了。妻子看到我的衬衫腋窝位置开线了,提醒了我一句。我问她能缝补一下吗,不行的话,就不穿了。妻子拿出许久不用的电动缝纫机,把衬衫开
王后最爱却是英国王室的无奈,蓝宝石胸针戴在了卡米拉的身上英国王室有一件传奇珠宝,维多利亚女王爱情的象征蓝宝石胸针,英国王室代代相传,佩戴这件传世珠宝的都是国王的妻子或女王,这件珠宝最初由维多利亚女王传给了她最喜爱的儿媳亚历山德拉王后,可
贵气感配饰,戴对了超出片!对于春天最大的尊重莫过于出去享受这大好的春光了!为了降低造型踩雷的可能性,很多女孩便会选择百搭的造型,但是整体看会少了些亮点。对于我们女孩来说,选好了新衣服,配饰也很重要,不求它多
祝贺!斩获2金6铜,梅州五华阿哥阿妹厉害4月2日,广东省第十六届运动会竞技体育组空手道比赛在清远连州市体育中心落幕。梅州市空手道队首次参加省运会勇夺2金6铜,以总分109分的成绩,位列团体第八名。周雨婷夺得女甲48K冠军