18

How can I use a Python script to obtain the exact coordinates of an object?

I have not been able to find out how to do this in the documentation.

ideasman42
  • 47,387
  • 10
  • 141
  • 223
Qu0rk
  • 379
  • 1
  • 2
  • 10

1 Answers1

24

Background: The object location (in fact transformation - so location/scale/rotation) is defined by initial values which are used to calculate the final transformation.

  • initial transform (as set by the user and possibly set by animation FCurves and Drivers).
    as a tool author, to manipulate data this is what you'll want to access typically
  • final transform (with parenting, constraints, and rigid body physics applied).
    when writing exporters or reading, typically this is what you will want to access since its whats displayed in the view (but you can't directly manipulate it)

To get the input location you can simply do:

loc = bpy.context.object.location... or via its matrix
bpy.context.object.matrix_local.to_translation()

To get the output transformation you can only do this by accessing the worldspace matrix.

loc = bpy.context.object.matrix_world.to_translation()

You may want to get the loc/rotation/scale, in that case:

loc, rot, scale = bpy.context.object.matrix_world.decompose()


If you want to test the location for example, you can set the cursor position.

from bpy import context
context.scene.cursor_location = context.object.matrix_world.to_translation()

Or you can create a new empty:

import bpy
from bpy import context
obj = bpy.data.objects.new("Empty", None)
context.scene.objects.link(obj)
obj.matrix_world  = context.object.matrix_world

... note, if the matrix contains shear, you wont see this in the empty, for that try the MathVis addons.

ideasman42
  • 47,387
  • 10
  • 141
  • 223
  • What would be the best way for me to test the above code? The Blender-Python integration tutorials I have completed have been based around graphical results. – Qu0rk Mar 07 '14 at 05:09
  • Added notes on viewing the transformation. – ideasman42 Mar 07 '14 at 08:41