# Opengl Position Matrix/Circular Motion

Hello Experts,

I have a segment of code that updates an object's position based on Lorenz Attractor calculations.  I would like to convert this to update an objects positions in a circular path at a set height on the y axis.  I think I just need to change the x and z calculations but I'm not sure if that is correct or what to change to.
``````{
//  Lorenz integration parameters
double dt = 0.003;
double s = -1.7;
double b = 2.66;
double r = 50;
//  Old vectors
double D,Nx,Ny,Nz;
double Dx0 = Dx;
double Dy0 = Dy;
double Dz0 = Dz;
double Ux0 = Ux;
double Uy0 = Uy;
double Uz0 = Uz;
//  Fix degenerate case
if (X==0 && Y==0 && Z==0) Y = Z = 40;
//  Update position
Dx = s*(Y-X);
Dy = X*(r-Z)-Y;
Dz = X*Y - b*Z;
X += dt*Dx;
Y += dt*Dy;
Z += dt*Dz;
//  Normalize DX
D = sqrt(Dx*Dx+Dy*Dy+Dz*Dz);
Dx /= D;
Dy /= D;
Dz /= D;
//  Calculate sideways
Sx  = Dy0*Dz-Dz0*Dy;
Sy  = Dz0*Dx-Dx0*Dz;
Sz  = Dx0*Dy-Dy0*Dx;
//  Calculate Up
Ux  = Dz*Sy - Dy*Sz;
Uy  = Dx*Sz - Dz*Sx;
Uz  = Dy*Sx - Dx*Sy;
//  Normalize Up
D = sqrt(Ux*Ux+Uy*Uy+Uz*Uz);
Ux /= D;
Uy /= D;
Uz /= D;
//  Eye and lookat position
Ex = X-7*Dx;
Ey = Y-7*Dy;
Ez = Z-7*Dz;
Ox = X;
Oy = Y;
Oz = Z;
//  Next DX
Nx = s*(Y-X);
Ny = X*(r-Z)-Y;
Nz = X*Y - b*Z;
//  Pitch angle
pitch = 180*acos(Dx*Dx0+Dy*Dy0+Dz*Dz0);
//  Roll angle
D = (Ux*Ux0+Uy*Uy0+Uz*Uz0) / (Dx*Dx0+Dy*Dy0+Dz*Dz0);
if (D>1) D = 1;
roll = (Nx*Sx+Ny*Sy+Nz*Sz>0?+1:-1)*960*acos(D);
//  Yaw angle
yaw = 0;
//  Power setting (0-1)
if (Dy>0.8)
pwr = 100;
else if (Dy>-0.2)
pwr = 20+100*Dy;
else
pwr = 0;
}
``````
###### Who is Participating?

Commented:
To make it rotate in a circle, do this:

Y = constant;

And then remember to increment time after each iteration. Is that what you're after?
0

Author Commented:
As it stands I have my positions change as the following:

X = dt*Dx. etc...that way I don't increment time since it is the same change every iteration.

So should I use the derivative of the equations you gave me?
Dx = -sin(time);
Dy = 0;
Dz =  cos(time);

I tried your suggestion, but I got some very odd movement.  Not sure I implemented it correctly.
0

