4

BlenderでCubeを作りました。Python を使用して、編集モードに入り、頂点を 1 つ選択しました。

import bpy

bpy.ops.mesh.primitive_cube_add()
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.select_all(action="DESELECT")
bpy.context.tool_settings.mesh_select_mode = (True , False , False)
bpy.context.object.data.vertices[0].select = True

bpy.context.object.data.vertices[0].co = (-3,-2,-3)

ただし、頂点はオレンジ色で強調表示されず、頂点に-3、-2-、-3に移動するように指示しましたが、位置が更新されませんでした。

強調表示も移動もしないのはなぜですか?

4

1 に答える 1

6

編集モードの間、エディタはメッシュのミラーを処理し、編集モードを終了するとオブジェクトのデータとして保存されます。一方、スクリプトは、表示されていない基になる元のメッシュを変更します。編集モードを終了すると、編集メッシュが保存されるため、スクリプト化された変更はまったく表示されません。

これを回避する 1 つの方法は、編集モードの外でスクリプト化された変更を行うことです。

import bpy

bpy.ops.mesh.primitive_cube_add()
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.select_all(action="DESELECT")
bpy.context.tool_settings.mesh_select_mode = (True , False , False)
bpy.ops.object.mode_set(mode="OBJECT")
bpy.context.object.data.vertices[0].select = True
bpy.context.object.data.vertices[0].co = (-3,-2,-3)
bpy.ops.object.mode_set(mode="EDIT")

もう 1 つは、BMesh の編集をリクエストする方法です。

import bpy, bmesh

bpy.ops.mesh.primitive_cube_add()
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.select_all(action="DESELECT")
bpy.context.tool_settings.mesh_select_mode = (True , False , False)
mesh=bmesh.from_edit_mesh(bpy.context.object.data)
mesh.verts[0].select = True
mesh.verts[0].co = (-3,-2,-3)

これは、Blender のスクリプト インターフェイスの文書化された落とし穴です。

于 2013-12-03T21:12:22.067 に答える