Aligning the object axis to an edge [SOLVED]

On 21/08/2014 at 16:46, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 14
Platform: Mac OSX ;
Language(s) : PYTHON ;
I have been trying to create a script that would align the object axis (a polygonal object, of course), to a selected axis but keeping all the points in their same absolute positions.
I already have a way to find the points that define the edge.
So, lets say that I have the coordinates of vertex #1 of the edge in variable A and the coordinates of vertex #2 of the edge in variable B.
If I multiply both coordinates by the global matrix of the object, I get their absolute positions.
I can easily move the object to the absolute coordinate A and then move all the points to the difference between their old position and the new position. This way, I can effectively place the axis at the location of point A without changing how the object looks.
But I also want the axis oriented to the direction of the vertex #2.
In a nutshell, I want the object axis to be placed at the location of the vertex #1 and pointing (could be axis Z) to vertex #2. Besides this, I want all the points of the object adjusted so that it seems that only the axis moved and reoriented.
Can anyone help me out?p.s. This is in python, not in C++

On 21/08/2014 at 17:55, xxxxxxxx wrote:
this should be so simple, your object has a matrix (position rotation scale 4x4 matrix), you need to change position and rotation,here is the algorithm:
1 store all object points global position "absolute coordinate as you stated" in a list
2 transform your object to point A "this will move it to point A"
3 get the Vector (call it D) where: D = point B  point A
4 get the perpendicular vector between your object z axis and the D vector
E = cross(Z, D) #pseudo code
5 get angle between Z and D
A = acos(Z,D) #pseudo code
6 rotate your object matrix by the quaternion (this means a vector and an angle, which are E and A
Quat = Quaternion(E,A) #pseudo code
7 new matrix = old matrix * Quat
8 set all vertices with your stored list

On 22/08/2014 at 02:31, xxxxxxxx wrote:
Thank you for the explanation, Mohamed.
However, I find nothing about Quaternion in the python SDK.
What is the equivalent?

On 22/08/2014 at 02:59, xxxxxxxx wrote:
may be a look at function, or an euler rotation

On 22/08/2014 at 04:51, xxxxxxxx wrote:
Thank you again.
I made it work. It may not be the most elegant code, but it is working :)