# Mapping rotation to the linear range of a slider

Hello there,

I’ve this requirement where I should map the rotation ( of a single axis ) of a bone to a slider. That is, when the bone is in the rest position ( X rotation 0 ) this slider’s value must be zero. And as the bone is rotated along the X axis the slider’s value must also increase. And by the time the bone hits the designated angle, say -39 degrees, the slider should hit a value of one.

I tried to implement this with drivers where the slider’s value is driven by the x axis rotation angle of the driving bone. And to map the value, I’ve put together a script. This script works perfectly when the both the driven and the driver have linear, non rotational values but when I try to use it in the current scenario, it doesn’t seem to work.

Well, it works, but not as I’d like it to work. For instance, even when the bone is rotated one full circle, it produces a driver value of only 0.167.

It seems obvious to me that rotation couldn’t be handled as easy as this. And I would very much like to know how at all it could be handled.

This also happens to be my first python/blender code ( and no, it’s not entirely mine. I got the core logic somewhere in the internet ) so I’m shooting a bit in the dark here, haha. Here’s the code. This is specifically made for ranges where the maximum input range is lesser in value than the minimum input range ( as in a range of 0 to -32 )

import bpy
from mathutils import noise
from math import *

def rngFndrD( drvrRst,drvrFin,oLwrLmt,oUprLmt,drvrInpt):

if drvrRst &gt;= drvrInpt &gt;= drvrFin:

if drvrRst == drvrFin:

return None

if oLwrLmt == oUprLmt:

return None

#check reversed input range
reverseInput = False
oldMin = min( drvrRst, drvrFin )
oldMax = max( drvrRst, drvrFin )

if not oldMin == drvrRst:

reverseInput = True

#check reversed output range
reverseOutput = False
newMin = min( oLwrLmt, oUprLmt )
newMax = max( oLwrLmt, oUprLmt )

if not newMin == oLwrLmt :

reverseOutput = True

portion = (drvrInpt-oldMin)*(newMax-newMin)/(oldMax-oldMin)

if reverseInput:

portion = (oldMax-drvrInpt)*(newMax-newMin)/(oldMax-oldMin)

result = portion + newMin

if reverseOutput:

result = newMax - portion

return result

else: #To handle input values greater than or lesser than the input range

if drvrRst &gt; drvrFin:

if drvrInpt &gt; drvrRst:

return oLwrLmt

else:

return oUprLmt

else:

if drvrInpt &lt; drvrRst:

return oLwrLmt

else:

return oUprLmt

bpy.app.driver_namespace['rngFndrD'] = rngFndrD

I know that it could be a pain to go through another person’s code so any help regarding this would be much appreciated a lot.

Yours Sincerely,
Timothy