Текущий архив: 2003.10.06;
Скачать: CL | DM;
Вниз
Вопрос по OpenGL книга Краснов? Найти похожие ветки
← →
Barlok (2003-09-25 14:42) [0]Уважаемые мастера делфи помогите мне пожалуста. Недавно решиил модернизировать один пример из книги Краснова по OpenGL, а именно наезд камеры верх, вниз, вправо, влево, вперед, назад, по отношению к кубику стоящему в центре. все это у меня получилось, да и информации на эту тему в примерах было предостаточно, но сталкнулся с одной проблемой, дело в том что
в книги нету ниодного мало мальски примера где реализован поворот мышью (в играх это поворот головы как бы) или иначе говоря, поворт камеры влево, вправо, вверх, вниз. Если
кто работал с OpenGL подскажите пожалуста.
P.S Только ненадо ссылок на DelphiGFX, я знаю там реализован метод поворота камеры, в примере <<Basic 3D Engine>>, но реализован без формы, а мне надо конкретно с формой иначе
я бы не стал задавать вопрос на форум.
← →
Barlok (2003-09-25 15:04) [1]Что за свинство тут на форуме програмисты или первокурсники институтов.
← →
pasha_676 (2003-09-25 15:45) [2]
> Что за свинство тут на форуме програмисты или первокурсники
> институтов.
И не говори... какие то уроды-первокурсники задают вопросы "как изменить вектор направления камеры". OPenGL не занимался, но неужели так трудно догадаться изменять вектор дирекшинал камеры для поворота? А уж реализовать его мышью наверное и впрямь супер задача. OnMouseMove - о таком слышал?
Еще раз повторю Опен не знаю, но такой вектор быть обязан. Если ты двигал камеру, то у тебя ума должно хватить и повернуть ее. Или мы будем все всегда делать путем "свиснул код и не подумал".
← →
Вован (2003-09-25 15:47) [3]Что тут сложного? Делаеш евент на MouseMove и при каждом событии разница между текущим положением мыши и центром формы и есть твои изменения угла по x:y. И в конце каждого евента не забывай мышу обратно в центр формы ставить.
← →
Barlok (2003-09-25 22:16) [4]первый кусок
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OpenGL; // подключенные модули
type
TfrmGL = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormResize(Sender: TObject);
private
DC : HDC; // ссылка на контекст устройства
hrc: HGLRC; // ссылка на контекст воспроизведения
tx : GLfloat; // tx вещественного типа
ty : GLfloat; // ty вещественного типа
tz : GLfloat; // tz вещественного типа
procedure Detal;
end;
var
frmGL: TfrmGL;
mode : (POINT, LINE, FILL) = LINE; // переменная mode позволяет устанавливать
// три режима рисования многоугольников. Точка, линия, полигон. При первом
// запуске программы mode будет воспроизводить в режиме линия
implementation
{$R *.DFM}
procedure TfrmGL.Detal;
begin
glColor3f (0.0, 0.0, 1.0); // задает цвет точки и других примитивов
glBegin (GL_POLYGON); // рисует многоугольники
glNormal3f (0, 1, 0); // задается вектор нормали
glVertex3f (6.875, 0, 0); // задаются координаты точки
glVertex3f (10, 0, 0);
glVertex3f (10, 7.0606, 0);
glVertex3f (8.2966, 8.764, 0);
glVertex3f (6.8678, 8.764, 0);
glVertex3f (6.8678, 4.5118, 0);
glEnd;
glBegin (GL_POLYGON);
glVertex3f (3.1322, 4.5118, 0);
glVertex3f (3.1424, 0, 0);
glVertex3f (6.875, 0, 0);
glVertex3f (6.8678, 4.5118, 0);
glEnd;
glBegin (GL_POLYGON);
glVertex3f (3.1322, 4.5118, 0);
glVertex3f (3.1322, 8.764, 0);
glVertex3f (1.7034, 8.764, 0);
glVertex3f (0, 7.0606, 0);
glVertex3f (0, 0, 0);
glVertex3f (3.1424, 0, 0);
glEnd;
glColor3f (1.0, 0.0, 0.0);
glBegin (GL_POLYGON);
glNormal3f (1.0, 0.0, 0.0);
glVertex3f (10, 7.0606, 0);
glVertex3f (10, 0, 0);
glVertex3f (10, 0, -5);
glVertex3f (10, 7.0606, -5);
glEnd;
glBegin (GL_POLYGON);
glNormal3f (1.0, 1.0, 0.0);
glVertex3f (8.2966, 8.764, 0);
glVertex3f (10, 7.0606, 0);
glVertex3f (10, 7.0606, -5);
glVertex3f (8.2966, 8.764, -5);
glEnd;
glBegin (GL_POLYGON);
glNormal3f (0.0, 1.0, 0.0);
glVertex3f (6.8678, 8.764, 0);
glVertex3f (8.2966, 8.764, 0);
glVertex3f (8.2966, 8.764, -5);
glVertex3f (6.8678, 8.764, -5);
glEnd;
glBegin (GL_POLYGON);
glNormal3f (-1.0, 0.0, 0.0);
glVertex3f (6.8678, 4.5118, 0);
glVertex3f (6.8678, 8.764, 0);
glVertex3f (6.8678, 8.764, -5);
glVertex3f (6.8678, 4.5118, -5);
glEnd;
glBegin (GL_POLYGON);
glNormal3f (0.0, 1.0, 0.0);
glVertex3f (6.8678, 4.5118, -5);
glVertex3f (3.1322, 4.5118, -5);
glVertex3f (3.1322, 4.5118, 0);
glVertex3f (6.8678, 4.5118, 0);
glEnd;
glBegin (GL_POLYGON);
glNormal3f (1.0, 0.0, 0.0);
glVertex3f (3.1322, 8.764, 0);
glVertex3f (3.1322, 4.5118, 0);
glVertex3f (3.1322, 4.5118, -5);
glVertex3f (3.1322, 8.764, -5);
glEnd;
glBegin (GL_POLYGON);
glNormal3f (0.0, 1.0, 0.0);
glVertex3f (1.7034, 8.764, 0);
glVertex3f (3.1322, 8.764, 0);
glVertex3f (3.1322, 8.764, -5);
glVertex3f (1.7034, 8.764, -5);
glEnd;
glBegin (GL_POLYGON);
glNormal3f (-1.0, 1.0, 0);
glVertex3f (0, 7.0606, 0);
glVertex3f (1.7034, 8.764, 0);
glVertex3f (1.7034, 8.764, -5);
glVertex3f (0, 7.0606, -5);
glEnd;
glBegin (GL_POLYGON);
glNormal3f (-1.0, 0.0, 0.0);
glVertex3f (0, 7.0606, -5);
glVertex3f (0, 0, -5);
glVertex3f (0, 0, 0);
glVertex3f (0, 7.0606, 0);
glEnd;
glBegin (GL_POLYGON);
glNormal3f (0.0, -1.0, 0.0);
glVertex3f (10, 0, 0);
glVertex3f (6.875, 0, 0);
glVertex3f (3.1424, 0, 0);
glVertex3f (0, 0, 0);
glVertex3f (0, 0, -5);
glVertex3f (3.1424, 0, -5);
glVertex3f (6.875, 0, -5);
glVertex3f (10, 0, -5);
glEnd;
glColor3f (0.0, 0.0, 1.0);
glBegin (GL_POLYGON);
glNormal3f (0.0, 0.0, -1.0);
glVertex3f (6.8678, 4.5118, -5);
glVertex3f (6.8678, 8.764, -5);
glVertex3f (8.2966, 8.764, -5);
glVertex3f (10, 7.0606, -5);
glVertex3f (10, 0, -5);
glVertex3f (6.875, 0, -5);
glEnd;
glBegin (GL_POLYGON);
glVertex3f (6.8678, 4.5118, -5);
glVertex3f (6.875, 0, -5);
glVertex3f (3.1424, 0, -5);
glVertex3f (3.1322, 4.5118, -5);
glEnd;
glBegin (GL_POLYGON);
glVertex3f (0, 7.0606, -5);
glVertex3f (1.7034, 8.764, -5);
glVertex3f (3.1322, 8.764, -5);
glVertex3f (3.1322, 4.5118, -5);
glVertex3f (3.1424, 0, -5);
glVertex3f (0, 0, -5);
glEnd;
end;
← →
Barlok (2003-09-25 22:17) [5]второй кусок
{=======================================================================
Перерисовка окна}
procedure TfrmGL.FormPaint(Sender: TObject);
begin
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очистка буфера цвета
glPushMatrix; // позволяет запомнить текущую матрицу
glScalef (0.3, 0.3, 0.3); // задает масштабирование
glTranslatef (tx, 0.0, 0.0); // перенос для оси x
glTranslatef (0.0, 0.0, ty); // перенос для оси y
glTranslatef (0.0, tz, 0.0); // перенос для оси Z
case mode of // выбор режима рисования многоугольника
POINT : glPolygonMode (GL_FRONT_AND_BACK, GL_POINT); // задает режим
// воспроизведения задней и передней стороны точки
LINE : glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
// тоже самое только для линии
FILL : glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
// тоже самое только для многоугольника
end;
Detal;
glPopMatrix; // позволяет восстановить текущую матрицу
SwapBuffers(DC); // содержимое буфера на экран
end;
{=======================================================================
Формат пикселя}
procedure SetDCPixelFormat (hdc : HDC); // задаем формат пиксела
var
pfd : TPixelFormatDescriptor; // переменная детальное описание графической системы
nPixelFormat : Integer; // nPixelFormat целого типа
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
// сдесь поставлены битовые флаги, которые сообщают системе что я собераюсь
// осуществлять вывод в окно и что моя система поддерживает OpenGL
nPixelFormat := ChoosePixelFormat (hdc, @pfd); // выбраный формат пиксела
SetPixelFormat (hdc, nPixelFormat, @pfd); // формат пиксела в контекстном устройстве
end;
{=======================================================================
Создание формы}
procedure TfrmGL.FormCreate(Sender: TObject);
begin
DC := GetDC (Handle); // задаем значение ссылки
SetDCPixelFormat(DC); // задаем формат пиксела
hrc := wglCreateContext(DC); // создаем контекст воспроизведения
wglMakeCurrent(DC, hrc); // установить контекст
glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
glLineWidth (1.5); // толщина линии многоугольника
glEnable (GL_LIGHTING); // включает использование источника света
glEnable (GL_LIGHT0); // включает источник света под номером "0"
glEnable (GL_DEPTH_TEST); // включает режим тестирования глубины
glEnable (GL_COLOR_MATERIAL); // включает режим учета текущего цвета
// примитивов. Разрешает использовать цвета при включенном источнике света.
tx := 0.0; // начальное положения камеры по координате оси x
ty := 0.0; // начальное положения камеры по координате оси y
tz := 0.0; // начальное положения камеры по координате оси z
end;
{=======================================================================
Конец работы приложения}
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0, 0); // освободить контекст
wglDeleteContext(hrc); // освободить контекст воспроизведения
ReleaseDC (Handle, DC); // освобождение ссылки
DeleteDC (DC); // удаление ссылки, освобождение памяти
end;
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If Key = VK_ESCAPE then Close; // конопка ESCAPE закрывает приложение
If Key = VK_LEFT then begin // движение камеры в лево
ty := ty - 0.2;
InvalidateRect(Handle, nil, False); // локальное освобождение памяти
end;
If Key = VK_RIGHT then begin // движение камеры в право
ty := ty + 0.2;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_UP then begin // движение камеры вперед
tx := tx + 0.2;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_DOWN then begin // движение камеры назад
tx := tx - 0.2;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_SHIFT then begin // движение камеры вверх
tz := tz + 0.2;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_CONTROL then begin // движение камеры вниз
tz := tz - 0.2;
InvalidateRect(Handle, nil, False);
end;
If Key = 49 then begin // кнопка 1, переключение в режим точки
mode := POINT;
InvalidateRect(Handle, nil, False);
end;
If Key = 50 then begin // кнопка 2, переключение в режим линии
mode := LINE;
InvalidateRect(Handle, nil, False);
end;
If Key = 51 then begin // кнопка 3, переключение в режим полной закраски
mode := FILL;
InvalidateRect(Handle, nil, False);
end;
end;
procedure TfrmGL.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight); // задает область вывода
glMatrixMode (GL_PROJECTION); // матрица проекций задает, как будут
// проецироваться трехмерные объекты на плоскость экрана (в оконные координаты)
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 2, 9); // задаем перспективу
glMatrixMode (GL_MODELVIEW); // видовая матрица определяет преобразования
// объекта в мировых координатах, такие как параллельный перенос, изменение
// масштаба и поворот
glLoadIdentity; // действие команды вернутся в исходное состояние, команда
// заменяет текущую матрицу на единичную
// этот фрагмент нужен для придания трёхмерности
glTranslatef(0.0, -1.0, -6.0); // перенос объекта - ось Z
glRotatef(30.0, 1.0, 0.0, 0.0); // поворот объекта - ось X
glRotatef(70.0, 0.0, 1.0, 0.0); // поворот объекта - ось Y
InvalidateRect(Handle, nil, False); // локальное освобождение памяти
end;
end.
← →
Barlok (2003-09-25 22:20) [6]Я пробывал до этого сделать то что вы щас говорите но у меня неполучилось сделать, но это уже другой вопрос.
← →
Barlok (2003-09-25 22:24) [7]Может кто - нибудь вставит кусок кода с поворотом мышки чето я совсем уже запутался
Страницы: 1 вся ветка
Текущий архив: 2003.10.06;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.011 c