我正在为搅拌机设计一个附加组件,它可以改变对象某些顶点的位置. blender中的每个对象都有一个matrix_world属性,它包含一个矩阵,用于将顶点坐标从对象转换为世界框架.
print(object.matrix_world) # unit matrix (as expected)
object.location += mathutils.Vector((5,0,0))
object.rotation_quaternion *= mathutils.Quaternion((0.0, 1.0, 0.0), math.radians(45))
print(object.matrix_world) # Also unit matrix!?!
上面的代码段显示翻译后,你仍然拥有相同的matrix_world.我如何强制搅拌机重新计算matrix_world?
解决方法:
更改这些值后应调用Scene.update
,否则Blender将不会重新计算matrix_world,直到需要[其他地方].根据API文档中的“Gotcha’s” section,原因是这个重新计算是一个昂贵的操作,所以它不会马上完成:
Sometimes you want to modify values from python and immediately access the updated values, eg:
Once changing the objects 07002 you may want to access its transformation right after from 07003, but this doesn’t work as you might expect.
Consider the calculations that might go into working out the objects final transformation, this includes:
- animation function curves.
- drivers and their pythons expressions.
- constraints
- parent objects and all of their f-curves, constraints etc.
To avoid expensive recalculations every time a property is modified, Blender defers making the actual calculations until they are needed.
However, while the script runs you may want to access the updated values.
This can be done by calling 07004 after modifying values which recalculates all data that is tagged to be updated.