Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2009, 22:00   #1
byblik-07
 
Регистрация: 07.12.2009
Сообщений: 6
Стрелка delphi/OpenGl нужна помощь...

Здравствуйте, кто может помочь вот с такой штукой:
мне нужно подключить библиотеку openGl и нарисовать там параболоид и гиперболоид, что бы пользователь мог вращать их передвигать прибежать и отдалять)

с библиотекой все нормально, а вот с остальным..... беда полная(

Последний раз редактировалось byblik-07; 07.12.2009 в 22:05.
byblik-07 вне форума Ответить с цитированием
Старый 08.12.2009, 11:45   #2
byblik-07
 
Регистрация: 07.12.2009
Сообщений: 6
По умолчанию

что никто не знает?
byblik-07 вне форума Ответить с цитированием
Старый 08.12.2009, 12:15   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

по событиям мыши
по движению

...двуполостный параболоид это тело вращения, общая формула x^2 + y^2 = 2z, относительно оси z (то бишь эллипсоид)

...просто гиперболоид, это x^2/a^2 + y^2/b^2 - y^2/c^2 = -1

как пример, дам вам построение матрицы sinx/x в opengl, дальше сами поменяете что вам нужно:
Код:
//заполняем матрицу-
  for i:=0 to strok do
   for j:=0 to stolb div 2 do begin
    val[i,j].name:= 'bla-bla'; //чтоб строилось, типа не пустое
    //набиваем сетку
    val[i,j].x:= j * r - (stolb div 2 div 2)*r;
    val[i,j].y:= i * r - (strok div 2)*r;
    //набиваем Z
    a:= r* abs(((strok-1)div 2)- i);
    b:= r* abs(((stolb div 2 -1)div 2)- j);
    c:= sqrt ((a*a) + (b*b));
    if (i= (strok-1)div 2)and(j= (stolb div 2 -1)div 2) then val[i,j].z:= 1.2 //fix-
     else val[i,j].z:= sin(1.2*c)/c
   end
...

//строим матрицу-поверхность треугольниками-
  if smooth=1 then glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) //типа скелет-
   else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

  for i:= 0 to 499-1 do
   for j:=0 to 1499-1 do begin
    if (val[i,j].name<>'')and(val[i+1,j+1].name<>'')and(val[i+1,j].name<>'')and(val[i,j+1].name<>'') then begin 
//fix- отсекаем рисование несуществующх-> за несуществующие принимаем без имени!!!
    glLoadName(strtoint(val[i,j].name));

     glBegin(GL_TRIANGLES); //1- треуг
       glNormal3f(val[i,j].y,val[i,j].x,val[i,j].z); //стандартный метод-
        glVertex3fv(@val[i,j]);    //1- верш
      glNormal3f(val[i+1,j].y,val[i+1,j].x,val[i+1,j].z);
        glVertex3fv(@val[i+1,j]);  //2
      glNormal3f(val[i+1,j+1].y,val[i+1,j+1].x,val[i+1,j+1].z);
        glVertex3fv(@val[i+1,j+1]);//3
     glEnd;

     glBegin(GL_TRIANGLES); //2- треуг
      glNormal3f(val[i+1,j+1].y,val[i+1,j+1].x,val[i+1,j+1].z); 
        glVertex3fv(@val[i+1,j+1]);
      glNormal3f(val[i,j+1].y,val[i,j+1].x,val[i,j+1].z);
        glVertex3fv(@val[i,j+1]);
      glNormal3f(val[i,j].y,val[i,j].x,val[i,j].z);
        glVertex3fv(@val[i,j]);
    glEnd;

     end
    end
  end;
обратите внимание, для сглаживания используются нормали к вершинам вызываемые перед каждым выводом вершины треугольника, без них изображение будет угловым без сглаживания.

