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
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.
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:
Console output:
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;
}