# LOTRJ screws up again...

Hi guys, I have a favor to ask of you.:o Basically what I need is an IK constraint that will limit a bone’s X and Z rotation to a conical sector. For example: Just putting IK rotation limits on the X and Z axes of a bone results in a pyramid shaped range of motion like in the left of the pic below. I need the range of motion to be conical like on the right side of the image.

I would be really appreciative if someone could code this for me, but of course I understand if nobody wants to. I just figured it couldn’t hurt to ask.

Here’s a simple starter script, just add logic.

``````
#BPYCONSTRAINT
'''
'''

import Blender
from Blender import Mathutils

'''
This variable specifies the number of targets
that this constraint can use
'''
NUM_TARGETS = 1

'''
This function is called to evaluate the constraint
obmatrix:        (Matrix) copy of owner's 'ownerspace' matrix
targetmatrices:    (List) list of copies of the 'targetspace' matrices of the targets (where applicable)
idprop:            (IDProperties) wrapped data referring to this
constraint instance's idproperties
'''
def doConstraint(obmatrix, targetmatrices, idprop):
# Separate out the tranformation components for easy access.
obloc = obmatrix.translationPart()    # Translation
obrot = obmatrix.toEuler()            # Rotation
obsca = obmatrix.scalePart()        # Scale

print obrot

# Check rot here
#if idprop['u_rot'] == 1:
#    obrot[0] += ra*rv[0]
#    obrot[1] += ra*rv[1]
#    obrot[2] += ra*rv[2]

mtxloc = Mathutils.TranslationMatrix( obloc )
mtxrot = obrot.toMatrix().resize4x4()
mtxsca = Mathutils.Matrix([obsca[0],0,0,0], [0,obsca[1],0,0], [0,0,obsca[2],0], [0,0,0,1])

outputmatrix = mtxsca * mtxrot * mtxloc

# Return the new matrix.
return outputmatrix

'''
This function manipulates the matrix of a target prior to sending it to doConstraint()
target_object:                    wrapped data, representing the target object
subtarget_bone:                    wrapped data, representing the subtarget pose-bone/vertex-group (where applicable)
target_matrix:                    (Matrix) the transformation matrix of the target
id_properties_of_constraint:    (IDProperties) wrapped idproperties
'''
def doTarget(target_object, subtarget_bone, target_matrix, id_properties_of_constraint):
return target_matrix

'''
This function draws a pupblock that lets the user set
the values of custom settings the constraint defines.
This function is called when the user presses the settings button.
idprop:    (IDProperties) wrapped data referring to this
constraint instance's idproperties
'''
def getSettings(idprop):
return None

``````

<edit>
In case you are wondering how to handle the logic, you could perhaps put it this way:

• figure out how to convert current rotation to a sum of X and Z rotations. ie. rotate first in Z and then in X (hint: Y rotation is 0 in this case, perhaps that helps)
• check X rotation and clamp it if needed</edit>

Hmm, looks like I’m going to have to trudge through the BSoD Python scripting wiki…

I know next to nothing about python.

 Didn’t help as much as I thought. After reading the BSoD I was able to write the script to translate an object a specified distance on a frame change by memory, but that’s about it.

It seems the link to the only practical example leads to a page that hasn’t been written yet.

this would be useful in joints - range of motion stuff… I hope you can get this thing flying, Lord of the Rings Junkie

Me too. Does anyone know of some PRACTICAL tutorials I could use to point myself in the right direction? I think it is laughable to call what is on the python site a tutorial, it’s more like a reference manual.

You’re probably better off adapting someone else’s script in stead of starting from scratch.

You can see in bebraw’s very neat starting point that the variable: obrot is created… that’s the current rotation… it’s a “euler” see how you can adapt that… play with the math functions there are in Mathutils in the python api for doing stuff to eulers.

I don’t even know where to start though… Could I at least see what a simple IK script looks like? Possibly heavily commented to explain what each part does?

I need some practical examples that I can understand before I can script anything myself. Right now my understanding is limited to:

1. Displaying an object’s name, loc, rot, and scale in the command window.
2. Changing an object’s loc, rot, or scale value by a specified amount through script linking.

That’s what I learned from the BSoD.

Ya know… What the HELL am I talking about?!

It’s regular rotation constraints that have a pyramid range of motion, the IK limits appear to work as needed. I feel so stupid…

Anyway, I would still add a question, BSoD Python introduction is really useful, but I still do not know how to access by Python single bone of armature. Because the object is Armature itself not its single bone. So my question is how should I change for example this simple python command from BSoD to acces a location of the particular bone and not just the armature:

import Blender

ob = Blender.Object.Get(‘Armature’)
print ob # the object
print ob.name # object name
print ‘location’, ob.loc # object location

JiriH:

Try

``````
import Blender

ob = Blender.Object.Get('Armature')
print  ob		# the object
print  ob.name	# object name
print 'location', ob.loc	# object location

ob_data = ob.getData() # returns armature block in this case

bone = ob_data.bones['name_of_the_bone'] # dictionary of bones (bone_name -&gt; bone)

print bone # should print wanted bone

``````

BeBraw, thank you very much that really helps. As you are so kind in fact I need a help to make some kind of python expression for some repetitive work-flow in Blender, let say macro.

If you would be so kind to help I would PM you my problem (probably that is quite easy I just want to copy visual location/rotation from one bone to another, but as I do not know python it is very difficult to me). This would enable to speed up of FK/IK switching in Cessen simple Biped rig, some details here:
http://blenderartists.org/forum/showpost.php?p=1202244&postcount=66
http://blenderartists.org/forum/showpost.php?p=1173035&postcount=19

Thank you very much