I try to get the positions of special vertices while animating. I only found quastions about positions of special vertices in one frame or positions of all vertices in an animation. But I need the combination.

My animation bases on a MakeHuman object (created with skeleton: default no toes and randomized via Modeling-> Random: Randomize, exported as mhx2 with options feet on ground, expressions, poses and in meter).

Import with MHX2 Runtime:

bpy.ops.import_scene.makehuman_mhx2(filter_glob="*.mhx2", filepath=link, useHelpers=False, useOffset=True, useOverride=True, useCustomShapes=True, useFaceShapes=True, useFaceShapeDrivers=True, useFaceRigDrivers=True, useRig=True, useRotationLimits=True, useDeflector=False, useHairDynamics=False, useHairOnProxy=False, useConservativeMasks=True, useSubsurf=False, useMasks='MODIFIER', useHumanType='BOTH', mergeBodyParts=False, rigType='EXPORTED', genitalia='NONE', hairType='NONE')

My animations bases on moving a bone and in changing facial shapes. I do not add shapekeys for every frame. I want to see the process of moving in my frames, but I need coordinates of a few special vertices for each frame.

My final goal is to get a bounding box around the face. If the object moves head to see the stars, I want the bottom line of bounding box directly under the chin. This is the reason I need the coordinates of some specific vertices. The lowest z-value is my buttom z-value for my bounding box. If you already have a script with pixel coordinates this is fine also. If there is another, better way than the coordinates of vertices, please also comment.

Here first of all my experiences:

My problem is that coordinates of vertices do not change over frames. If I add a new mesh with the animations, the IDs of vertices change. I searched for special indices with bpy.app.debug = True and in properties “Mesh display”: Indices

I tried several ways:

First way: direct request: coordinates do not change

import bmesh
import bpy

obj = bpy.context.active_object
for f in range(0, 51):
    mesh = obj.data

Second way: create new meshes in object mode (package bmesh) (source: Lofting: can I copy a Shape-Keyed mesh for each frame of its animation?)

import bmesh
import bpy

bm = bmesh.new()
bpy.app.debug = True  # indices can be switched on
obj = bpy.data.objects["human:Body"]
for f in range(0, 51):

    bm.from_object(ob, scene)

    copy = bpy.data.objects.new("Rib", rme)
    copy.matrix_world = ob.matrix_world


    bm.clear()  # interesting without.
    copy.select = True
    for child in copy.children:
        child.select = True 

I also tried the “EDIT” mode version with:

import bpy

hum_body = bpy.data.objects["human:Body"]
hum_body.select = True
bm = bmesh.from_edit_mesh(hum_body.data)
bmesh.update_edit_mesh(hum_body.data)  # with and without this

for f in range(0, 51):

Problem: IDs of vertices change in Ribs. I also tried the IDs in the new Rib, but they are not the same for different MakeHuman objects. I need a possibility that works for all objects (I want to move over several objects in a loop).

Third way: Like second way but without bmesh (source: Vertex coordinate after pose change and Iterating vertex of every frame in Blender)

import bpy

obj = bpy.context.active_object
scn = bpy.context.scene

mod_mesh = obj.to_mesh(scn, True, 'RENDER')
for f in range(0, 51):


I have to admit that I did not understand CoDEmanX hint in the comments to not change the IDs (Vertex coordinate after pose change)

Fourth way:

Set vertex as parent for empty. Because position of vertex does not change, position of empty is not affected.

By selecting

hum_boday.modifiers["ARMATURE"].show_in_editmode = True


hum_body. modifiers["ARMATURE"].show_on_cage = True

the mesh is also moves in EDIT-mode. But I can not see a difference for my positions.

My blender Version is 2.79. If you need a .blend file as minimal example, please explain how to add one.

Thank you in advance



You must log in to answer this question.

Browse other questions tagged .