Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 15/07/2011 at 07:11, xxxxxxxx wrote:
Hello all,
I have been trying to come up with a simple rotation such that the object is always oriented in the direction of movement.
There are two approaches: adjust the rotation based on the last known orientation or recalculate the direction from the delta in movement.
I have done the latter in the following code, but it doesn't seem to work very well. (The rotation is stored in the container just as well, but I couldn't figure out how to do it that way)
I'd be very grateful if someone could help me out here.
Thanks
import c4d, math #Welcome to the world of Python
def main() :
#get the object where the tag is attached to obj=op.GetObject()
#get the current frame of the document frame=doc.GetTime().GetFrame(doc.GetFps()) xrotglobal = frame / 10.0
bc = obj.GetData() lastrot = bc.GetData( 1009901 ) lastpos = bc.GetData( 1009902 )
if lastrot != None: obj.SetAbsRot(lastrot)
oppos = obj.GetAbsPos() oppos.y = 100 # fixed value just for now obj.SetAbsPos(oppos) if lastpos == None: lastpos = oppos deltapos= oppos - lastpos lastpos = oppos
rot = deltapos.GetLength()/100.0 # fixed value just for now normdel = deltapos.GetNormalized() lastrot.x = math.acos(normdel.x) obj.SetAbsRot(lastrot)
lastrot = obj.GetAbsRot()
bc.SetData( 1009901, lastrot ) bc.SetData( 1009902, lastpos )
obj.SetData(bc)
pass #put in your code here
On 15/07/2011 at 16:38, xxxxxxxx wrote:
Not sure what you are actually asking because "doesn't seem to work very well" is not really a good enough description of the actual problem you are having
However i would build a look at matrix myself to deal with what i think you are actually trying to do. There is lots of info on the net on building a lookat matrix.
Basically though i would create a direction vector from currentpos to lastpos then build a matrix that targets (currentpos +(direction vector(currentpos - lastpos)))
So that the objects z axis is always facing in the direction it is travelling as defined by the direction vector.
bc = obj.GetData() lastpos = bc.GetData( 1009902 ) Object = op.GetObject() objMatrix = Object.GetMg() p1 = objMatrix.off p2 = p1 + (p1 - lastpos) v0 = p1 v3 = p2 - p1 v3.Normalize() v2 = p2-p1 v2.Cross(c4d.Vector(0,1,0)).Normalize() v1 = p2-p1 v2.Cross(c4d.Vector(0,0,1)).Normalize() m = c4d.Matrix(v0 , v1, v2 , v3) #create new instance of Matrix Rotation = c4d.utils.MatrixToHPB(m) orot = c4d.utils.MatrixToHPB(objMatrix) Rotation.z = orot.z Object.SetAbsRot(Rotation) lastpos = p1#store lastpos bc.SetData( 1009902, lastpos ) obj.SetData(bc) c4d.EventAdd()