также настоятельно советую почитать книжку краснова и примеры к нему...
Изображения
Тип файла: jpg sinx div x.jpg (155.7 Кб, 136 просмотров)
Тип файла: jpg sinx div x-1.jpg (12.2 Кб, 233 просмотров)
Тип файла: jpg sinx div x-2.jpg (95.4 Кб, 138 просмотров)
Тип файла: jpg произвольное обнаружение-1.jpg (171.8 Кб, 142 просмотров)
Тип файла: jpg произвольное обнаружение-3.jpg (117.9 Кб, 137 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 08.12.2009 в 12:26.
raxp вне форума Ответить с цитированием
Старый 08.12.2009, 12:21   #4
byblik-07
 
Регистрация: 07.12.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
по событиям мыши
по движению

...двуполостный параболоид это тело вращения, общая формула x^2 + y^2 = 2z, относительно оси z (то бишь эллипсоид)

...просто гиперболоид, это x^2/a^2 + y^2/b^2 - y^2/c^2 = -1

как пример, дам вам построение матрицы sinx/x в opengl, дальше сами поменяете что вам нужно:
Код:
//заполняем матрицу-
  for i:=0 to strok do
   for j:=0 to stolb div 2 do begin
    val[i,j].name:= 'bla-bla'; //чтоб строилось, типа не пустое
    //набиваем сетку
    val[i,j].x:= j * r - (stolb div 2 div 2)*r;
    val[i,j].y:= i * r - (strok div 2)*r;
    //набиваем Z
    a:= r* abs(((strok-1)div 2)- i);
    b:= r* abs(((stolb div 2 -1)div 2)- j);
    c:= sqrt ((a*a) + (b*b));
    if (i= (strok-1)div 2)and(j= (stolb div 2 -1)div 2) then val[i,j].z:= 1.2 //fix-
     else val[i,j].z:= sin(1.2*c)/c
   end
...

//строим матрицу-поверхность треугольниками-
  if smooth=1 then glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) //типа скелет-
   else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

  for i:= 0 to 499-1 do
   for j:=0 to 1499-1 do begin
    if (val[i,j].name<>'')and(val[i+1,j+1].name<>'')and(val[i+1,j].name<>'')and(val[i,j+1].name<>'') then begin 
//fix- отсекаем рисование несуществующх-> за несуществующие принимаем без имени!!!
    glLoadName(strtoint(val[i,j].name));

     glBegin(GL_TRIANGLES); //1- треуг
       glNormal3f(val[i,j].y,val[i,j].x,val[i,j].z); //стандартный метод-
        glVertex3fv(@val[i,j]);    //1- верш
      glNormal3f(val[i+1,j].y,val[i+1,j].x,val[i+1,j].z);
        glVertex3fv(@val[i+1,j]);  //2
      glNormal3f(val[i+1,j+1].y,val[i+1,j+1].x,val[i+1,j+1].z);
        glVertex3fv(@val[i+1,j+1]);//3
     glEnd;

     glBegin(GL_TRIANGLES); //2- треуг
      glNormal3f(val[i+1,j+1].y,val[i+1,j+1].x,val[i+1,j+1].z); 
        glVertex3fv(@val[i+1,j+1]);
      glNormal3f(val[i,j+1].y,val[i,j+1].x,val[i,j+1].z);
        glVertex3fv(@val[i,j+1]);
      glNormal3f(val[i,j].y,val[i,j].x,val[i,j].z);
        glVertex3fv(@val[i,j]);
    glEnd;

     end
    end
  end;
обратите внимание, для сглаживания используются нормали к вершинам вызываемые перед каждым выводом вершины треугольника, без них изображение будет угловым без сглаживания.

также настоятельно советую почитать книжку краснова и примеры к нему...


спасибо большое за ответ, буду пытаться что то сделать)
byblik-07 вне форума Ответить с цитированием
Старый 08.12.2009, 12:32   #5
byblik-07
 
Регистрация: 07.12.2009
Сообщений: 6
По умолчанию

теперь я понял что я дуб и вообще нифига в этом не понимаю))
byblik-07 вне форума Ответить с цитированием
Старый 08.12.2009, 12:47   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

это вы зря, каждый всегда с чего-то когда-то начинал. Начните с простого и разбейте вашу задачу на подзадачи, выведите точку или треугольник...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 08.12.2009, 12:53   #7
byblik-07
 
Регистрация: 07.12.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
это вы зря, каждый всегда с чего-то когда-то начинал. Начните с простого и разбейте вашу задачу на подзадачи, выведите точку или треугольник...
да если бы мне это нравилось другое дело, а так это задание в универе)
я в этом вообще не соображаю)
была бы робота с видео другое дело))
byblik-07 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi - нужна помощь Psi_X Помощь студентам 11 05.02.2009 14:59
Нужна помощь на Delphi ВЕКО Помощь студентам 1 19.04.2008 15:48
Нужна помощь по Delphi Виктория 1 Фриланс 5 25.02.2007 21:21