旋转标示卡后,旋转角可以用反正切atan来求,用法:double atan(double x);输出范围: -pi/2--pi/2。先在simpleTest.c的声明部分添加下面的代码。
#include<math.h>
#define PI 3.14159
double angle=0;
const int n = 100;
const GLfloat R = 40.0f;
static void DrawCircle();
static void getResultRaw(ARMarkerInfo *marker_info );
static void print_string(char *string );
然后将static void mainLoop(void)函数作一些修改。
// if( k == -1 ) {
if( k != -1 ) {
glDisable(GL_DEPTH_TEST);
getResultRaw( &marker_info[k] );//显示旋转角度
//argSwapBuffers(); //屏幕缓冲
//return;
}
再将static void draw(void)函数作以下修改。
glTranslatef( 0.0, 0.0, 40.0 );
//glutSolidTeapot(50.0);
DrawCircle();
最后写自己定义的三个函数。
static void DrawCircle()
{
int i;
glLineWidth(5);
glBegin(GL_LINE_LOOP);
glColor3f(1, 1, 0);
for(i=0; i<n; i++)
glVertex2f(R*cos(2*PI/n*i), R*sin(2*PI/n*i));
glEnd();
glPointSize(5);
glBegin(GL_POINTS);
for(i=0; i<12; i++)
glVertex2f((R-5)*cos(2*PI/12*i),(R-5)*sin(2*PI/12*i));
glEnd();
glColor3f(1,0,0);
glBegin(GL_TRIANGLES);
glVertex3f(0,40,0);
glVertex3f(3,0,0);
glVertex3f(-3,0,0);
glEnd();
return;
}
static void getResultRaw(ARMarkerInfo *marker_info )
{
char string[256];
angle= atan(-marker_info->line[0][0]/marker_info->line[0][1])/PI*180;
glRasterPos3f(-0.7f, 0.4f,0.3f);
sprintf(string,"ANGLE: %3.1f\n",angle);
print_string( string );
return;
}
static void print_string(char *string )
{
int i;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/* display the position data */
glTranslatef(-0.95, -0.20, 0.0);
/* draw red text */
glColor3f(0.75, 0.0, 0.0);
glRasterPos2i(0.0, 0.0);//改变光栅位置
for (i=0; i<(int)strlen(string); i++) {
if(string[i] != '\n' ) {
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, string[i]);//用于在glut窗口某位置显示字符,只能显示英文字符,而且字体、大小都不能任意设置
}
else {
glTranslatef(0.0, -0.07, 0.0);
glRasterPos2i(0.0, 0.0);
}
}
return;
}
显示结果如图1、图2所示。
图1 没有旋转标示卡的状态 图2 将标示卡顺时针旋转大约90度的状态