范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

用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/

年过五十,需警惕这些怪事,晚年凄凉的三大征兆到了老年,随着身体机能的逐渐衰退,即使是最强壮的人。也会变得脆弱。人在脆弱的时候,会害怕孤独,希望有人可以陪伴。然而,并不是每个老年人都有宽容的性格。有些老人,虽然心里需要家人的陪山西73岁大爷在垃圾箱里,翻出8个茅台酒瓶,行家不用收废品了提到收废品,大家第一时间都会想到什么呢?平时大家看到收废品的老人,应该都会躲过去吧。因为常年收废品捡破烂,总感觉这些老人身上脏脏的。而且他们的儿女看来,捡破烂,收废品是件很丢人的事春节大鱼大肉吃腻了,万能凉拌汁分享给你,做啥凉拌菜都好吃春节大鱼大肉吃腻了,万能凉拌汁分享给你,做啥凉拌菜都好吃过年期间,估计不少人都跟我一样,吃的挺好,每天都是大鱼大肉得吃,根本停不下来。过年短短几天,我已经胖了45斤了哈哈,这可不行大豆油菜籽油花生油,哪个更适合家庭炒菜?大厨教你怎么选油想和大家聊聊家里的食用油,您家里吃的是花生油菜籽油玉米油葵花籽油大豆油还是橄榄油?先说说我自己的喜好吧,花生油玉米油葵花籽油大豆油等,我家都吃,每个月去超市买食用油的时候,都会刻意春节期间甄嬛传在台再引发热潮,皇上驾崩时3。2万人同时在线观看据中新网综合台媒报道,电视剧后宫甄嬛传上档至今已12年,仍是许多观众心中的最强宫斗剧,在台买下版权之一的电视台八大,从去年开始就在农历春节期间,以24小时不间断马拉松直播的方式播出除了聊天绘画,AI还能在线帮你健身峰瑞创投对话我们请AI绘制了线上健身的主题图图片来源飞桨文心一格春天如约而至,我们终于可以伸展腰身,卸下一冬的疲惫,去跑步,去练瑜伽,去玩飞盘。不过对于多数人而言,从萌生运动的念头,到真正动起赏梅有了新的打开方式苏州香雪海景区首次开放夜游疏影横斜水清浅,暗香浮动月黄昏。2月1日起,位于吴中区光福镇的香雪海景区首次开放花月夜夜游特色活动,众多游客在夜色下欣赏梅花,感受别样的风采。夜幕降临,漫山的梅花被点亮。景区内火树余氯在线检测仪应用文字迈德施科技自来水生产厂家用余氯在线检测仪是再普遍不过了,为什么这么说呢?因为自来水是一种卫生安全的饮用水,由于环境污染导致水中细菌等有害物质大量出现,那么在处理水中细菌的过程中扎染兔兔品茶汤圆玩民俗篝火花灯崇明这个景区元宵活动很丰富!元宵佳节LATERNFESTIVAL2023兔年HAPPYLATERNFESTIVAL岁岁闹元宵轰天锣鼓敲花好月圆人团圆阖家欢乐元宵节HAPPYEVERYDAY兔年春节非遗民俗贺新成都游客春节期间往返两千公里去有风的地方靠一箱方便面续命封面新闻记者张峥春节假期期间,朱女士一家成为了出游大军中的一员。有幸成为3。08亿分之一,初次跻身5000万高速路大军,往返川滇2000公里,靠一箱方便面续命,加入雅西高速火龙阵,年度流行的10款外套,看看哪些穿5年也不过时,让自己美丽更持久头条创作挑战赛时间好快,很快已经进入2023年的第二个月了,大家也陆续进入开工模式,女生上班日很重要的一项日程,就是考虑穿衣打扮。不如我们先从外套开始,盘点下过去流行的外套款式,发
深圳市宝安区深创投投资运营有限公司揭牌成立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冠军