Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.009 c
11-18286
Kladov
2003-01-23 15:15
2003.10.06
Конкурс на самую короткую реализацию Double2Str


4-18667
deadman
2003-08-01 10:24
2003.10.06
какое сообщение?


1-18442
student
2003-09-24 21:51
2003.10.06
простой вопрос связайнный с сообщениями


7-18652
Карелин Артем
2003-07-16 16:51
2003.10.06
Как сделать определитель номера?


9-18210
Griffen
2003-04-02 07:22
2003.10.06
Sun flare в DirectX 8.0





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский