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)
相关推荐
成都渲染101云渲染66665 小时前
Blender 4K渲染背后的技术挑战
blender
我爱钱因此会努力5 小时前
ansible实战- 关机
linux·运维·服务器·centos·自动化·ansible
路由侠内网穿透.6 小时前
本地部署集成全能平台 Team.IDE 并实现外部访问
运维·服务器·数据库·ide·远程工作
运维李哥不背锅14 小时前
Ansible 模块详解:高效管理你的 IT 基础设施
服务器·网络·ansible
我爱钱因此会努力14 小时前
ansible自动化运维入门篇
linux·运维·服务器·centos·自动化·ansible
星光一影15 小时前
供应链进销存源码uniapp全开源ERP多仓库管理系统pc+app手机端
mysql·elementui·uni-app·开源·php·phpstorm·1024程序员节
南棱笑笑生16 小时前
20251028在Ubuntu20.04.6上编译AIO-3576Q38开发板的Buildroot系统
大数据·linux·服务器·rockchip
☆璇17 小时前
【Linux】数据链路层
linux·服务器·网络