glutBitmapCharacter неправильно позиционирует текст - PullRequest
3 голосов
/ 24 февраля 2012

Я пытаюсь нарисовать простую строку (наложение) на экране.

Из того, что я нашел в Интернете, я использую это следующим образом:

void write(string text, int x, int y){
    glRasterPos2i(x,y);

    for(int i = 0; i < text.length(); i++){ 
        glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, text.data()[i]);
    }
}

Но он рисует строку в соответствии с мировыми координатами.Скажем, если x и y установлены в 10, они нарисованы в (10,10,0) координатах в мире.Но мне просто нужна эта строка в координатах окна (10,10) в 2D.

Это часть небольшого проекта, и метод рисования описан ниже.Я не хочу сильно его менять, поскольку это может нарушить что-то еще в проекте.

void disp(){
 // set viewing translation and object rotations
 glMatrixMode( GL_MODELVIEW );
 glLoadIdentity ();
 glTranslatef( INIT_VIEW_X, INIT_VIEW_Y, INIT_VIEW_Z );
 glRotatef( xRot, 1.0, 0.0, 0.0 );
 glRotatef( zRot, 0.0, 0.0, 1.0 );
 glScalef( scaleFactor, scaleFactor, scaleFactor );
 glClear(GL_COLOR_BUFFER_BIT);
 draw();
 glFlush();
}

Я также точно не знаю, что они делают, и я думаю, что рисование текста в мировых координатах должноделать с чем-то в этом коде.Я также попробовал Используя растровые шрифты GLUT , но это тоже не работает.

Как я могу просто рисовать на экране.OpenGL слишком сложен;Я пытаюсь просто написать в окно, но это берет целое и переводит в трехмерный мир.Я просто не хочу этого.

Ответы [ 3 ]

7 голосов
/ 15 июня 2013

От twall, да, вам нужно очистить ОБА модели и матрицы проекции

//TEXT
glMatrixMode( GL_PROJECTION ) ;
glPushMatrix() ; // save
glLoadIdentity();// and clear
glMatrixMode( GL_MODELVIEW ) ;
glPushMatrix() ;
glLoadIdentity() ;

glDisable( GL_DEPTH_TEST ) ; // also disable the depth test so renders on top

glRasterPos2f( 0,0 ) ; // center of screen. (-1,0) is center left.
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
char buf[300];
sprintf( buf, "Oh hello" ) ;
const char * p = buf ;
do glutBitmapCharacter( GLUT_BITMAP_HELVETICA_18, *p ); while( *(++p) ) ;

glEnable( GL_DEPTH_TEST ) ; // Turn depth testing back on

glMatrixMode( GL_PROJECTION ) ;
glPopMatrix() ; // revert back to the matrix I had before.
glMatrixMode( GL_MODELVIEW ) ;
glPopMatrix() ;
0 голосов
/ 24 февраля 2012

Из того, что я могу собрать, кажется, что вы ищете ортографическая проекция.

Я не совсем уверен насчет OpenGL (я привык к графическим библиотекам более высокого уровня), но вот пара ссылок, которые могут стать отправной точкой:

Установка матрицы ортогональной проекции?

http://www.cprogramming.com/tutorial/opengl_projections.html

0 голосов
/ 24 февраля 2012

Вы можете вернуться к "2D" координатам так:

//save your current matrix on the stack, so you don't lose it
glPushMatrix();
//load identity matrix, so you don't have any 3d transformations
glLoadIdentity ();
//now you also can transform the text
//to the position just as you like
//glTransformf( ... )
//make sure the text is draw, even though it might be outside the viewing area
glDisable( GL_DEPTH_TEST )
drawMyFunkyText();
glEnable( GL_DEPTH_TEST )
//restore the matrix as it was before,
//so you can draw all your shapes as before
glPopMatrix();
...