Суть вот в чем:
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;
Но вот как их
правильно сделать - у меня не выходит.
Возможно особо тут не понятно - прикрепляю проект: