![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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);  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 У меня просто задание, либо наложить текстуру на поверхность, либо построить вазу из поверхности. Вот я и думаю, что проще сделать? Посоветуйте, пожалуйста ... 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Насчёт треугольников я погорячился. Для мешей используется другой способ наложения текстуры: 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, @texpts); glEnable(GL_MAP2_TEXTURE_COORD_2);   ).besier  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Спасибо за пример. А на сайте есть комментарии к построению, как в учебнике Краснова? Просто есть недопонимание по поводу наложения текстуры (( 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Так нужно было заглянуть. Там имеются серии уроков на разные темы. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 у меня вроде бы заработало, только вот в чем дело: текстура накладывается, но просвечивается цвет фона. Не совсем корректно, вот код: 
		
	
		
		
		
		
		
	
		
		
	
	
	Код HTML: 
	
  | 
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Судя по всему, проблема в LoadTexture, но я не телепат и не знаю как там грузится текстура. Где код этой процедуры? Кидай весь проект. 
		
	
		
		
		
		
			
		
		
		
		
		
			Несколько изменил пример: убрал все проверки (чревато но...) и слегка упростил. Загрузку изображения сделал из файла, добавил комментарии. besier1 Дополнительно: юнит "imgload.pas" использует возможности ОС и может загружать bmp, jpg, ico, wmf. Последние два вам не нужны. Последний раз редактировалось angvelem, 08.12.2011 в 00:22.  | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Спасибо )) только вот теперь преподаватель сказал сделать окружность или полусферу из поверхности. Как я понимаю, нужно поменять контрольные точки?  
		
	
		
		
		
		
		
	
		
		
	
	
	![]()  | 
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Сударыня, вы видно очень невнимательны. в 95 примере главы 4, про который я говорил ранее, используется не только наложение текстуры на меш, но и как раз делается это на СФЕРУ. Если у вас нет этой книги, советую скачать её и многие проблемы исчезнут. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#11  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Я скачала этот пример, но не могу разобраться с ним(( в частности где рисуется сфера (и подойдет ли это к моему заданию). если у меня рисуется поверхность Безье по точкам (преподаватель сказал изменить координаты)  
		
	
		
		
		
		
		
	
		
		
	
	
	  ![]()  | 
| 
		 
			 
			#12  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Пойдём по-другому. Возьми лист в клетку, нарисуй оси координат и расставь точки X и Y из предыдущего примера. Для наглядности увеличь масштаб хотя бы вдвое. Теперь визуально представь к ним координаты Y. Что получится? Отдалённо будет напоминать ту фигуру, которую видишь на экране. Теперь проделай то же с полу-сферой, только в обратном порядке. Представляешь её визуально и описываешь контрольные точки. Также необходимо понять как работает команда glMap2f, какие параметры за что отвечают и как это связано с ctrlpoints и его размерностью. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#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 и допиши недостаюшие координаты точек, для получения полной сферы.  | 
| 
		 
			 
			#15  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Увеличила размерность массива, дописала недостающие координаты, но вот только не могу понять, что изменить в glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @ctrlpoints) ?? Пробовала, но ничего не получается (( 
		
	
		
		
		
		
		
	
		
		
	
	
	 |