2

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 :)

lh1395
  • 25
  • 3

1 Answers1

2

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.

Script.

import bpy
from mathutils import Quaternion

context = bpy.context
bpy.ops.mesh.primitive_ico_sphere_add(enter_editmode=True)
bpy.ops.mesh.edge_split()
bpy.ops.mesh.separate(type='LOOSE')

bpy.ops.object.mode_set()
z = Quaternion()
for ob in context.selected_objects:
    print(ob)
    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.

https://blender.stackexchange.com/a/177331/15543

batFINGER
  • 84,216
  • 10
  • 108
  • 233
  • Thank you very much for sharing this! It worked perfectly :) – lh1395 May 11 '20 at 16:23
  • Note, the above script seems to only produce correct results if the objects are at the world origin... (unless I'm missing something). – eobet Mar 08 '21 at 22:05
  • Oh, and the above script also only works if the original object has no previous rotation... trying to figure out why now, but... quaternions... – eobet Mar 13 '21 at 21:48