[Bf-python] How to get inside faces from inside verts?

lynx.abraxas at freenet.de lynx.abraxas at freenet.de
Thu May 21 23:59:21 CEST 2009


On 21/05/09 15:23:38, joe wrote:
> What do you want?  The global positions of each vertex?  Or in
> relation to the object center?

I  would like the ellipsoid-obj to be translated where as their rot. and scale
should be applied to the mesh. I think I got that with:

   mat= B.Mathutils.Matrix([dl[6],dl[7],dl[8], 0],  [dl[9],dl[10],dl[11],  0],
[dl[12],dl[13],dl[14], 0], [0,0,0,1])#octave: v' #why is this correct???
   #mat=  B.Mathutils.Matrix([dl[6],dl[9],dl[12],  0],   [dl[7],dl[10],dl[13],
0], [dl[8],dl[11],dl[14], 0], [0,0,0,1])#octave: v

   local_rot(ob, mat)
   ob.setSize(dl[0], dl[1], dl[2])
   ###ob.setLocation(dl[3], dl[4], dl[5])#transl obj and the mesh
   me= ob.getData(mesh=1) #blender shows the obj. according to its matrix
   me.transform(ob.matrix)#but does not apply it on the obj verts
   ob.setMatrix(ob.matrix.identity())#set identity to avoid double effect
   ob.setLocation(dl[3], dl[4], dl[5])#transl obj only not the mesh


In the next step I want a  copy  of  an  ellipsoid  mesh  which  I  apply  the
trnslation  of  the  ellipsoid  object on (just for pointInside). But the copy
should not be linked to the ellipsoid object so that the mesh  of  the  object
stays untouched by the translation of the (copied) mesh.

All types of coping I tried some how kept a link to the original object:

   ellmesh= ell.getData(mesh=1)
   ellmesh= bpy.data.meshes.get(ell.getData(name_only=1,mesh=1))
   ellmesh.get(ell.getData(name_only=1,mesh=1))
   ellmesh= copy.copy(ell.getData(mesh=1))

Is it possible?
Do You know how?

Thanks for Your help
Lynx

 To only apply the rot/scale, I believe
> you can simply multiply (do this temporarily though, don't store the
> result back in the mesh) with the rotation/scale matrix, which I
> believe is something like:
> 
> (matrix.rotationPart() * matrix.scalePart()) * vert_co
> 
> . . .but I could be wrong, look it up in the docs.  It'd help if you
> could give a more complete description of what your trying to do.
> 
> Joe
> 
> On Thu, May 21, 2009 at 11:17 AM,  <lynx.abraxas at freenet.de> wrote:
> > On 20/05/09 17:33:20, joe wrote:
> >> If applying rot/scale works, then it means your script isn't properly
> >> taking the object matrix into account.  To calculate the final
> >> transformed position of a vertex, you have to multiply it with the
> >> object's matrix, like so:
> >
> > Is this OK too?
> >
> >   ellmesh= ell.getData(mesh=1)
> >   ellmesh.transform(ell.matrix)  #apply any transform, just in case it wasn't done already
> >   ell.setMatrix(ell.matrix.identity())
> >
> >
> > This sadly has the unwanted side effect that the ellipsoids have their blender
> > centres at the global origin.
> > Without  the matrix application they have their blender centers at the centers
> > of each ellipsoid.
> > I created the ellipsoids by adding a UVsphere at the origin, rotating, scaling
> > and displacing it:
> >
> >
> >   me= B.Mesh.Primitives.UVsphere(segments, rings, diameter)
> >
> >   sc= B.Scene.GetCurrent()          # get current scene
> >   #http://www.blender.org/documentation/246PythonDoc/Object-module.html
> >   obn= "Ellipsoid_%0.4d" % dl[15]
> >   ob= sc.objects.new(me, obn) # add a new mesh-type object to the scene
> >
> >   #http://www.blender.org/documentation/246PythonDoc/Object.Object-class.html
> >   mat= B.Mathutils.Matrix([dl[6],dl[7],dl[8], 0],  [dl[9],dl[10],dl[11], 0], [dl[12],dl[13],dl[14], 0], [0,0,0,1])
> >
> >   local_rot(ob, mat)
> >   ob.setSize(dl[0], dl[1], dl[2])
> >   ob.setLocation(dl[3], dl[4], dl[5])
> >   me= ob.getData(mesh=1) #blender shows the obj. according to its matrix
> >   me.transform(ob.matrix)#but does not apply it on the obj verts
> >   ob.setMatrix(ob.matrix.identity())#set identity to avoid double effect
> >
> >
> > Why is blender showing the ellipsoids correctly where as their verts are still
> > the unit sphere until I apply the matrix to the mesh?
> > Can You point me to some docs explaining this behavior?
> > Is there a way to apply only rot and scale to the mesh but not the translation
> > at creation time?
> > How  can  I  later  some  how translate the mesh (for pointInside to work) but
> > leave the object as it is?
> >
> > Well, at least I'm slowly getting what I want;)
> >
> > Thanks for any help
> > Lynx
> > _______________________________________________
> > Bf-python mailing list
> > Bf-python at blender.org
> > http://lists.blender.org/mailman/listinfo/bf-python
> >
> _______________________________________________
> Bf-python mailing list
> Bf-python at blender.org
> http://lists.blender.org/mailman/listinfo/bf-python



More information about the Bf-python mailing list