Всем привет. 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