how to get data position and pint out?

On 24/03/2015 at 22:21, xxxxxxxx wrote:

Hi, my name is yefta. I have a problem i cant solved, and i will be grateful if anyone here can give me help.

I have a roller coaster, and i want to get data position of the moving train and i want to record them continously. the object is the train.
can u help me?
I need to analyze that position of train

thankyou so much

On 25/03/2015 at 07:59, xxxxxxxx wrote:


I don't know what you want to achieve in the end or what workflow you want to implement. From what you tell I think you could create a Python Tag and add this tag to the object you want to observe. In that python tag's code you could write something like this:

import c4d  
def main() :  
  print op.GetObject().GetMg().off  

In this case "op" is the python tag itself, GetObject() returns the host object and GetMg() returns the object's world space matrix. This Matrix includes a translation part "off". When you now run the scene you will find the current position printed to the console window.

Best wishes,

On 26/03/2015 at 01:10, xxxxxxxx wrote:

thankyou so much s_bach.. thats what i need.
hmm but can u display the vector in degree?
in my mind it will shows like this

and actually i want to print it to file. maybe to txt or csv. can you help me out?

On 26/03/2015 at 01:57, xxxxxxxx wrote:


Showing the position in degree doesn't make sense. Do you mean the rotation? You can get the rotation vector from the matrix using MatrixToHPB(). The result is a rotation in radians, so you would have to convert the values to degree yourself with Deg().

The Cinema 4D Python API does not provide any specific functions to write files. But of course you can use the standard Python libraries to access files.

best wishes,

On 27/03/2015 at 00:14, xxxxxxxx wrote:

i have tried use MatrixToHPB but it doesnt work. and then i tried VectorToHPB and it works. but the third coloumn always "0". How come? this is my code
import c4d
#Welcome to the world of Python

def main() :
  pass  #put in your code here
  a = op.GetObject().GetMg().off
  b = c4d.utils.MatrixToHPB(a)
  print a
Inline image 1

Inline image 2
and how to convert values to deg?

On 27/03/2015 at 00:22, xxxxxxxx wrote:

def main() :
  pass  #put in your code here
  a = op.GetObject().GetMg().off
  b = c4d.utils.VectorToHPB(a)
  print b

On 27/03/2015 at 00:28, xxxxxxxx wrote:

Vector(3.144, 0.239, 0)
Vector(3.144, 0.256, 0)
Vector(3.144, 0.273, 0)
Vector(3.145, 0.29, 0)
Vector(3.145, 0.306, 0)
Vector(3.145, 0.322, 0)
Vector(3.145, 0.336, 0)
Vector(3.146, 0.35, 0)
Vector(3.146, 0.361, 0)
Vector(3.147, 0.371, 0)
Vector(3.147, 0.379, 0)
Vector(3.147, 0.385, 0)
Vector(3.148, 0.39, 0)
Vector(3.148, 0.394, 0)
Vector(3.148, 0.396, 0)
Vector(3.148, 0.397, 0)
Vector(3.148, 0.397, 0)
Vector(3.148, 0.395, 0)
Vector(3.148, 0.393, 0)
Vector(3.148, 0.389, 0)
Vector(3.148, 0.385, 0)

On 27/03/2015 at 01:52, xxxxxxxx wrote:


as the name suggests MatrixToHPB() must be used with a Matrix, not with the translation vector as in your code. And as said before, turning the position into a rotation using VectorToHPB() does not seem to make sense. As you can read in the documentation, VectorToHPB() will always return a rotation with bank set to zero.

best wishes,

On 27/03/2015 at 02:00, xxxxxxxx wrote:


the first case:
you´ll need to feed the matrix not the offset vector from this matrix

a = op.GetObject().GetMg()
b = c4d.utils.MatrixToHPB(a)

the second case:
euler angle always gives you a zero banking back it calculates the direction with a fixed rotation around this direction

a = op.GetObject().GetMg().off
b = c4d.utils.VectorToHPB(a)

for a complex track you might think about flipping conditions or quaternions.

rad to degree: c4d.utils.Deg( r )
rad = HPB * math.pi / 180

Hope this helps?
Best wishes

On 02/04/2015 at 07:17, xxxxxxxx wrote:

Hello Yefta

was your question answered?

best wishes,

On 05/04/2015 at 23:02, xxxxxxxx wrote:

hello Martin.

yes, it helps. but i still cant transform to degree. it shows "a float is required".

can u help me out?

On 05/04/2015 at 23:14, xxxxxxxx wrote:

hello s_bach

i'm sorry, been off for a while. yes it's answered, but not all.

if i type  c4d.utils.Deg(b)
it shows in console "TypeError : a float is required"

On 06/04/2015 at 04:21, xxxxxxxx wrote:

Hello Yefta,

sorry my answer was a little sloppy.
This should answer your question ...

  rad = c4d.Vector(0,1,1)  
  deg = c4d.Vector(c4d.utils.Deg(rad.x),c4d.utils.Deg(rad.y),c4d.utils.Deg(rad.z))  
  print deg  
  deg2 =  180/math.pi*rad  
  print deg2  

Best wishes

On 16/04/2015 at 00:35, xxxxxxxx wrote:

thanks martin. 😄