Solved

Opengl Position Matrix/Circular Motion

Posted on 2010-11-23
8
935 Views
Last Modified: 2012-06-21
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;

   }

Open in new window

0
Comment
Question by:islandguy10
  • 7
8 Comments
 
LVL 25

Accepted Solution

by:
InteractiveMind earned 500 total points
ID: 34204397
To make it rotate in a circle, do this:

X = radius * cos(time);
Y = constant;
Z = radius * sin(time);

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

Author Comment

by:islandguy10
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

by:islandguy10
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;
   }

Open in new window

0
 

Author Comment

by:islandguy10
ID: 34208569
Actually setting roll = 0, solved this.
0
What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

 

Author Comment

by:islandguy10
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;

   }

Open in new window

0
 

Author Comment

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

Author Comment

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

Author Closing Comment

by:islandguy10
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

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

What is RenderMan: RenderMan is a not any particular piece of software. RenderMan is an industry standard, defining set of rules that any rendering software should use, to be RenderMan-compliant. Pixar's RenderMan is a flagship implementation of …
Lithium-ion batteries area cornerstone of today's portable electronic devices, and even though they are relied upon heavily, their chemistry and origin are not of common knowledge. This article is about a device on which every smartphone, laptop, an…
The goal of this video is to provide viewers with basic examples to understand and use pointers in the C programming language.
The goal of this video is to provide viewers with basic examples to understand opening and writing to files in the C programming language.

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now