this works well 
import bge
from mathutils import Vector
def main():
cont = bge.logic.getCurrentController()
own = cont.owner
Target = own.scene.objects['Target']
if 'Helper' not in own:
own['Helper'] = own.scene.addObject('Helper',Target,0)
own['Helper2'] = own.scene.addObject('Helper',Target,0)
local = eval(own['local'])
r = Vector(local).magnitude
own['Desired']=str(local)
targetPos1 = Target.worldPosition+(Target.worldOrientation*Vector(local))
if 'p' not in own:
own['p']= own.scene.addObject('point',Target,0)
own['p'].worldPosition=targetPos1
own['p'].setParent(Target,0,1)
v2 = own.getVectTo(Target)
v2t = Target.getVectTo(targetPos1)
if v2[0]>r:
#float to radius
own.applyForce(v2[1]*15*v2[0],0)
own.applyForce([0,0,own.mass*9.8],0)
own.worldLinearVelocity*=.5
else:
own.applyForce([0,0,own.mass*9.8],0)
own.worldLinearVelocity*=0
if 'rotMe' not in own:
if own.getDistanceTo(targetPos1)>.05:
v2o = Target.getVectTo(own)
own['Helper2'].alignAxisToVect(v2o[1],0,1)
own['Helper2'].alignAxisToVect([0,0,1],2,1)
local = own.worldPosition - Target.worldPosition
own['local2'] = own['Helper2'].worldOrientation.inverted()*local
own['x']=.0025
own['rotMe']=True
else:
if own.getDistanceTo(targetPos1)>.5:
v2t=own['Helper'].getVectTo(targetPos1)
own['Helper'].alignAxisToVect(v2t[1],0,1)
own['Helper'].alignAxisToVect([0,0,1],2,1)
rot = own['Helper2'].worldOrientation.to_quaternion()
rot2 = rot.slerp(own['Helper'].worldOrientation.to_quaternion(),own['x'])
if own['x']<.999:
own['x']+=.0025
own['Helper2'].worldOrientation=rot2
p2 = own['Helper2'].worldTransform*own['local2']
v2b = own.getVectTo(p2)
own.applyForce(v2b[1]*250*v2b[0]*v2b[0],0)
own.applyForce([0,0,own.mass*9.8],0)
D = own.getDistanceTo(targetPos1)
if D<.5:
own.applyForce(v2b[1]*2750,0)
own.worldLinearVelocity*=.55
own.color = [0,0,1,1]
own['D']=D
else:
own.applyForce(v2b[1]*1500,0)
own.worldLinearVelocity*=.55
own.alignAxisToVect(v2[1],0,1)
own.alignAxisToVect([0,0,1],2,1)
own.applyForce(v2b[1]*1750*v2b[0],0)
else:
own.worldPosition=targetPos1
own.alignAxisToVect(own.getVectTo(Target)[1],0,1)
own.alignAxisToVect([0,0,1],2,1)
own['Helper'].endObject()
own['Helper2'].endObject()
own.setParent(Target)
own['p'].endObject()
own.color = [1,0,0,1]
own.state = 2
main()
Attachments
FloatToRadius_And_Rotate_to_Place_6_b.blend (463 KB)