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)
相关推荐
树℡独4 小时前
ns-3仿真之应用层(五)
服务器·网络·tcp/ip·ns3
a41324475 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
Configure-Handler5 小时前
buildroot System configuration
java·服务器·数据库
津津有味道5 小时前
易语言TCP服务端接收刷卡数据并向客户端读卡器发送指令
服务器·网络协议·tcp·易语言
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.6 小时前
Keepalived VIP迁移邮件告警配置指南
运维·服务器·笔记
Genie cloud7 小时前
1Panel SSL证书申请完整教程
服务器·网络协议·云计算·ssl
!chen7 小时前
linux服务器静默安装Oracle26ai
linux·运维·服务器
IT·小灰灰7 小时前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧7 小时前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q7 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db