islandguy10
asked on
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.
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;
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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;
}
ASKER
Actually setting roll = 0, solved this.
ASKER
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;
}
ASKER
That should read as I am "now" having a problem.
ASKER
Nevermind, I figured out all my problems!
ASKER
Not a complete soultion but the rght suggestion for getting circular motion. The rest fell in to place after that.
ASKER
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.