I have created a large set of individual objects by splitting an icosphere along its edges. I am currently trying to import these objects into unity, along with their appropriate transforms, relative to the origin in blender. I have been successful in importing the positions using the experimental transform functionality, however all of the newly created objects' rotation transforms are set to (0,0,0), i.e. the original parent icosphere's rotation. How could I go about recalculating the rotation of the new child objects prior to exporting to a .fbx format?

Thank you for your help, any assistance is greatly appreciated :)

  • $\begingroup$ Hey :). I'm pretty sure there is a very similar thread here somewhere, including a nice python script... Just can't seem to find it right now. $\endgroup$ – Jachym Michal May 11 '20 at 6:46
  • $\begingroup$ Got it! blender.stackexchange.com/q/118763 $\endgroup$ – Jachym Michal May 11 '20 at 6:52
  • $\begingroup$ @JachymMichal thanks for the link! $\endgroup$ – lennarthautzer May 11 '20 at 16:23

A script to do this

enter image description here Shows origin and local orientation of one split off face

  • Adds an icosphere, edge splits, separates and returns to object mode

  • Selected objects are the result of separate modifier.

  • For each face object get its lone face and calculate the global center and normal. See how far the normal is rotated from default quaternion.

    • Use this to create the global matrix aligned to normal, origin at center. The object space inverse is applied to the mesh with transfrom (makes origin (0, 0, 0).
  • The global transform is given to the object by way of world matrix.


import bpy
from mathutils import Quaternion

context = bpy.context

z = Quaternion()
for ob in context.selected_objects:
    me = ob.data
    mw = ob.matrix_world
    mwi = mw.inverted()
    f = ob.data.polygons[0]
    c = mw @ f.center
    n = mw @ f.normal

    q = z.rotation_difference(n.to_track_quat())
    M =  q.to_matrix().to_4x4()
    M.translation = c
    me.transform(mwi @ M.inverted())
    ob.matrix_world = M

Related. Another example of making a matrix based on known orthogonals.


  • $\begingroup$ Thank you very much for sharing this! It worked perfectly :) $\endgroup$ – lennarthautzer May 11 '20 at 16:23

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.