Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenGL. Нормально рисование текста (масштаб)? 
:(
    Опции темы
spamER
Дата 3.3.2010, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 14.11.2008

Репутация: нет
Всего: 1



Всем привет. OpenGL изучаю не так давно, но уже приходится делать проект по нему.
Дело вот в чем:
Я создаю компонент для Delphi - 3DLable.
Как нарисовать текст я вроде понял, вобщем как то рисую...хотя не уверен, что правильно.
И вот самое главное - не могу сделать нормальный масштаб отображения. Т.е. сцену я вывожу на Tpanel. Хочу сделать так, что бы  при задании размеров Tpanel пользователем, текст который рисуется на этой панели выводился в каком то нормальном масштабе, т.е. что бы сохранялась некая пропорциональность между размерами Tpanel и шрифтом - панельке уменьшили размеры следовательно и текст тогда должен стать меньше, но что бы рисовался на всю эту панель, ну и наооброт.
Вот как то так объяснил чего мене надо добиться, если особо не понятно - сори, еще в OpenGL не профи.
А вот то, что у меня уже есть, тобишь мои наработки: 
Код

const
  CGL_FONT_HEIGHT = -28;           // Высота создаваемого шрифта
  CGL_START_LIST = 1000;

var
  fHDC              : HDC;                                 // Контекст устройства
  fHGLRC            : HGLRC;                               // Контекст рендеринга(рисования)
  fLogFont          : TLogFont;
  fFontName         : TFontName;                           // Имя шрифта
  fFontCharset      : TFontCharset;                        // Тип(кодировка) символов
  fQualityText      : TQualityText;                        // Качество текста
  fFontSize         : Integer;                             // Размер шрифта
  fLiteraDepth      : GLfloat;                             // Толщина шрифта
  FVisionAngle      : Word;                                // Угол обзора
  fAngleX           : GLfloat;                             // Поворот по оси X
  fAngleY           : GLfloat;                             // Поворот по оси Y
  fScale            : GLfloat;                             // Масштаб
  fLeftOffset       : GLfloat;                             // Смещение влево
  fTopOffset        : GLfloat;                             // Смещение вверх


  fFontName         := 'Arial';                           // Имя шрифта
  fFontCharset      := DEFAULT_CHARSET;                        // Тип(кодировка) символов
  fFontSize         := 40;                             // Размер шрифта
  fLiteraDepth      := 1.5;                             // Толщина шрифта
  FVisionAngle      := 30;                                // Угол обзора
  fAngleX           := 0;                             // Поворот по оси X
  fAngleY           := 0;                             // Поворот по оси Y
  fScale            := 1;                             // Масштаб
  fLeftOffset       := 0;                             // Смещение влево
  fTopOffset        := 0;                             // Смещение вверх


Код

{ Создание шрифта }
procedure GLSBuildFont;
var
  hFontNew, hOldFont : HFONT;
  Quality : GLfloat;
begin
 Quality := 0;
 case fQualityText of
   qtFastest : Quality := 1000 ;
   qtBest    : Quality := 0 ;
 end;

  FillChar(fLogFont, SizeOf(fLogFont), 0);
  fLogFont.lfHeight               :=   CGL_FONT_HEIGHT;
  fLogFont.lfWeight               :=   FW_NORMAL;
  fLogFont.lfCharSet              :=   fFontCharset;
  fLogFont.lfOutPrecision         :=   OUT_DEFAULT_PRECIS;
  fLogFont.lfClipPrecision        :=   CLIP_DEFAULT_PRECIS;
  fLogFont.lfQuality              :=   DEFAULT_QUALITY;
  fLogFont.lfPitchAndFamily       :=   FIXED_PITCH;
  fLogFont.lfPitchAndFamily       :=   FF_DONTCARE OR DEFAULT_PITCH;
  fLogFont.lfItalic               :=   0;
  fLogFont.lfWeight               :=   0;
  lstrcpy(fLogFont.lfFaceName, PChar(fFontName));

  hFontNew := CreateFontIndirect(fLogFont);
  hOldFont := SelectObject(fHDC,hFontNew);

  wglUseFontOutlines(fHDC, 0, 255, CGL_START_LIST, Quality, 1, WGL_FONT_POLYGONS, nil);

  DeleteObject(SelectObject(fHDC,hOldFont));
  DeleteObject(SelectObject(fHDC,hFontNew));

  //glEnable(GL_DEPTH_TEST);    // Глубина цвета для объемности
  //glEnable(GL_LIGHTING);      // Включена поддержка источника света
  //glEnable(GL_LIGHT0);        // Включена лампочка 0
end;


Код

{ Вывод текста в OpenGL }
procedure GLSPrintText(Text : String);
begin
  if Text = '' then Exit;
  glScale(fFontSize * 0.125, fFontSize * 0.125, fLiteraDepth);
  glTranslatef(0,0,1/2);
  glListBase(CGL_START_LIST);
  glCallLists(Length(Text), GL_UNSIGNED_BYTE, PChar(Text));
end;


Код

{ Изменение размеров и инициализация окна }
procedure GLSReSize;
begin
  glMatrixMode(GL_PROJECTION);                            // Сделать текущей матрицу проекции
  glLoadIdentity;                                         // Заменяет текущую матрицу на единичную
  gluPerspective(fVisionAngle,                            // Угол видимости в направлении оси Y
                 Form1.Panel1.Width/Form1.Panel1.Height,  // Угол видимости в направлении оси X
                 1,                                       // Расстояние от наблюдателя до ближней плоскости отсечения
                 15.0);                                   // Расстояние от наблюдателя до дальней плоскости отсечения
  glViewport(0, 0, Form1.Panel1.Width, Form1.Panel1.Height);
  glMatrixMode(GL_MODELVIEW);                             // Сделать текущей видовую матрицу
end;


Код

{ Рисование сцены OGL }
procedure GLSDraw;
var
  RGBColor : array[0..2] of GLfloat;
  TextLength : GLfloat;
  i : Integer;
begin
  TColorToOGLColor(Form1.Color, RGBColor[0], RGBColor[1], RGBColor[2]);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);                     // Очистка экрана и буфера глубины
  glLoadIdentity;                                                          // Сбрасываем текущую матрицу
  glClearColor(RGBColor[0], RGBColor[1], RGBColor[2], 1.0);                // Очистка экрана в черный цвет
  glTranslatef(0.0, 0.0, -3.0);                                            // Сдвиг внутрь экрана
  //glPushMatrix;
  //glRotatef(fAngleX, 1.0, 0.0, 0.0);
  //glRotatef(fAngleY, 0.0, 1.0, 0.0);
  glScale(0.08 * fScale, 0.08 * fScale, 0.08 * fScale);
  //glTranslatef(-fLeftOffset, 0.0, 0.0);                                    // Cмещение влево (по X)
  //glTranslatef( 0.0, fTopOffset, 0.0);                                      // Cмещение вверх (по Y)
  //glPopMatrix;
  //glPushMatrix;
  GLSPrintText('Hello World');
  glTranslatef(-Length('Hello World')/2, 1.0, 0.0);

  //glPopMatrix;
  SwapBuffers(fHDC);
end;

Вот это основной код создания, рисования моего текста. Знаю, что тут "тихий ужас", но как смог.
Народ, пожалуйста, помогите/подскажите с реализацией той проблемы (масштаб), что я описал выше ,и по возможности подправьте мой код.
Также вот прикрепляю проект : 

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  project.rar 15,08 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0903 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.