2
$\begingroup$

I am working on a project for my 3D Graphics class. The project is built with C++ and OpenGL / Glut. Basically, I create a horizontal rectangle window, subdivided into two squares. On the left, I have a two dimensional coordinate plane, which allows the users to point and click and define a profile 'curve'. I then need to wrap this curve around the Y-axis $n$ number of times.

So, would anyone be able to guide me as to how I would use Trigonometry to calculate the $X$ and $Z$ values of the successive points? If for example, a user clicks and creates the point:

$(1, 1, 0)$

And their sweep resolution ($n$) is set to, say, $10$, then I need to redraw that point every $36$ ($360/10$) degrees around the Y-axis.

Am I correct in assuming that Trigonometry will help me here? If so, can someone please enlighten me a bit as to how to calculate the location of a translated point in 3D space? It's been a while since I took Trig, and I don't believe we ever left 2D space.

EDIT: I attempted to use:

$x'=x\cos\theta-z\sin\theta$

$y'=y$

$z'=x\sin\theta+z\cos\theta$

, as per my understanding of AMPerrine's answer, and I don't think it worked as I'd hoped:

// this is in a loop  // setup the new angle double angle = i>0 ? (360/sweepResolutionMod)*i : 0;  angle = angle * (M_PI/180);  // for each point... for( int i=0; i

This produces no screen output, but console output of:

(0.048, -0.296, 0.0) by 0 radians = (0.048, -0.296, 0) (0.376, -0.508, 0.0) by 0 radians = (0.376, -0.508, 0) (0.72, -0.204, 0.0) by 0 radians = (0.72, -0.204, 0) (0.652, 0.176, 0.0) by 0 radians = (0.652, 0.176, 0) (0.368, 0.504, 0.0) by 0 radians = (0.368, 0.504, 0)  (0.048, -0.296, 0.0) by 0.628319 radians = (0.0388328, -0.296, 0.0282137) (0.376, -0.508, 0.0) by 0.628319 radians = (0.30419, -0.508, 0.221007) (0.72, -0.204, 0.0) by 0.628319 radians = (0.582492, -0.204, 0.423205) (0.652, 0.176, 0.0) by 0.628319 radians = (0.527479, 0.176, 0.383236) (0.368, 0.504, 0.0) by 0.628319 radians = (0.297718, 0.504, 0.216305)  (0.048, -0.296, 0.0) by 1.25664 radians = (0.0148328, -0.296, 0.0456507) (0.376, -0.508, 0.0) by 1.25664 radians = (0.11619, -0.508, 0.357597) (0.72, -0.204, 0.0) by 1.25664 radians = (0.222492, -0.204, 0.684761) (0.652, 0.176, 0.0) by 1.25664 radians = (0.201479, 0.176, 0.620089) (0.368, 0.504, 0.0) by 1.25664 radians = (0.113718, 0.504, 0.349989)  ...  (0.048, -0.296, 0.0) by 6.28319 radians = (0.048, -0.296, -1.17566e-17) (0.376, -0.508, 0.0) by 6.28319 radians = (0.376, -0.508, -9.20934e-17) (0.72, -0.204, 0.0) by 6.28319 radians = (0.72, -0.204, -1.76349e-16) (0.652, 0.176, 0.0) by 6.28319 radians = (0.652, 0.176, -1.59694e-16) (0.368, 0.504, 0.0) by 6.28319 radians = (0.368, 0.504, -9.0134e-17) 

I'm not sure what exactly is going on here.

EDIT 2: Updated loop to use radians.

FINAL EDIT (for future generations!):

Here is what I finally got working, after discussing some linear algebra with a teacher at college:

void displayPersp(void) {    glClear(GL_COLOR_BUFFER_BIT);     gluLookAt (-2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0);     glMatrixMode (GL_MODELVIEW);    glLoadIdentity ();       // draw the axis    glBegin(GL_LINES);      // x      glVertex3f(500.0, 0.0, 0.0);      glVertex3f(-500.0, 0.0, 0.0);      // y      glVertex3f(0.0, -500.0, 0.0);      glVertex3f(0.0, 500.0, 0.0);      // z      glVertex3f(0.0, 0.0, -500.0);      glVertex3f(0.0, 0.0, 500.0);     glEnd();      cout << endl;     double previousTheta = 0.0;     for( int i=0; i<=sweepResolutionMod; i++ )    {      double theta = i>0 ? (360/sweepResolutionMod)*i : 0;       theta = theta * (M_PI/180);       if( clickedPoints.size() > 1 )      {        // the 'vertical' piece        glBegin(GL_LINE_STRIP);         for(int i=0; i
  • 0
    Are you referring to the $z$ values in the full rotation? Those are effectively zero as they should be, just off a bit due to lack of precision in the trig functions or in defining pi. You can't display them to that precision anyway, so it doesn't really matter. Round to some arbitrary place if you want to make absolutely sure the first and last points match up, but I don't think it will really present any problems.2011-10-26

1 Answers 1

3

Each point in the curve can be rotated about the $y$-axis by an angle $\theta$ using the following:

x'=x\cos\theta-z\sin\theta

y'=y

z'=x\sin\theta+z\cos\theta

But if $z$ is always zero this of course becomes even simpler.

  • 0
    Hm, I see. Well, I just ended up stripping down the function and rewriting it, perhaps I had a bit of otherwise bad logic. Regardless, thank you so much for your time spent helping me with this. You've guided me perfectly! :)2011-10-27