Code:

#include "math.h"
#include "stdio.h"
#include "stdlib.h"
float Rad2Deg = 180 / M_PI;
float Deg2Rad = M_PI / 180;
int main(int argc, char* argv[])
{
float pitch;
float yaw;
if (argc != 3){
fprintf(stderr, "USAGE:\n%s pitch yaw\n", argv[0]);
return(-1);
}
pitch = atof(argv[1]);
yaw = atof(argv[2]);
pitch *= Deg2Rad;
yaw *= Deg2Rad;
float x, y, z;
x = (float)(cos(pitch) * cos(yaw));
y = (float) sin(pitch);
z = (float)(cos(pitch) * sin(yaw));
float len = (float)sqrt(x * x + z * z);
float verify_pitch = (float)atan2(y, len);
float verify_yaw = (float)atan2(z, x);
printf(" verify_pitch = %0.5f , pitch = %0.5f\n", verify_pitch, pitch);
printf(" verify_yaw = %0.5f , yaw = %0.5f\n", verify_yaw, yaw);
return 0;
}

For posterity. In the function above, Y is up, X is yaw 0, Z is yaw 90.

In Brian's original code he did:

Code:

float len = (float)sqrt(x * x + y * y + z * z);

He said himself the vector is normalized, so that formula always returns 1. We need to exclude the value that is not multiplied by the cosine.

atan2() selects the correct sector, but in most implantations it returns +/- 180 degrees, not 0-360 degrees.

P.s.

Sorry for the necropost, but I'm just reviewing my trig and vector math over the Christmas break.