Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли отключить "куб отсечения" в OpenGL [D7, XP]


Вася ©   (2010-01-20 02:10:00) 

всем привет! начал я вот изучать OpenGL...

научился задавать плоскости.первая тренировка - заставить вращаться куб:
были непонятные глюки, долго не мог сообразить что такое, но потом подсказали что нужно включить Z-Buffer... =)

кубик из 6-ти квадратов, разворачиваю мир (или как-то так), но то что выходит за область ((1,1,1),(-1,-1,-1)) ка бы отрезается нафиг... =(
знакомый сказал, что это зовётся "куб отсечения" - можно его отключить как-то? =((

з.ы. и если не затруднит посоветуйте хорошую самоучитель по OpenGL, а то моя книга - фигня полная... =(((


@!!ex   (2010-01-23 23:36:00) [1]

> [12] Вася   (23.01.10 22:22)
> NeHe вроде нашлось ( http://nehe.gamedev.net/),но там ж
> всё по английски...будут проблемы.надо конечно англ.изучать,
> но пока переведу всё нормально годы пройдут...=(

Есть на русском.


> а вот мне с самоучителем вместе дали для Делфи два файла
> специальных: dglOpenGL.pas и Textures.pas - это нормальные
> файлы (может подсунули что не то)?

Это не нормальные файлы. Нормальный - opengl.pas идет в поставке с Delphi. расширения ИМХО стоит подлкючать самостоятельно, хотя тут на вкус и цвет...
Textures.pas - скорее всего от Яна Хорна(мир его праху), там для практического применения нужно много переделать.


> [12] Вася   (23.01.10 22:22)
> а если нормальные,то бывают ли у них как бы версии чтоль
> (могут ли быть где-то более новые их версии)?

Ну кто-то делает новые версии... Лично я предпочитаю свой файлик с нужными мне расширениями.


Вася   (2010-01-23 22:22:00) [2]

> Кажется тебе надо разобраться в математической части.

я попробую.будем стараться.=)
вот только траффика маловато у меня,нет ли где-нибудь заархивированных статеек каких попроще?
NeHe вроде нашлось ( http://nehe.gamedev.net/),но там ж всё по английски...будут проблемы.надо конечно англ.изучать,но пока переведу всё нормально годы пройдут...=(

а вот мне с самоучителем вместе дали для Делфи два файла специальных: dglOpenGL.pas и Textures.pas - это нормальные файлы (может подсунули что не то)?
а если нормальные,то бывают ли у них как бы версии чтоль (могут ли быть где-то более новые их версии)?


@!!ex   (2010-01-23 22:01:00) [3]

> [10] Вася   (23.01.10 21:53)

Кажется тебе надо разобраться в математической части.
Тогда ты поймешь и что такое Frustum(реально там ни разу не куб, а пирамида. Кубом она становится в плоскости экрана), и
как правильно треугольники быстр рендерить, и какие параметры передавать при задании перспективы и модельной матрицу и проч и проч.


Вася   (2010-01-23 21:53:00) [4]

> А каким волшебным образом у тебя трансформируются вершины и 3Д изображение проецируется на плоскость экрана?

ну откуда же мне знать-то?)мне распечатали самоучитель какой-то...там вот примерно такие примеры были:

procedure draw;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(angX, 1, 0, 0);
glRotatef(angY, 0, 1, 0);
glRotatef(angZ, 0, 0, 1);
glScalef(z, z, z);
glBegin(GL_QUADS);
  // квадрат № 1
  glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
  glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
  glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);
  glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);
  // квадрат № 2
  glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
  glTexCoord2f(1.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
  glTexCoord2f(0.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
  glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
  // квадрат № 3
  glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
  glTexCoord2f(0.0, 0.0); glVertex3f(-1.0,  1.0,  1.0);
  glTexCoord2f(1.0, 0.0); glVertex3f( 1.0,  1.0,  1.0);
  glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
  // квадрат № 4
  glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0);
  glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0);
  glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
  glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
  // квадрат № 5
  glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
  glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
  glTexCoord2f(0.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);
  glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
  // квадрат № 6
  glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
  glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
  glTexCoord2f(1.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);
  glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
glEnd;
SwapBuffers(DC);
end;


в таймере изменяем angX, angY, angZ и z и вызываем draw.получается куб крутящийся с масштабированием.и всё.больше никаких объяснений.

я неплохо умею по имеющемуся коду понимать как он работает.сделал даже функцию рекурсивную строющую из таких же квадратов всякое, но когда их становится больше 700000 начинаются жуткие тормоза да и "куб отсечения" очень мешает - приходилось вручную подбирать масштаб чтоб вся фигура влазила без срезаний...
думал разные текстуры применять, но так он даже с кубом виснет, потом что-то как бы вылетает и скорость рисования становится быстрее раза в 3, но все квадраты рисуются просто белые...

а на Z-Buffer я вроде зря говорил, это обман зрения кажется такой получался.


@!!ex   (2010-01-23 20:07:00) [5]

> [7] Вася   (22.01.10 16:40)
> что за матрицы? о_О

ЛОл. :)
А каким волшебным образом у тебя трансформируются вершины и 3Д изображение проецируется на плоскость экрана??


> [7] Вася   (22.01.10 16:40)
> написал значений наугад - вообще ничего не изменилось...

Наш метод... ага.


> может ктонить посоветует всётаки нормальный самоучитель,
> а то мой повидимому вообще ниочём... :'(

Гугли туторы NeHe
Считаются лучшими.
А еще, найди препода по вышмату и попроси объяснить матрицы и вектора.
Если ты в 10 классе или старше, то все поймешь без проблем.
ГРафика станет проще... гораздо проще.
А то потом будешь по поисковикам лазить, искать код считающий нормаль. :%)


Вася   (2010-01-23 17:47:00) [6]

нашел такую ссыль: http://forum.codenet.ru/archive/index.php/t-36975.html

исходя из того,что там написано - то что я спрашивал - невозможно... :'(((
так что наверное можно закрывать тему...

хотя на совет по самоучителю я всё ищо надеюсь (по той ссыли тоже про какие-то "уравнения плоскости","преобразования координат" и матрицы,а в моей фигне про подобное и упоминания нету).


Вася   (2010-01-22 16:40:00) [7]

> отца русской демократии.

скорей внука =))

а яндекс сказал это:

Функция glFrustum умножает текущую матрицу на матрицу перспективного проецирования.

что за матрицы? о_О
написал значений наугад - вообще ничего не изменилось...

а ещё у меня оказалось что Z-Buffer не всегда работает как надо. мир покрутится чуть - и вроде выправляется, а при запуске будто и не работает. =((
и когда больше 200-300 "квадратов" вообще ужасть как виснет всё. =(((


может ктонить посоветует всётаки нормальный самоучитель, а то мой повидимому вообще ниочём... :'(


grammar-nazi   (2010-01-21 21:56:00) [8]

glFrustum() спасёт отца русской демократии.


Вася   (2010-01-21 13:48:00) [9]

Удалено модератором
Примечание: Создание пустых сообщений


Вася   (2010-01-20 02:42:00) [10]

ой... это у меня двумерный был... вот трёхмерный:

// квадрат №31
glTexCoord2f(0, 0); glVertex3f(-0.3, -0.3, 0.9);
glTexCoord2f(0, 1); glVertex3f(-0.3, 0.3, 0.9);
glTexCoord2f(1, 1); glVertex3f(0.3, 0.3, 0.9);
glTexCoord2f(1, 0); glVertex3f(0.3, -0.3, 0.9);
// ...


Вася   (2010-01-20 02:40:00) [11]

з.ы. "квадратом" я это называю:

// квадрат №7
glTexCoord2f(0, 0); glVertex2f(-1, -1);
glTexCoord2f(0, 1); glVertex2f(-1, 1);
glTexCoord2f(1, 1); glVertex2f(1, 1);
glTexCoord2f(1, 0); glVertex2f(1, -1);
// ...


это как бы полигон чтоль, тока квадратный... :)


Вася   (2010-01-20 02:36:00) [12]

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

procedure draw;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(angX, 1, 0, 0);
glRotatef(angY, 0, 1, 0);
glRotatef(angZ, 0, 0, 1);
glBegin(GL_QUADS);
...
glEnd;
SwapBuffers(DC);
end;


а обязательно каждую отрисовку все квадраты заного в glBegin задавать?фигура же пока не меняется у меня, тока крутится...просто когда много квадратов всё подвисать начинает. =((


antonn   (2010-01-20 02:19:00) [13]

мож нормали не туда повернуты? :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо