4

I'm trying to rotate a rectangle so that it faces another rectangle in a spiral.

Im using the Bullet pyhics library and freeglut for the 3d application, for anyone interested https://github.com/damorton/bullet-dominos

enter image description here

float x = 0;
float z = 0;
float angle = 0.0f;
int a = 2, b = 2;
float previousX = 0.0f;
float previousZ = 0.0f;

for (int i = 4; i < maxPoints; i++)
{
    angle = 0.1 * i;
    x = (a + b * angle) * cos(angle);
    z = (a + b * angle) * sin(angle);

    GameObject* temp = CreateGameObject(x, 0, z);

    float newAngle = atan2(previousZ - z, previousX - x) * 180 / PI;
    temp->setRotationYaw(newAngle);

    previousX = x;
    previousZ = z;
}

You can see from the top view that the rectangles are not pointing towards the previous rectangles position.

enter image description here

EDIT: After trying the below code

float x = 0;
float z = 0;
float angle = 0.0f;
int a = 2, b = 2;
float previousX = 0.0f;
float previousZ = 0.0f;

for (int i = 0; i < maxPoints; i++)
{
    angle = 0.1 * i;
    x = (a + b * angle) * cos(angle);
    z = (a + b * angle) * sin(angle);

    GameObject* temp = CreateGameObject(x, 0, z);

    float dirX = -(a + b * angle) * sin(angle) + b * cos(angle);
    float dirZ = (a + b * angle) * cos(angle) + b * sin(angle);
    float newAngle = atan2(dirZ, dirX) * 180 / PI;
    temp->setRotationYaw(newAngle);

    previousX = x;
    previousZ = z;
}

The result is:

enter image description here

Console output:

enter image description here

EDIT: Solution. Some things to note are that the result of atan2() was not converted to degrees using atan2() * 180 / PI. Also that I passed in atan2(X, Z) compared to atan2(Z, X) that is sometimes done for hysterical raisins http://www2.tcl.tk/10814.

// create spiral dominos
float x = 0;
float z = 0;
float angle = 0.0f;
int a = 2, b = 2;
float previousX = 0.0f;
float previousZ = 0.0f;

float dominoHeight = 2.0f;

for (int i = 2; i < maxPoints; i++)
{
    if (i % 30 == 0) dominoHeight++;

    angle = 0.15 * i;
    x = (a + b * angle) * cos(angle);
    z = (a + b * angle) * sin(angle);

    GameObject* temp = CreateGameObject(x, 0, z);

    float dirX = -(a + b * angle) * sin(angle) + (b * cos(angle));
    float dirZ = (a + b * angle) * cos(angle) + (b * sin(angle));
    float newAngle = atan2(dirX, dirZ);
    printf("dirX: %f - dirZ: %f - angle: %f\n", dirX, dirZ, newAngle);
    temp->setRotationYaw(newAngle);

    previousX = x;
    previousZ = z;
}

enter image description here

Nero
  • 1,320
  • 3
  • 15
  • 31
David
  • 303
  • 2
  • 9

1 Answers1

5

The parametric equation for a spiral is:

$$ \begin{eqnarray} \begin{aligned} x &= &(a + b \theta) \times \cos(\theta)\\ z &= &(a + b \theta) \times \sin(\theta) \end{aligned} \end{eqnarray} $$

The direction on the spiral point is simply the derivative of the system with respect to $\theta$. Thus the direction is:

$$ \begin{eqnarray} \begin{aligned} x_{dir} &=&-(a + b \theta) \times \sin(\theta) + b \times \cos(\theta)\\ z_{dir} &=&(a + b \theta) \times \cos(\theta) + b \times \sin(\theta) \end{aligned} \end{eqnarray} $$

Finally angle is is simply atan2 of the direction equation.

Spiral

Image 1: This is what I get when i plot squares at $(x, z)$ with direction $(x_{dir}, z_{dir})$

Mathematica source for image

joojaa
  • 8,437
  • 1
  • 24
  • 47
  • I tried float dirX = -(a + b * angle) * sin(angle) + b * cos(angle); and float dirZ = (a + b * angle) * cos(angle) + b * sin(angle); then float newAngle = atan2(dirZ, dirX); but this does not set the angle correctly. – David Dec 27 '15 at 14:38
  • I'm multiplying the result by 180 * Pi to convert to radians – David Dec 27 '15 at 14:52
  • Programming language is c++ – David Dec 27 '15 at 14:57
  • Atan2 c++ http://www.cplusplus.com/reference/cmath/atan2/ – David Dec 27 '15 at 15:02
  • ill update the question with what I have so far can you have a look? – David Dec 27 '15 at 15:13
  • Ive just noticed that your circle is spiraling in the opposite direction to mine – David Dec 27 '15 at 16:33
  • @damorton It depends on how your csys is defined and from which side of the spiral you look from. These are arbitrary definitions. I just have a right handed coordinate system in a 2d space. – joojaa Dec 27 '15 at 17:51
  • Turned out that the above was perfect, the problem was with the dimensions of each domino. Swapping the width and height values fix it :/ thanks @joojaa – David Dec 28 '15 at 17:52