Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
Solved

# Opengl Position Matrix/Circular Motion

Posted on 2010-11-23
Medium Priority
951 Views
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;
}
``````
0
Question by:islandguy10
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 7

LVL 25

Accepted Solution

InteractiveMind earned 2000 total points
ID: 34204397
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 Comment

ID: 34208456
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 Comment

ID: 34208537
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 Comment

ID: 34208569
Actually setting roll = 0, solved this.
0

Author Comment

ID: 34210094
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 Comment

ID: 34210095
That should read as I am "now" having a problem.
0

Author Comment

ID: 34210140
Nevermind, I figured out all my problems!
0

Author Closing Comment

ID: 34650581
Not a complete soultion but the rght suggestion for getting circular motion.  The rest fell in to place after that.
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address.Â This address might be address of another variable/address of devices/address of fuâ€¦
This article provides a brief introduction to tissue engineering, the process by which organs can be grown artificially. It covers the problems with organ transplants, the tissue engineering process, and the current successes and problems of the tecâ€¦
The goal of this video is to provide viewers with basic examples to understand how to create, access, and change arrays in the C programming language.
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaacâ€¦
###### Suggested Courses
Course of the Month8 days, 22 hours left to enroll