6

オブジェクトの特定の頂点の位置を変更する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を使用していることを示しています。Blenderにmatrix_worldを再計算させるにはどうすればよいですか?

4

4 に答える 4

8

これらの値を変更した後に呼び出す必要がありScene.updateます。そうしないと、Blender はmatrix_world[別の場所で] 必要になるまで再計算しません。その理由は、API ドキュメントの「Gotcha's」セクションによると、この再計算はコストのかかる操作であるため、すぐには実行されないためです。

Python から値を変更し、更新された値にすぐにアクセスしたい場合があります。たとえば、次のようになります。

オブジェクトbpy.types.Object.locationを変更したら、 bpy.types.Object.matrix_worldの直後にその変換にアクセスしたい場合がありますが、これは期待どおりに機能しません。

オブジェクトの最終的な変換を行うために使用される可能性のある計算を検討してください。これには次のものが含まれます。

  • アニメーション ファンクション カーブ。
  • ドライバーとその pythons 式。
  • 制約
  • 親オブジェクトとそのすべての F カーブ、拘束など。

プロパティが変更されるたびにコストのかかる再計算を避けるために、Blender は必要になるまで実際の計算を延期します。

ただし、スクリプトの実行中に、更新された値にアクセスしたい場合があります。

これは、値を変更した後にbpy.types.Scene.updateを呼び出して、更新するタグが付けられたすべてのデータを再計算することで実行できます。

于 2012-12-16T06:57:28.373 に答える
0

Object.matrix_world にアクセスすると、何もしなくても「フリーズ」します。たとえば、次のようになります。

m = C.active_object.matrix_world

マトリックスが詰まる原因となります。マトリックスにアクセスしたいときはいつでも使用してください

Object.matrix_world.copy()

行列を書きたい場合にのみ、使用してください

C.active_object.matrix_world = m
于 2021-10-06T09:28:38.073 に答える