





 
 




 
 


I am attempting to use POVRay for rigidbody dynamics.
I have software that produces rotation parameters as 313 Euler angles, psi,
theta, and phi, and the associated 313 rotation matrix. All this is done in 3D
Euclidean (Cartesian) space.
The problem I face is converting these Euclidean 313 parameters to work in
POVRay coordinates. In other words, I need to convert the Euclidean rotation
matrix to a POVRay matrix so that I can propery rotate objects (and their
textures).
Since the basic coordinate transform is <x,y,z> Euclidean to <z, x, y> I have
tried to rearrange the components of the Euclidean 313 rotation matrix to
duplicate this transform but the results are not correct.
Given a rotation matrix in 3D Euclidean space:
 00 01 02 
 10 11 12 
 20 21 22 
What is the correct way of transforming this matrix so that it will rotate a
POVRay object in the same way?
Post a reply to this message


 
 




 
 


>
> Given a rotation matrix in 3D Euclidean space:
>
>  00 01 02 
>  10 11 12 
>  20 21 22 
>
> What is the correct way of transforming this matrix so that it will rotate a
> POVRay object in the same way?
>
I neglected to point out that this Euclidean rotation is for an object whose
center of mass is at the origin <0,0,0>.
In POVRay it would be the same. An object is defined with center of mass at
the origin and then rotated.
Post a reply to this message


 
 




 
 


hi,
"LAP" <nomail@nomail> wrote:
> >
> > Given a rotation matrix in 3D Euclidean space:
> >
> >  00 01 02 
> >  10 11 12 
> >  20 21 22 
> >
> > What is the correct way of transforming this matrix so that it will rotate a
> > POVRay object in the same way?
my maths is .. nonexistent, so cannot answer the question. however, POVRay
applies rotations in axis order, so, if you can convert your matrix to x,y,z
angles, you should be able to use three separate consecutive rotations.
"The order of the rotations does matter. Rotations occur about the xaxis first,
then the yaxis, then the zaxis. If you are not sure if this is what you want
then you should only rotate on one axis at a time using multiple rotation
statements to get a correct rotation."
<https://wiki.povray.org/content/Reference:Transformations#Rotate>
regards, jr.
Post a reply to this message


 
 




 
 


"LAP" <nomail@nomail> wrote:
> What is the correct way of transforming this matrix so that it will rotate a
> POVRay object in the same way?
Hi,
try looking over the following link, and see if that gives you all that you
need.
http://www.flohmueller.de/pov_tut/trans/trans_400e.htm
If not, we can see what additional information you need.
BW
Post a reply to this message


 
 


From: kurtz le pirate
Subject: Re: Convert 313 Cartesian Euler Angles to POVRay Coordinates
Date: 10 Sep 2022 02:02:40
Message: <631c2880$1@news.povray.org>



 
 


On 09/09/2022 16:24, LAP wrote:
> Given a rotation matrix in 3D Euclidean space:
>
>  00 01 02 
>  10 11 12 
>  20 21 22 
>
> What is the correct way of transforming this matrix so that it will rotate a
> POVRay object in the same way?
not sure, but from memory, POV'matrix is
 a b c  < a, b, c, < a, d, g,
 d e f  > d, e, f,  or > b, e, h,
 g h i  g, h, i, c, f, i,
0, 0, 0 > 0, 0, 0,>
"transforms.inc" can also help you

Kurtz le pirate
Compagnie de la Banquise
Post a reply to this message


 
 




 
 


kurtz le pirate <kur### [at] gmailcom> wrote:
>
>  a b c  < a, b, c, < a, d, g,
>  d e f  > d, e, f,  or > b, e, h,
>  g h i  g, h, i, c, f, i,
> 0, 0, 0 > 0, 0, 0,>
>
Yes, but the orginal matrix is in Cartesian coordinates [x, y, z].
The POV Ray matrix operates on its own [x,y,z] coordinates which would be
equivalent to the Cartesian [y, z, x].
Thus, the matrix needs to be changed to:
< d , g, a,
e, h, b,
f, i, c,
0, 0, 0 >
So far this seems to work.
Another part of my problem was that I was also using POV Ray scaling and
translate commands which seem to really mess up the rotations.
From now on I will scale and translate with an external script and just use POV
Ray to rotate. I can also translate with the POV Ray rotation matrix without
distortion because it is a part of the transformation.
Post a reply to this message


 
 


