blender4.5 使用外部IDE(pycharm)编辑脚本(bpy)实践指南

  • blender的内置的脚本编辑器,十分难用,故而我使用了pycharm
  • 首先添加一个python解释器,最好使用blender内部的那个,我是默认安装的目录就在这里:

C:/Program Files/Blender Foundation/Blender 4.5/4.5/python/bin/python.exe

  • 为这个解释器添加一个新的模块:bpy ,有两个方案,一个是手动安装,一个是从pypi自动安装
bash 复制代码
C:\Program Files\Blender Foundation\Blender 4.5\4.5\python\bin>python.exe -m pip install "C:\Program Files\Blender Foundation\Blender 4.5\4.5\python\bin"
  • 这样模块就安装好了,此时新建一个py文件,import bpy就应该可以了,代码提示应该也有了:
  • 执行脚本,将写好的py文件,在blender中执行有2种方法,其实是3种;
    参考: https://docs.blender.org/api/4.5/info_tips_and_tricks.html#use-an-external-editor
    • 在blender直接打开外部文件,有变更时刷新即可,ctrl+R可以刷新外部的编辑器变更,出现矛盾是点这个红色按钮,按外部修改即可;在编辑器内点击执行;

    • 使用这个脚本,直接执行外部文件即可,这是官方推荐的方案;这样就不用刷新了;
python 复制代码
import bpy
import os

filename = os.path.join(os.path.dirname(bpy.data.filepath), "demo01.py")
exec(compile(open(filename).read(), filename, 'exec'))
  • 其他问题,当需要引入"bmesh"等独立模块时,无法引入; 实际是可以引入的,只是编辑器不能识别; 注意注意!!必须先引入bpy才能引入bmesh否则报错,这样的代码就可以执行;虽然没有提示;
python 复制代码
import bpy
import bmesh

mesh = bpy.data.meshes.new("MyMesh")
bm = bmesh.new()
bm.verts.new((0, 0, 0))
bm.verts.new((1, 0, 0))
bm.to_mesh(mesh)
bm.free()
  • 附一个实例代码
python 复制代码
import random

import bpy

# 删除所有的集合
for obj in bpy.data.collections:
   bpy.data.collections.remove(obj)

# 删除所有的对象
for obj in bpy.data.objects:
   bpy.data.objects.remove(obj, do_unlink=True)

# 删除所有的网格体
for obj in bpy.data.meshes:
   bpy.data.meshes.remove(obj)

# 清理孤儿对象(定义了,但是未使用的数据,或者说未连接到场景集合上的)
bpy.ops.outliner.orphans_purge(do_local_ids=True, do_linked_ids=True)

# 获取第0个场景的集合对象
scenes0 = bpy.data.scenes[0].collection

# 创建2个集合,都连接到场景0上
c1 = bpy.data.collections.new("collection01")
scenes0.children.link(c1)

c2 = bpy.data.collections.new("collection02")
scenes0.children.link(c2)

# 定义网格体的顶点和面,边会自动推断
tetrahedronVertexes = [
   (0, 0, 0),  # 顶点 A(原点)
   (1, 0, 0),  # B
   (0, 1, 0),  # C
   (0, 0, 1),  # D(尖顶)
]
tetrahedronFaces = [(0, 1, 2), (0, 1, 3), (1, 2, 3), (0, 2, 3)]

# 创建一个四面体的网格体
myTetrahedronMesh = bpy.data.meshes.new("myTetrahedronMesh")
myTetrahedronMesh.from_pydata(tetrahedronVertexes, [], tetrahedronFaces)
myTetrahedronMesh.update()

# 创建好27个对象,都使用一个网格体,也就是上面的四面体
for i in range(3):
   for j in range(3):
       for k in range(3):
           obj = bpy.data.objects.new(f"obj{i}_{j}_{k}", myTetrahedronMesh)
           # 对象按照阵列分布位置把
           obj.location = (i, j, k)
           # 所有的对象均连接到集合1上
           c1.objects.link(obj)

# 再创建一个曲线数据块
myCurveMesh = bpy.data.curves.new("myCurve", type='CURVE')
myCurveMesh.dimensions = "3D"
myCurveMesh.resolution_u = 12

# 每个曲线有需要包含若干含样条,定义样条和样条点
spline = myCurveMesh.splines.new(type="BEZIER")
points = spline.bezier_points
points.add(1)
points[0].co = (0, 0, 0)
points[1].co = (-1, -1, 1)

# 创建曲线的对象,并且连接到场景根节点(场景集合)
myCurveObj = bpy.data.objects.new("obj_curve", myCurveMesh)
scenes0.objects.link(myCurveObj)

# 或者调用ops操作来创建对象也是可以的,效率略低
# 例如创建一个nurbs圆球,会自动连接到当前活动的集合中的
bpy.ops.surface.primitive_nurbs_surface_sphere_add(radius=1, enter_editmode=False, align='WORLD', location=(1, -1, 0), scale=(1, 1, 1))



######以下是材质的内容#######

# 定义一个参数化的材质
customMaterial = bpy.data.materials.new("customMaterial")
customMaterial.use_nodes = True
nodes = customMaterial.node_tree.nodes
links = customMaterial.node_tree.links

nodes.clear()

# 添加 Principled BSDF 和输出
bsdf = nodes.new(type="ShaderNodeBsdfPrincipled")
output = nodes.new(type="ShaderNodeOutputMaterial")
links.new(bsdf.outputs[0], output.inputs[0])

# 添加 Attribute 节点(读取 "BaseColor" 属性)
attr = nodes.new(type="ShaderNodeAttribute")
attr.attribute_name = "customColors"  # ← 关键:属性名
attr.attribute_type = "OBJECT"

# 连接颜色
links.new(attr.outputs["Color"], bsdf.inputs["Base Color"])


# 获取集合1中的所有对象,并赋予一个材质,且每个对象颜色都不同
for obj in c1.objects:
   # 为每个对象创建一个自定义属性-颜色,然后由材质读取此属性,以输出不同的颜色;这样就可以定义自定义属性
   obj["customColors"]= (random.random(), random.random(), random.random(),1)


# 将材质赋予到网格上
myTetrahedronMesh.materials.append(customMaterial)



# !!!!!!!!!!!!!!!!!!!!!!!!如果需要查看某个对象的属性可以执行这个!!!!!!!!!!!!!!!!!!!!!!!!!!! #
# obj = bpy.data.objects['obj0_0_0']
# for prop in obj.bl_rna.properties:
#    print(prop.identifier, ":", prop.description)
相关推荐
云和数据.ChenGuang14 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
天诰15 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
陈希12317 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡18 小时前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
@兽血沸腾18 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
讯捷蓝达1 天前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
大白玉米1 天前
MoxPlayer 弹幕播放器源码智能解析线路管理系统自研内核
php
Thanks_ks1 天前
【第 006 讲】搭建 PyCharm 开发环境:PyCharm 的下载与安装 | 初始设置与常用配置
ide·python·pycharm·开发工具·jetbrains·开发环境·集成开发环境
数字新视界1 天前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落1 天前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络