242 lines
6.4 KiB
Python
242 lines
6.4 KiB
Python
# Blender.Metaball module and the Metaball PyType metaball
|
|
|
|
"""
|
|
The Blender.Metaball submodule
|
|
|
|
This module provides access to B{Metaball} data in Blender and the elements they contain.
|
|
|
|
|
|
Example::
|
|
import Blender
|
|
ob = Blender.Object.New("Mball","mb")
|
|
mb = Blender.Metaball.New()
|
|
for i in xrange(20):
|
|
element= mb.elements.add()
|
|
element.loc= Blender.Mathutils.Vector(i, 0, 0)
|
|
ob.link(mb)
|
|
sc = Blender.Scene.GetCurrent()
|
|
sc.link(ob)
|
|
|
|
from Blender import *
|
|
|
|
Example::
|
|
# Converts the active armature into metaballs
|
|
def main():
|
|
|
|
scn= Scene.GetCurrent()
|
|
ob_arm= scn.getActiveObject()
|
|
if not ob_arm or ob_arm.type!='Armature':
|
|
Draw.PupMenu('No Armature Selected')
|
|
return
|
|
arm= ob_arm.data
|
|
|
|
res= Draw.PupFloatInput('res:', 0.2, 0.05, 2.0)
|
|
if not res:
|
|
return
|
|
|
|
# Make a metaball
|
|
ob_mb= Object.New('Mball')
|
|
mb= Metaball.New()
|
|
mb.setWiresize(res)
|
|
|
|
# Link to the Scene
|
|
ob_mb.link(mb)
|
|
scn.link(ob_mb)
|
|
ob_mb.sel=1
|
|
ob_arm.sel= 0
|
|
ob_mb.setMatrix(ob_arm.matrixWorld)
|
|
|
|
|
|
meta_type= 0 # all elemts are ball type
|
|
meta_stiffness= 2.0 # Volume
|
|
|
|
for bone in arm.bones.values():
|
|
print bone
|
|
|
|
# Find out how many metaballs to add based on bone length, 4 min
|
|
length= bone.length
|
|
if length < res:
|
|
mballs= 4
|
|
else:
|
|
mballs= int(length/res)
|
|
if mballs < 4:
|
|
mballs = 4
|
|
|
|
print 'metaball count', mballs
|
|
|
|
# get the bone properties
|
|
head_rad= bone.headRadius
|
|
tail_rad= bone.tailRadius
|
|
|
|
head_loc= bone.head['ARMATURESPACE']
|
|
tail_loc= bone.tail['ARMATURESPACE']
|
|
|
|
|
|
for i in range(mballs):
|
|
f= float(i)
|
|
|
|
w1= f/mballs # weighting of this position on the bone for rad and loc
|
|
w2= 1-w1
|
|
|
|
loc= head_loc*w1 + tail_loc*w2
|
|
rad= (head_rad*w1 + tail_rad*w2) * 1.3
|
|
|
|
# Add the metaball
|
|
ml= mb.elements.add()
|
|
ml.co= loc
|
|
ml.radius= rad
|
|
ml.stiffness= meta_stiffness
|
|
|
|
|
|
Window.RedrawAll()
|
|
|
|
main()
|
|
|
|
@type Types: readonly dictionary
|
|
@var Types: MeteElement types.
|
|
- BALL
|
|
- TUBE
|
|
- PLANE
|
|
- ELIPSOID
|
|
- CUBE
|
|
"""
|
|
|
|
|
|
def New (name):
|
|
"""
|
|
Creates a new Metaball.
|
|
@type name: string
|
|
@param name: The name of the metaball. If this parameter is not given (or not valid) blender will assign a name to the metaball.
|
|
@rtype: Blender Metaball
|
|
@return: The created Metaball.
|
|
"""
|
|
|
|
def Get (name):
|
|
"""
|
|
Get the Metaball from Blender.
|
|
@type name: string
|
|
@param name: The name of the requested Metaball.
|
|
@rtype: Blender Metaball or a list of Blender Metaballs
|
|
@return: It depends on the 'name' parameter:
|
|
- (name): The Metaball with the given name;
|
|
- (): A list with all Metaballs in the current scene.
|
|
"""
|
|
|
|
class Metaball:
|
|
"""
|
|
The Metaball object
|
|
===================
|
|
This metaball gives access to generic data from all metaballs in Blender.
|
|
@ivar name: The unique name of the metaball.
|
|
@type name: string
|
|
@ivar users: The user count (read only)
|
|
@type users: int
|
|
@ivar elements: Element iterator of MetaElemSeq type.
|
|
@type elements: MetaElemSeq
|
|
@ivar wiresize: display resolution.
|
|
Value clamped between 0.05 and 1.0.
|
|
|
|
A lower value results in more polygons.
|
|
@type wiresize: float
|
|
@ivar rendersize: render resolution.
|
|
Value clamped between 0.05 and 1.0.
|
|
|
|
A lower value results in more polygons.
|
|
@type rendersize: float
|
|
@ivar thresh: Threshold setting for this metaball.
|
|
Value clamped between 0.0 and 5.0.
|
|
@type thresh: float
|
|
@ivar materials: List of up to 16 Materials or None types
|
|
Only the first material of the mother-ball used at the moment.
|
|
@type materials: list
|
|
"""
|
|
|
|
def copy():
|
|
"""
|
|
Return a copy of this metaball object data.
|
|
@rtype: Metaball
|
|
@return: Metaball
|
|
"""
|
|
|
|
class MetaElemSeq:
|
|
"""
|
|
The MetaElemSeq object
|
|
======================
|
|
This object provides sequence and iterator access to the metaballs elements.
|
|
The elements accessed within this iterator "wraps" the actual metaball elements; changing any
|
|
of the elements's attributes will immediately change the data in the metaball.
|
|
|
|
This iterator is most like pythons 'set' type.
|
|
"""
|
|
|
|
def add():
|
|
"""
|
|
Append a new element to the metaball.
|
|
no arguments are taken, instead a new metaelement is
|
|
added to the metaball data and returned.
|
|
This new element can then be modified.
|
|
|
|
@return: a new meta element.
|
|
@rtype: Metaelement
|
|
"""
|
|
|
|
def remove(element):
|
|
"""
|
|
remove an element from the metaball data.
|
|
|
|
if the element is not a part of the metaball data, an error will be raised.
|
|
|
|
@return: None
|
|
@rtype: None
|
|
"""
|
|
|
|
def __iter__():
|
|
"""
|
|
Iterate over elements in this metaball.
|
|
|
|
@return: One of the metaelem in this metaball.
|
|
@rtype: Metaelem
|
|
"""
|
|
|
|
def __len__():
|
|
"""
|
|
Iterate over elements in this metaball.
|
|
|
|
@return: The number of elements in this metaball
|
|
@rtype: int
|
|
"""
|
|
|
|
class Metaelem:
|
|
"""
|
|
The Metaelem object
|
|
===================
|
|
This gives direct access to meta element data within a metaball.
|
|
@ivar type: The type of the metaball.
|
|
Values must be from L{Types}
|
|
|
|
Example::
|
|
from Blender import Metaball
|
|
mb= Metaball.Get('mb')
|
|
for el in mb.elements:
|
|
el.type= Metaball.Types.CUBE
|
|
@type type: int
|
|
@ivar co: The location of this element.
|
|
@type co: Vector
|
|
@ivar dims: Element dimensions.
|
|
Values clamped between 0 and 20 on all axies.
|
|
@type dims: Vector
|
|
@ivar quat: Element rotation.
|
|
@type quat: Quaternion
|
|
@ivar stiffness: Element stiffness.
|
|
Value clamped between 0 and 10.
|
|
@type stiffness: float
|
|
@ivar radius: Element radius.
|
|
Value clamped between 0 and 5000.
|
|
@type radius: float
|
|
@ivar negative: Element negative volume status.
|
|
@type negative: bool
|
|
@ivar hide: Element hidden status.
|
|
@type hide: bool
|
|
"""
|
|
|
|
|