Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.12.2011, 16:48
Arina5 Arina5 вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 13
Репутация: 10
По умолчанию Наложение текстуры

Здравствуйте, помогите, пожалуйста наложить какую-нибудь текстуру на поверхность Безье, а то никак не могу разобраться !!!
Вот код программы:
Код:
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  
Старый 04.12.2011, 21:55
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Какая может быть текстура, если построение идёт по точкам? Для начала хотя бы на треугольники перейди.
Код:
  glBegin(GL_POINTS);
для приведённого массива точек удобно использовать
Код:
  glBegin(GL_TRIANGLE_STRIP);
почитай как это работает.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 05.12.2011, 15:38
Arina5 Arina5 вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

У меня просто задание, либо наложить текстуру на поверхность, либо построить вазу из поверхности. Вот я и думаю, что проще сделать? Посоветуйте, пожалуйста ...
Ответить с цитированием
  #4  
Старый 06.12.2011, 00:17
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Насчёт треугольников я погорячился. Для мешей используется другой способ наложения текстуры:
Код:
  glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, @texpts);
  glEnable(GL_MAP2_TEXTURE_COORD_2);
Вам дали задание №45 из книги Краснова, а в №95 приводится пример по наложению текстуры. Вы можете скачать архив с готовой программой и исходным текстом, но он выполнен на API (нет у меня OpenGL в компонентах Дельфи) или посмотреть приведённый выше пример №95. Если Вы скачаете архив, то для препода можно сказать, что воспользовались уроками с этого сайта (я покраснел ).

besier
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 06.12.2011, 15:48
Arina5 Arina5 вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

Спасибо за пример. А на сайте есть комментарии к построению, как в учебнике Краснова? Просто есть недопонимание по поводу наложения текстуры ((
Ответить с цитированием
  #6  
Старый 06.12.2011, 21:28
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Так нужно было заглянуть. Там имеются серии уроков на разные темы.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 07.12.2011, 13:28
Arina5 Arina5 вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

у меня вроде бы заработало, только вот в чем дело: текстура накладывается, но просвечивается цвет фона. Не совсем корректно, вот код:
Код HTML:
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); LoadTexture('texture.bmp', MyTexture,false); glEnable(GL_TEXTURE_2D); glPointSize(5.0); texpts[0][0][0] := 0.0; texpts[0][0][1] := 0.0; texpts[1][0][0] := 0.0; texpts[1][0][1] := 1.0; texpts[0][1][0] := 1.0; texpts[0][1][1] := 0.0; texpts[1][1][0] := 1.0; texpts[1][1][1] := 1.0; // ïîâåðõíîñòü glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, @texpts); glEnable(GL_MAP2_TEXTURE_COORD_2); 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;
Может я что-то недоделала?
Ответить с цитированием
  #8  
Старый 07.12.2011, 21:47
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Судя по всему, проблема в LoadTexture, но я не телепат и не знаю как там грузится текстура. Где код этой процедуры? Кидай весь проект.

Несколько изменил пример: убрал все проверки (чревато но...) и слегка упростил. Загрузку изображения сделал из файла, добавил комментарии.
besier1

Дополнительно: юнит "imgload.pas" использует возможности ОС и может загружать bmp, jpg, ico, wmf. Последние два вам не нужны.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 08.12.2011 в 00:22.
Ответить с цитированием
  #9  
Старый 08.12.2011, 12:16
Arina5 Arina5 вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

Спасибо )) только вот теперь преподаватель сказал сделать окружность или полусферу из поверхности. Как я понимаю, нужно поменять контрольные точки?
Ответить с цитированием
  #10  
Старый 08.12.2011, 23:10
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Сударыня, вы видно очень невнимательны. в 95 примере главы 4, про который я говорил ранее, используется не только наложение текстуры на меш, но и как раз делается это на СФЕРУ. Если у вас нет этой книги, советую скачать её и многие проблемы исчезнут.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 13.12.2011, 17:53
Arina5 Arina5 вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

Я скачала этот пример, но не могу разобраться с ним(( в частности где рисуется сфера (и подойдет ли это к моему заданию). если у меня рисуется поверхность Безье по точкам (преподаватель сказал изменить координаты)
Ответить с цитированием
  #12  
Старый 13.12.2011, 21:53
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Пойдём по-другому. Возьми лист в клетку, нарисуй оси координат и расставь точки X и Y из предыдущего примера. Для наглядности увеличь масштаб хотя бы вдвое. Теперь визуально представь к ним координаты Y. Что получится? Отдалённо будет напоминать ту фигуру, которую видишь на экране. Теперь проделай то же с полу-сферой, только в обратном порядке. Представляешь её визуально и описываешь контрольные точки. Также необходимо понять как работает команда glMap2f, какие параметры за что отвечают и как это связано с ctrlpoints и его размерностью.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #13  
Старый 14.12.2011, 13:56
Arina5 Arina5 вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

изменила массив контрольных точек, теперь рисуется полусфера
вот массив
Код:
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  
Старый 14.12.2011, 21:50
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Я ведь не зря писал:
Цитата:
Также необходимо понять как работает команда glMap2f, какие параметры за что отвечают и как это связано с ctrlpoints и его размерностью.
Код:
  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  
Старый 15.12.2011, 12:57
Arina5 Arina5 вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

Увеличила размерность массива, дописала недостающие координаты, но вот только не могу понять, что изменить в glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @ctrlpoints) ?? Пробовала, но ничего не получается ((
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:17.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter