Новичок
Профиль
Группа: Участник
Сообщений: 2
Регистрация: 20.5.2011
Репутация: нет Всего: нет
|
Вообщем беда в чём - пытаюсь сделать бегущую строку на OpenGL, что бы она из приложения подхватывала текст. В ЖеЛе новичёк. Перерыл кучу материала. Все пособия, всех этих супер профессоров и прочих докторов наук - мусор. Куча кода и пока ни разу не заработало. Нашёл пример, какого то студента, кода в два раза меньше, половину библиотек, в отличие от профессорских примеров, вообще не подключено, т.е. даже в среду разработки (BDS) не линкованы, и всё работает наипрекраснейше. Текст программы практический без комментариев, поэтому разобраться, как то не получается. Код исходника ниже. Практический первозданный чуток дополненный. И подвязал exe-шник. Отсюдова вопросы: 1. Как можно повернуть камеру или текст чтобы букву «А» таки было видно? А ещё лучше перейти в двухмерное отображение. Пробовал работать с третьей координатой – тяжеловастенько, очень криво.
2. Как можно прицепить шрифты, желательно кириллические? Что бы он натурально стринговую (или чаровскую) переменную преобразовывал в изображение.
3. Можно ли выводить изображение не на всю форму, а на определённую область, или к примеру на компаненту TPanel?А вот если понадобится, система у меня такая: ОС: WindowsXP Home Edition (2002) SP3 Среда: Borland Developer Studio 2006 Библиотеки GL: gl.h glu.h glaux.h Поддерживаемая OpenGL: 1.5 2.0 уже затупает (на 60% тянет) *.cpp | Код | //---------------------------------------------------------------------------
#include <vcl.h> #pragma hdrstop
#include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1;
//--------------------------------------------------------------------------- HGLRC hGLRC; HDC hDC; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { hDC = GetDC(Handle);
int PixelFormat; PIXELFORMATDESCRIPTOR pfd = {sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 24, 0,0,0,0,0,0, 0,0, 0,0,0,0,0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0,0,}; PixelFormat = ChoosePixelFormat (hDC, &pfd); if (SetPixelFormat (hDC, PixelFormat, &pfd) == FALSE) Application->Terminate ();
hGLRC = wglCreateContext(hDC); if(hGLRC == NULL) Application->Terminate (); if(wglMakeCurrent(hDC, hGLRC) == false) Application->Terminate ();
glEnable (GL_DEPTH_TEST);
glViewport (0, 0, Width, Height);
glShadeModel (GL_SMOOTH); glClearColor (0.0, 0.0, 0.0, 1.0);
glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (90, GLdouble(Width/Height), 1.0, 100.0);
glMatrixMode (GL_MODELVIEW); glLoadIdentity (); gluLookAt (0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
Application->OnIdle = AppIdle;
X = 0; Y = -3; Yaw = 0; Pitch = 0; IsWire = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormResize(TObject *Sender) { glViewport (0, 0, Width, Height);
glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (90, GLdouble(Width/Height), 1.0, 100.0);
glMatrixMode (GL_MODELVIEW); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { if (hGLRC) { wglMakeCurrent(NULL, NULL); wglDeleteContext(hGLRC); hGLRC = NULL; } if (hDC) { ReleaseDC(Handle, hDC); hDC = NULL; } } //--------------------------------------------------------------------------- void __fastcall TForm1::AppIdle(TObject *Sender, bool &Done) { Done = true;
// Начало обработки мыши TPoint* temp; temp = new TPoint; ::GetCursorPos (temp); Yaw += (180 * (temp->x - Screen->Width/2) / Screen->Width); Pitch += (180 * (temp->y - Screen->Height/2) / Screen->Height); ::SetCursorPos (Screen->Width/2, Screen->Height/2); // Конец обработки мыши
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity ();
gluLookAt (0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0); glRotatef (Pitch, 1, 0, 0); glRotatef (Yaw, 0, 0, 1); glTranslatef (-X, -Y, 0.0f);
//--------------буква "А"---------------
glColor3f (1, 0, 0);
glBegin(GL_LINE_STRIP); glVertex2i(20,50); glVertex2i(20,70); glVertex2i(40,70); glVertex2i(40,90); glVertex2i(60,90); glVertex2i(60,70); glVertex2i(80,70); glVertex2i(80,50); glEnd();
glBegin(GL_LINE_LOOP); glVertex2i(20,20); glVertex2i(20,40); glVertex2i(40,40); glVertex2i(40,60); glVertex2i(60,60); glVertex2i(60,40); glVertex2i(80,40); glVertex2i(80,20); glEnd();
glFlush (); SwapBuffers(hDC); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { float FSIN = sin (Yaw*M_PI/180.0f); float FCOS = cos (Yaw*M_PI/180.0f);
if (Key == VK_ESCAPE) Application->Terminate (); else if (Key == VK_LEFT) Yaw -= 3; else if (Key == VK_RIGHT) Yaw += 3; else if (Key == VK_UP) {X += 0.05 * FSIN; Y += 0.05 * FCOS;} else if (Key == VK_DOWN) {X -= 0.05 * FSIN; Y -= 0.05 * FCOS;}
else if (Key == 'A') {X -= 0.05 * FCOS; Y += 0.05 * FSIN;} else if (Key == 'D') {X += 0.05 * FCOS; Y -= 0.05 * FSIN;} else if (Key == 'W') {X += 0.05 * FSIN; Y += 0.05 * FCOS;} else if (Key == 'S') {X -= 0.05 * FSIN; Y -= 0.05 * FCOS;}
else if (Key == VK_SPACE) IsWire = !IsWire; } //---------------------------------------------------------------------------
|
*.h | Код | //---------------------------------------------------------------------------
#ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <windows.h> #include <gl.h> #include <glu.h> #include <math.h> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components void __fastcall FormResize(TObject *Sender); void __fastcall FormDestroy(TObject *Sender); void __fastcall AppIdle (TObject *Sender, bool &Done); void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner);
float X, Y, Yaw, Pitch; // координаты и угол bool IsWire; // каркасный ли должен быть куб? }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
|
Это сообщение отредактировал(а) saboth - 20.5.2011, 11:22
Присоединённый файл ( Кол-во скачиваний: 7 )
example.7z 203,68 Kb
|