如何在世界空间而不是本地空间中移动动画网格的顶点?

问题描述 投票:0回答:1

我正在尝试将向量添加到选定的对象顶点。

def force(self):
        gravity = mathutils.Vector((0.0, 0.0, -0.5))
        
        obj = bpy.context.object
        
        obj.data.vertices[0].co += gravity

问题可视化

  1. 网格处于静止位置。
  2. 执行force()方法。
  3. 网格通过骨架修改器变形。
  4. 执行force()方法。

如您所见,顶点的平移仍然应用于对象局部空间。

我尝试过的解决方案是使用对象“matrix_world”。这不起作用,因为我随后获得了对象变换的单位矩阵,它根本没有改变,因为我正在变换顶点,而不是对象。

非常感谢任何帮助。

python blender bpy
1个回答
0
投票

我找到了解决方案!

gravity = mathutils.Vector((0.0, 0.0, -0.3))
    
    obj = bpy.context.object
    
    depsgraph = bpy.context.evaluated_depsgraph_get()
    scene = bpy.data.scenes['Scene']
    
    obj.crazyspace_eval(depsgraph, scene)
    
    delta = obj.crazyspace_displacement_to_original(vertex_index=0, displacement=gravity)
    
    obj.data.vertices[0].co += delta

    obj.crazyspace_eval_clear()

在我的对象上运行“crazyspace_eval()”方法,然后将“crazyspace_displacement_to_original()”的结果添加到我的顶点坐标解决了这个问题。

解决方案可视化 :https://i.sstatic.net/82GgxmAT.jpg

如图所示,在物体被骨架修改器变形之前(1)和之后(2)添加到物体上的“重力”矢量。

© www.soinside.com 2019 - 2024. All rights reserved.