Author Commented:
Using the attached changes...I do get the object to move in a circular path and it appears to be updating direction properly, my object is pointing down, but that is not a problem with this segment of code.  However, every half second or so, it rotates ~45 degrees and then rotates back.  I'm not sure what is causing this.
``````if (fly)
{
//  Lorenz integration parameters
double dt = 0.003;
//  Old vectors
double D,Nx,Ny,Nz;
double Dx0 = Dx;
double Dy0 = Dy;
double Dz0 = Dz;
double Ux0 = Ux;
double Uy0 = Uy;
double Uz0 = Uz;
//  Fix degenerate case
if (X==0 && Y==0 && Z==0) Y = Z = 40;
//  Update position
Dx = -sin(B52_direction);
Dy = 20;
Dz = cos(B52_direction);
X += dt*Dx;
Y += 0;
Z += dt*Dz;
//  Normalize DX
D = sqrt(Dx*Dx+Dy*Dy+Dz*Dz);
Dx /= D;
Dy /= D;
Dz /= D;
//  Calculate sideways
Sx  = Dy0*Dz-Dz0*Dy;
Sy  = Dz0*Dx-Dx0*Dz;
Sz  = Dx0*Dy-Dy0*Dx;
//  Calculate Up
Ux  = Dz*Sy - Dy*Sz;
Uy  = Dx*Sz - Dz*Sx;
Uz  = Dy*Sx - Dx*Sy;
//  Normalize Up
D = sqrt(Ux*Ux+Uy*Uy+Uz*Uz);
Ux /= D;
Uy /= D;
Uz /= D;
//  Eye and lookat position
Ex = X-7*Dx;
Ey = Y-7*Dy;
Ez = Z-7*Dz;
Ox = X;
Oy = Y;
Oz = Z;
//  Next DX
Nx = -sin(B52_direction);
Ny = 20;
Nz = cos(B52_direction);
//  Pitch angle
pitch = 180*acos(Dx*Dx0+Dy*Dy0+Dz*Dz0);
//  Roll angle
D = (Ux*Ux0+Uy*Uy0+Uz*Uz0) / (Dx*Dx0+Dy*Dy0+Dz*Dz0);
if (D>1) D = 1;
roll = (Nx*Sx+Ny*Sy+Nz*Sz>0?+1:-1)*960*acos(D);
//  Yaw angle
yaw = 0;
//  Power setting (0-1)
if (Dy>0.8)
pwr = 100;
else if (Dy>-0.2)
pwr = 20+100*Dy;
else
pwr = 0;
}
//  Static Roll/Pitch/Yaw
else
{
Ex = -2*dim*Sin(th)*Cos(ph);
Ey = +2*dim        *Sin(ph);
Ez = +2*dim*Cos(th)*Cos(ph);
Ox = Oy = Oz = 0;
X = Z = 0;
Y = 20;
Dx = 1; Dy = 0; Dz = 0;
Ux = 0; Uy = 1; Uz = 0;
}
``````
0

Author Commented:
Actually setting roll = 0, solved this.
0

Author Commented:
I am now getting the proper circular motion I was looking for.  I'm not having an issue with the diameter in the scenario.  I am not sure how to increase it.  My direction variable increments every iteration by .04.
``````if (fly)
{
//  Lorenz integration parameters
double dt = 0.003;
//  Old vectors
double D,Nx,Ny,Nz;
double Dx0 = Dx;
double Dy0 = Dy;
double Dz0 = Dz;
double Ux0 = Ux;
double Uy0 = Uy;
double Uz0 = Uz;
//  Fix degenerate case
if (X==0 && Y==0 && Z==0) Y = Z = 40;
//  Update position
Dx = -sin(B52_direction);
Dy = 20;
Dz = cos(B52_direction);
X += dt*Dx;
Y += 0;
Z += dt*Dz;
//  Normalize DX
D = sqrt(Dx*Dx+Dy*Dy+Dz*Dz);
Dx /= D;
Dy /= D;
Dz /= D;
//  Calculate sideways
Sx  = Dy0*Dz-Dz0*Dy;
Sy  = Dz0*Dx-Dx0*Dz;
Sz  = Dx0*Dy-Dy0*Dx;
//  Calculate Up
Ux  = Dz*Sy - Dy*Sz;
Uy  = Dx*Sz - Dz*Sx;
Uz  = Dy*Sx - Dx*Sy;
//  Normalize Up
D = sqrt(Ux*Ux+Uy*Uy+Uz*Uz);
Ux /= D;
Uy /= D;
Uz /= D;
//  Eye and lookat position
Ex = X-7*Dx;
Ey = Y-7*Dy;
Ez = Z-7*Dz;
Ox = X;
Oy = Y;
Oz = Z;
//  Next DX
Nx = -sin(B52_direction);
Ny = 20;
Nz = cos(B52_direction);
//  Pitch angle
pitch = 180*acos(Dx*Dx0+Dy*Dy0+Dz*Dz0);
//  Roll angle
D = (Ux*Ux0+Uy*Uy0+Uz*Uz0) / (Dx*Dx0+Dy*Dy0+Dz*Dz0);
if (D>1) D = 1;
roll = 0;
//  Yaw angle
yaw = 0;
//  Power setting (0-1)
if (Dy>0.8)
pwr = 100;
else if (Dy>-0.2)
pwr = 20+100*Dy;
else
pwr = 0;
}
//  Static Roll/Pitch/Yaw
else
{
Ex = -2*dim*Sin(th)*Cos(ph);
Ey = +2*dim        *Sin(ph);
Ez = +2*dim*Cos(th)*Cos(ph);
Ox = Oy = Oz = 0;
X = Z = 0;
Y = 20;
Dx = 1; Dy = 0; Dz = 0;
Ux = 0; Uy = 1; Uz = 0;
}
``````
0

Author Commented:
That should read as I am "now" having a problem.
0

Author Commented:
Nevermind, I figured out all my problems!
0

Author Commented:
Not a complete soultion but the rght suggestion for getting circular motion.  The rest fell in to place after that.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.