Russian Qt Forum
Ноябрь 25, 2024, 01:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt renderText 3D  (Прочитано 8413 раз)
romank
Гость
« : Июль 29, 2009, 14:46 »

Просмотрел форум и всё таки не понятно как использовать
renderText ( double x, double y, double z, const QString & str ... )
в следующем фрагменте:

Код
C++ (Qt)
void GLView::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (!isLoaded) return;
//
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
 
           renderText(0, 0, 0, "SSA");
 
 

В examples не нашел примера использования.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Июль 29, 2009, 16:30 »

выводит текст в координатах x y z на сцене. Ф-ия с х и у - на экране.
Записан
romank
Гость
« Ответ #2 : Июль 29, 2009, 20:20 »

И в чём состоял ответ?
Вывод opengl проводится в paintGL.
Обычно это очистка буферов (glClear) и рисование (пара glBegin, glEnd).

Вопрос:
Где в приведеной цепочке место renderText?
Может вообще renderText не место в paintGL?
Кто богат примером использования renderText в мешанине с openGL.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Июль 30, 2009, 10:21 »

я богат, но оно дома есть. текст если правильно помню выводил прямо в пейнт гл, среди отрисовки сцены. бтв в приведенном тобой коде он у тебя не видится из-за вьюпорта я так полагаю? ближняя граница отрезает его (или это не весь код?)
Записан
romank
Гость
« Ответ #4 : Июль 30, 2009, 13:36 »

Следующий пример:
Код
C++ (Qt)
       glColor3f(0, 0, 0);
       glBegin(GL_LINES);
       glVertex3f(-1, 0, -1);
       glVertex3f(+1, 0, -1);
       glEnd();
 
       qglColor(Qt::black);
       renderText(-1, 0, -1, "Hello drawing text");
 

Линия есть, текста нет. С видовыми и прочими матрицами порядок.

Дальше перенес рендер_текст в блок glBegin()...glEnd()
Код
C++ (Qt)
       glColor3f(0, 0, 0);
       glBegin(GL_LINES);
       glVertex3f(-1, 0, -1);
       glVertex3f(+1, 0, -1);
       qglColor(Qt::black);
       renderText(-1, 0, -1, "Hello drawing text");
       glEnd();
 

Здесь ситуация лучше. Программа крашится. В консоль пишут:

Unrecognised OpenGL version
QColor::setRgbF: RGB parameters out of range

Странно, что версия GL не распознана.

Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Июль 30, 2009, 15:12 »

буду дома, откопаю рабочий пример... вспомнил, что он 100% есть - я циферки хит-поинтов создавал над замками...
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Июль 30, 2009, 19:04 »

мда, видимых отличий нет
Код:
void CastleFight::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
draw();
glFlush();
}

void CastleFight::draw()
{
moveCamera();

drawScene();
drawReflection();
drawText();
drawShadow();
}

void CastleFight::drawText()
{
renderText(4.0, 1.5, 0.0, QString().sprintf("Castle right\nHit-Points: %d", hitPoints[0]));
renderText(-4.0, 1.5, 0.0, QString().sprintf("Castle left\nHit-Points: %d", hitPoints[1]));
renderText(1100, 20, QString().sprintf("%s Castle:", currentPlayer==0?"Right":"Left"));
renderText(1100, 50, QString().sprintf("y angle = %f", -cannons[currentPlayer].getXAngle()));
renderText(1100, 80, QString().sprintf("x angle = %f", 90 + cannons[currentPlayer].getYAngle()));
renderText(1100, 110, QString().sprintf("speed = %f", 100*cannons[currentPlayer].ball.speed));
}
кинь код настройки вьюпорта или если можешь - тестовый проектик. а то я свой сейчас не соберу - надо доп библиотеку искать сорцы и собирать. Да, я тестил проект под qr 4.3.3, так что возможно с рендер текстом ныне баги появились...
мой вьюпорт:
Код:
void CastleFight::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
if(h > 0)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, w/(GLfloat)h, 0.1, 1000);
}
}
Записан
romank
Гость
« Ответ #7 : Июль 30, 2009, 21:12 »

Причина в использовании VBO:

Код
C++ (Qt)
       glGenBuffers(1, &idVertex);
       glBindBuffer(GL_ARRAY_BUFFER, idVertex);
 
       glGenBuffers(1, &idIndice);
       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, idIndice);
 

вызывает зависание при renderText.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.13 секунд. Запросов: 22.