Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2010, 01:25   #1
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию OpenGL.Нормально отображение сцены (масштаб)?

Суть вот в чем:
1) для начала - то что делаю, будет компонент - 3DLable.
2) текст как то рисую, правда все это рисуется криво.
3) и вот не могу сделать нормальный масштаб. Т.е. сцену вывожу на Tpanel - хочу сделать, что бы текст который рисуется, при изменении размеров Tpanel не уходил во внутрь экрана (следовательно что бы он маленьким не становился) и что бы сохранялась некая пропорциональность между размерами Tpanel и шрифтом.
Вобщем вот что у меня вышло:
Код:
const
  CGL_FONT_HEIGHT = -28;           // Высота создаваемого шрифта
  CGL_START_LIST = 1000;

var
  Form1             : TForm1;
  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;                             // Смещение вверх
Код:
{ Создание шрифта }
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));
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);                             
  glScale(0.08 * fScale, 0.08 * fScale, 0.08 * fScale);
  GLSPrintText('Hello World');
  glTranslatef(-Length('Hello World')/2, 1.0, 0.0);
  SwapBuffers(fHDC);
end;
Вся проблема как я понял заключается в функциях GLSPrintText;, GLSReSize; , GLSDraw;
Но вот как их правильно сделать - у меня не выходит.
Возможно особо тут не понятно - прикрепляю проект:
Вложения
Тип файла: rar Project.rar (13.6 Кб, 43 просмотров)
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов рисующих методов сцены из подпрограммы. jojahti Общие вопросы C/C++ 6 20.08.2009 11:50
масштаб текста в просмоторщиках lisa3281 HTML и CSS 7 10.04.2009 03:12
отображение тумана в OpenGL Arkuz Общие вопросы Delphi 0 30.09.2008 22:24
Логарифмический масштаб AfzaL Паскаль, Turbo Pascal, PascalABC.NET 2 03.12.2006 12:16