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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 15.12.2011, 21:59
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Всё просто, начинаем от цифры 3 - это количество координат на точку - оставляем как есть. Далее количество самих точек, было 4 - размерность массива (0..3). Размерность увеличили - увеличиваем и число в параметре. Далее я описывал 12 и 4. 12 - произведение размерности точек (3 координаты) на размерность массива точек (0..3) = 12. И в заключении снова размерность массива (0..3) отсюда и цифра 4.
Пример:
Код:
  ctrlpoints : Array [0..3, 0..3, 0..2]
...
 glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @ctrlpoints);
меняем к примеру так:
Код:
  ctrlpoints : Array [0..6, 0..3, 0..2]
...
 glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 7, 0, 1, 21, 7, @ctrlpoints);
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #17  
Старый 18.12.2011, 12:00
Arina5 Arina5 вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

Теперь рисуется вообще не понятно что, возможно я дополнительные координаты неправильно дописала,
Код:
(
        (1, -3, 0),
        (2, -3, -5),
        (2, 3, -5),
        (1, 3, 0)),

    (
        (-1, -3, 0),
        (-2, -3, -5),
        (-2, 3, -5),
        (-1, 3, 0)),
и тогда у меня получается ctrlpoints : Array [0..5, 0..3, 0..2] ???
Ответить с цитированием
  #18  
Старый 18.12.2011, 12:37
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Массив увеличен правильно. Как описала glMap2f? Должно получиться:
Код:
  glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 6, 0, 1, 18, 6, @ctrlpoints);
И, честно говоря, я не понимаю этого прикола вашего преподователя. Он у вас мазохист? Существует нормальная команда для рисования сферы - gluSphere.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #19  
Старый 18.12.2011, 15:03
Arina5 Arina5 вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

Да, я всё так и сделала, только сфера не получается ((
Ответить с цитированием
  #20  
Старый 19.12.2011, 04:57
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Если особо не заморачиваться, то можно сделать так:
Код:
const
  pt1 : 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)));

  pt2 : 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)));
...
function DrawGLScene : Boolean;
var
  x, y : Integer;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glPushMatrix;
  glScale(0.5, 0.5, 0.5);
  glRotatef(90, 1, 0, 0);
  glColor3f(0.0, 1.0, 1.0);

  if solid then
  begin
    glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @pt1);
    glEvalMesh2(GL_FILL, 0, 20, 0, 20);
    glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @pt2);
    glEvalMesh2(GL_FILL, 0, 20, 0, 20);
  end
  else
  begin
    glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @pt1);
    glEvalMesh2(GL_LINE, 0, 20, 0, 20);
    glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @pt2);
    glEvalMesh2(GL_LINE, 0, 20, 0, 20);
  end;

  if mode then
  begin
    // The following code displays the control points as dots.
    glColor3f(1.0, 1.0, 0.0);
    glBegin(GL_POINTS);
    for x := 0 to 3 do
      for y := 0 to 3 do
        glVertex3fv(@pt1[x][y][0]);
    for x := 0 to 3 do
      for y := 0 to 3 do
        glVertex3fv(@pt2[x][y][0]);
    glEnd;
  end;
  glPopMatrix;

  Result := True;
end;

function InitGL : Boolean;
var
  bol : Boolean;
begin
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glClearDepth(1.0);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_AUTO_NORMAL);
  glEnable(GL_NORMALIZE);
  glEnable(GL_COLOR_MATERIAL);
  glEnable(GL_TEXTURE_2D);

  // источник света
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
 
  glEnable(GL_POINT_SMOOTH);
  glPointSize(5.0);

  // загрузка текстуры
  Bol := LoadTexture;

  if Bol then
  begin
    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);

    glEnable(GL_MAP2_VERTEX_3);
    glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
  end;
  Result := True;
end;
в принципе так и рекомендуется, отрисовывать по 16 точек за "порцию".
P.S. Чтобы сфера выглядела аккуратной, нужно тщательнее просчитать координаты точек.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Arina5 (21.12.2011)
  #21  
Старый 21.12.2011, 13:45
Arina5 Arina5 вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

Да, спасибо, теперь хоть рисуется сфера )) а вот этот шов, который получается, его никак не получится "обыграть"?
Ответить с цитированием
  #22  
Старый 21.12.2011, 18:56
Arina5 Arina5 вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 13
Репутация: 10
По умолчанию

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

Про шов, я писал выше.
Если solid рисуем текстуру иначе сетку.
Если mode рисуем точки.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter