|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Наложение текстуры
Здравствуйте, помогите, пожалуйста наложить какую-нибудь текстуру на поверхность Безье, а то никак не могу разобраться !!!
Вот код программы: Код:
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); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private DC : HDC; hrc: HGLRC; end; var frmGL: TfrmGL; wrkX, wrkY : Integer; mode : Boolean = False; solid : Boolean = True; down : Boolean = False; implementation {$R *.DFM} const {двумерный массив контрольных (опорных) точек поверхности} ctrlpoints : Array [0..3, 0..3, 0..2] of GLFloat = ( ( (-1.5, -1.5, 4.0), (-0.5, -1.5, 2.0), (0.5, -1.5, -1.0), (1.5, -1.5, 2.0)), ( (-1.5, -0.5, 1.0), (-0.5, -0.5, 3.0), (0.5, -0.5, 0.0), (1.5, -0.5, -1.0)), ( (-1.5, 0.5, 4.0), (-0.5, 0.5, 0.0), (0.5, 0.5, 3.0), (1.5, 0.5, 4.0)), ( (-1.5, 1.5, -2.0), (-0.5, 1.5, -2.0), (0.5, 1.5, 0.0), (1.5, 1.5, -1.0)) ); {======================================================================= Перерисовка окна} procedure TfrmGL.FormPaint(Sender: TObject); var i, j : Integer; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glPushMatrix; glRotatef(85.0, 1.0, 1.0, 1.0); glColor3f (0.0, 1.0, 1.0); If solid then glEvalMesh2(GL_FILL, 0, 20, 0, 20) else glEvalMesh2(GL_LINE, 0, 20, 0, 20); If mode then begin // The following code displays the control points as dots. glColor3f(1.0, 1.0, 0.0); glBegin(GL_POINTS); For i := 0 to 3 do For j := 0 to 3 do glVertex3fv(@ctrlpoints[i][j][0]); glEnd; end; glPopMatrix; SwapBuffers(DC); end; {======================================================================= Формат пикселя} procedure SetDCPixelFormat (hdc : HDC); var pfd : TPixelFormatDescriptor; nPixelFormat : Integer; begin FillChar (pfd, SizeOf (pfd), 0); pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; 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); glEnable(GL_DEPTH_TEST); glEnable(GL_AUTO_NORMAL); glEnable(GL_COLOR_MATERIAL); // источник света glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glPointSize(5.0); // поверхность glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @ctrlpoints); glEnable(GL_MAP2_VERTEX_3); glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0); 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; If Key = VK_SPACE then begin mode := not mode; InvalidateRect(Handle, nil, False); end; If Key = VK_RETURN then begin solid := not solid; InvalidateRect(Handle, nil, False); end; end; procedure TfrmGL.FormResize(Sender: TObject); begin glViewport(0, 0, ClientWidth, ClientHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity; If ClientWidth <= ClientHeight then glOrtho(-4.0, 4.0, -4.0 * ClientHeight / ClientWidth, 4.0 * ClientHeight / ClientWidth, -4.0, 4.0) else glOrtho(-4.0 * ClientWidth / ClientHeight, 4.0 * ClientWidth / ClientHeight, -4.0, 4.0, -4.0, 4.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity; InvalidateRect(Handle, nil, False); end; procedure TfrmGL.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Down := True; wrkX := X; wrkY := Y; end; procedure TfrmGL.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Down := False; end; procedure TfrmGL.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin If Down then begin glRotatef (X - wrkX, 0.0, 1.0, 0.0); glRotatef (Y - wrkY, 1.0, 0.0, 0.0); InvalidateRect(Handle, nil, False); wrkX := X; wrkY := Y; end; end; end. Спасибо Последний раз редактировалось Admin, 04.12.2011 в 16:52. |
#2
|
||||
|
||||
Какая может быть текстура, если построение идёт по точкам? Для начала хотя бы на треугольники перейди.
Код:
glBegin(GL_POINTS); Код:
glBegin(GL_TRIANGLE_STRIP); Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
|||
|
|||
У меня просто задание, либо наложить текстуру на поверхность, либо построить вазу из поверхности. Вот я и думаю, что проще сделать? Посоветуйте, пожалуйста ...
|
#4
|
||||
|
||||
Насчёт треугольников я погорячился. Для мешей используется другой способ наложения текстуры:
Код:
glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, @texpts); glEnable(GL_MAP2_TEXTURE_COORD_2); besier Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
|||
|
|||
Спасибо за пример. А на сайте есть комментарии к построению, как в учебнике Краснова? Просто есть недопонимание по поводу наложения текстуры ((
|
#6
|
||||
|
||||
Так нужно было заглянуть. Там имеются серии уроков на разные темы.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
|||
|
|||
у меня вроде бы заработало, только вот в чем дело: текстура накладывается, но просвечивается цвет фона. Не совсем корректно, вот код:
Код HTML:
|
#8
|
||||
|
||||
Судя по всему, проблема в LoadTexture, но я не телепат и не знаю как там грузится текстура. Где код этой процедуры? Кидай весь проект.
Несколько изменил пример: убрал все проверки (чревато но...) и слегка упростил. Загрузку изображения сделал из файла, добавил комментарии. besier1 Дополнительно: юнит "imgload.pas" использует возможности ОС и может загружать bmp, jpg, ico, wmf. Последние два вам не нужны. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 08.12.2011 в 00:22. |
#9
|
|||
|
|||
Спасибо )) только вот теперь преподаватель сказал сделать окружность или полусферу из поверхности. Как я понимаю, нужно поменять контрольные точки?
|
#10
|
||||
|
||||
Сударыня, вы видно очень невнимательны. в 95 примере главы 4, про который я говорил ранее, используется не только наложение текстуры на меш, но и как раз делается это на СФЕРУ. Если у вас нет этой книги, советую скачать её и многие проблемы исчезнут.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#11
|
|||
|
|||
Я скачала этот пример, но не могу разобраться с ним(( в частности где рисуется сфера (и подойдет ли это к моему заданию). если у меня рисуется поверхность Безье по точкам (преподаватель сказал изменить координаты)
|
#12
|
||||
|
||||
Пойдём по-другому. Возьми лист в клетку, нарисуй оси координат и расставь точки X и Y из предыдущего примера. Для наглядности увеличь масштаб хотя бы вдвое. Теперь визуально представь к ним координаты Y. Что получится? Отдалённо будет напоминать ту фигуру, которую видишь на экране. Теперь проделай то же с полу-сферой, только в обратном порядке. Представляешь её визуально и описываешь контрольные точки. Также необходимо понять как работает команда glMap2f, какие параметры за что отвечают и как это связано с ctrlpoints и его размерностью.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#13
|
|||
|
|||
изменила массив контрольных точек, теперь рисуется полусфера
вот массив Код:
ctrlpoints : Array [0..3, 0..3, 0..2] of GLFloat = ( ( (2, -2, 0), (3, -1, 0), (3, 1, 0), (2, 2, 0)), ( (1, -3, 0), (2, -3, 5), (2, 3, 5), (1, 3, 0)), ( (-1, -3, 0), (-2, -3, 5), (-2, 3, 5), (-1, 3, 0)), ( (-2, -2, 0), (-3, -1, 0), (-3, 1, 0), (-2, 2, 0)) ); |
#14
|
||||
|
||||
Я ведь не зря писал:
Цитата:
Код:
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @ctrlpoints); 3 - количество координат на точку 4 - количество групп координат (столько сейчас у тебя) 12 - произведение предыдущих 2 параметров 4 - количество групп координат (столько сейчас у тебя) увеличь размерность массива ctrlpoints и допиши недостаюшие координаты точек, для получения полной сферы. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#15
|
|||
|
|||
Увеличила размерность массива, дописала недостающие координаты, но вот только не могу понять, что изменить в glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @ctrlpoints) ?? Пробовала, но ничего не получается ((
|