From: kurtz le pirate
Subject: Re: Convert 313 Cartesian Euler Angles to POVRay Coordinates
Date: 10 Sep 2022 11:37:30
Message: <631caf3a$1@news.povray.org>



 
 


On 10/09/2022 17:16, LAP wrote:
>
> So far this seems to work.
>
> Another part of my problem was that I was also using POV Ray scaling and
> translate commands which seem to really mess up the rotations.
all tranformations are just **matrix operations**
for scaling :
 scaleX 0 0 0 
MSc =  0 scaleY 0 0 
 0 0 scaleZ 0 
 0 0 0 0 
scaling point : MSc.pt
for translating :
 1 0 0 dx 
MTr =  0 1 0 dy 
 0 0 1 dz 
 0 0 0 1 
translate : MTr.pt
(in povray matrix, the last line)
and, of corse, 'pt' is **also* a matrix
 x 
pt =  y 
 z 
 1 ]
and the order of application of the transformations is important !

Kurtz le pirate
Compagnie de la Banquise
Post a reply to this message


 
 


From: kurtz le pirate
Subject: Re: Convert 313 Cartesian Euler Angles to POVRay Coordinates
Date: 11 Sep 2022 06:07:54
Message: <631db37a$1@news.povray.org>



 
 


On 10/09/2022 17:16, LAP wrote:
>
> Yes, but the orginal matrix is in Cartesian coordinates [x, y, z].
>
> The POV Ray matrix operates on its own [x,y,z] coordinates which would be
> equivalent to the Cartesian [y, z, x].
>
> Thus, the matrix needs to be changed to:
>
> < d , g, a,
> e, h, b,
> f, i, c,
> 0, 0, 0 >
>
> So far this seems to work.
Hum... yes this is because POVRay use *lefthanded system*
Look at this page <http://www.povray.org/documentation/view/3.7.1/15/>
If you want to use *righthanded system* you can change camera settings
See *2.3.1.1.7 Handedness* in
<http://www.povray.org/documentation/view/3.6.1/246/>

Kurtz le pirate
Compagnie de la Banquise
Post a reply to this message


 
 




 
 


"LAP" <nomail@nomail> wrote:
> I am attempting to use POVRay for rigidbody dynamics.
>
> I have software that produces rotation parameters as 313 Euler angles, psi,
> theta, and phi, and the associated 313 rotation matrix. All this is done in 3D
> Euclidean (Cartesian) space.
>
> The problem I face is converting these Euclidean 313 parameters to work in
> POVRay coordinates. In other words, I need to convert the Euclidean rotation
> matrix to a POVRay matrix so that I can propery rotate objects (and their
> textures).
>
> Since the basic coordinate transform is <x,y,z> Euclidean to <z, x, y> I have
> tried to rearrange the components of the Euclidean 313 rotation matrix to
> duplicate this transform but the results are not correct.
>
> Given a rotation matrix in 3D Euclidean space:
>
>  00 01 02 
>  10 11 12 
>  20 21 22 
>
> What is the correct way of transforming this matrix so that it will rotate a
> POVRay object in the same way?
Hi
You may want to have a look at the code below.
The matrices.inc and vectors.inc files can be found in these libraries:
https://github.com/tok/POVRaymatrices
https://github.com/tok/UsefulPOVRaymacros
I've had a look at how POVRay does things internally  and I have tried
to keep the matrices simlar to that, and to do the multiplcations in the
same order. But keep in mind that since POVRay uses a left handed
coordinate system, the signs of the rotation angles are opposite of the
rotation angles in a right handed coordinate system.
I based some of the code below on what I found in these articles:
https://en.wikipedia.org/wiki/Euler_angles#Conventions_by_extrinsic_rotations
https://en.wikiversity.org/wiki/PlanetPhysics/Euler_313_Sequence

Tor Olav
http://subcube.com
https://github.com/tok
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
#version 3.7;
#include "../vectors.inc"
#include "POVRaymatrices/matrices.inc"
// #include "matrices.inc"
global_settings { assumed_gamma 1.0 }
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
#macro PrintVector3D(v0)
#debug concat("<", vstr(3, v0, ", ", 0, 1), ">")
#end // macro PrintVector3D
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
#debug "\n\n"
#declare v0 = <+3, 4, +2>;
#debug "v0 = \n"
PrintVector3D(v0)
#debug "\n\n"
#declare MM_0R = M_Row_FromDir3D(v0);
#debug "MM_0R = \n"
M_Print(MM_0R)
#debug "\n\n"
#declare Psi = +30;
#declare Theta = 45;
#declare Phi = +15;
#declare vR =
vrotate(
vrotate(
vrotate(
v0,
Psi*z
),
Theta*x
),
Phi*z
)
;
#debug "vR = \n"
PrintVector3D(vR)
#debug "\n\n"
#declare Transform_313 =
transform {
rotate Psi*z
rotate Theta*x
rotate Phi*z
}
#declare vT = VectorTransform(v0, Transform_313);
#debug "vT = \n"
PrintVector3D(vT)
#debug "\n\n"
#declare MM_Rot_313_a = M_FromTransform(Transform_313);
#debug "MM_Rot_313_a = \n"
M_Print(MM_Rot_313_a)
#debug "\n\n"
#declare MM_R_a = M_Mult(MM_0R, MM_Rot_313_a);
#debug "MM_R_a = \n"
M_Print(MM_R_a)
#debug "\n\n"
#declare MM_Rot_Psi = M_Rotate3D_AroundZ(radians(Psi)); // 3
#declare MM_Rot_Theta = M_Rotate3D_AroundX(radians(Theta)); // 1
#declare MM_Rot_Phi = M_Rotate3D_AroundZ(radians(Phi)); // 3
#declare MM_Rot_313_b =
M_Mult(
M_Mult(
MM_Rot_Psi,
MM_Rot_Theta
),
MM_Rot_Phi
)
;
#debug "MM_Rot_313_b = \n"
M_Print(MM_Rot_313_b)
#debug "\n\n"
#declare MM_R_b = M_Mult(MM_0R, MM_Rot_313_b);
#debug "MM_R_b = \n"
M_Print(MM_R_b)
#debug "\n\n"
#error "No error, just finished!"
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
The result from running the code above:
v0 =
<3.000000, 4.000000, 2.000000>
MM_0R =
array[1][4] {
{ 3.000000, 4.000000, 2.000000, 0.000000 }
}
vR =
<4.434831, 1.214589, 2.803043>
vT =
<4.434831, 1.214589, 2.803043>
MM_Rot_313_a =
array[4][4] {
{ 0.745010, 0.565650, 0.353553, 0.000000 },
{ 0.641457, 0.462097, 0.612372, 0.000000 },
{ 0.183013, 0.683013, 0.707107, 0.000000 },
{ 0.000000, 0.000000, 0.000000, 1.000000 }
}
MM_R_a =
array[1][4] {
{ 4.434831, 1.214589, 2.803043, 0.000000 }
}
MM_Rot_313_b =
array[4][4] {
{ 0.745010, 0.565650, 0.353553, 0.000000 },
{ 0.641457, 0.462097, 0.612372, 0.000000 },
{ 0.183013, 0.683013, 0.707107, 0.000000 },
{ 0.000000, 0.000000, 0.000000, 1.000000 }
}
MM_R_b =
array[1][4] {
{ 4.434831, 1.214589, 2.803043, 0.000000 }
}
Post a reply to this message


 
 




 
 


"Tor Olav Kristensen" <tor### [at] TOBEREMOVEDgmailcom> wrote:
> "LAP" <nomail@nomail> wrote:
> > I am attempting to use POVRay for rigidbody dynamics.
> >
> > I have software that produces rotation parameters as 313 Euler angles, psi,
> > theta, and phi, and the associated 313 rotation matrix. All this is done in 3D
> > Euclidean (Cartesian) space.
> >
> > The problem I face is converting these Euclidean 313 parameters to work in
> > POVRay coordinates. In other words, I need to convert the Euclidean rotation
> > matrix to a POVRay matrix so that I can propery rotate objects (and their
> > textures).
> >
> > Since the basic coordinate transform is <x,y,z> Euclidean to <z, x, y> I have
> > tried to rearrange the components of the Euclidean 313 rotation matrix to
> > duplicate this transform but the results are not correct.
> >
> > Given a rotation matrix in 3D Euclidean space:
> >
> >  00 01 02 
> >  10 11 12 
> >  20 21 22 
> >
> > What is the correct way of transforming this matrix so that it will rotate a
> > POVRay object in the same way?
>
> Hi
>
> You may want to have a look at the code below.
>...
Sorry. The include statements got messed up. They should be:
#include "vectors.inc"
#include "matrices.inc"

Tor Olav
http://subcube.com
https://github.com/tok
Post a reply to this message


 
 




 

