Forth
http://www.fforum.winglion.ru/

Quark: простейшее 3D
http://www.fforum.winglion.ru/viewtopic.php?f=23&t=2788
Страница 2 из 3

Автор:  WingLion [ Пн дек 26, 2011 22:04 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

Код:
Код:
GL_TRIANGLES glBegin
   Point1  glVertex3dv
   Point2  glVertex3dv
   Point3  glVertex3dv
glEnd


Отработал нормально, вроде.

Код
Код:
GL_QUADS glBegin
   Point1  glVertex3dv
   Point2  glVertex3dv
   Point3  glVertex3dv
   Point4  glVertex3dv
glEnd

Тупит. Вместо ожидаемого прямо(четырех)угольника нарисовал какой-то непонятный "флаг вражеской наружности"

упс... я дурак... должно быть:

Код:
GL_QUADS glBegin
   Point1  glVertex3dv
   Point2  glVertex3dv
   Point4  glVertex3dv
   Point3  glVertex3dv
glEnd


Хм... a GL_POLYGONS ... хнык... нихт арбайтен...

Автор:  WingLion [ Пн дек 26, 2011 22:12 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

Ссылочка в тему - http://pmg.org.ru/nehe/index.html - уроки по OpenGL - нефортовые, но на форт их в принципе перевести можно ;) оттуда и словечки новые подцепил...

Автор:  WingLion [ Пн дек 26, 2011 22:43 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

А теперь начинаются хотелки:

1. Нужна (видимо, для перемещения внутри сцены) функция glTranslatef

В объявлениях (в примере) она вроде, есть, а как ее использовать - не ясно.

2. Нужен пример, как рисовать на полигонах текстуры? (из *.bmp файлов)

3. Окраска полигонов... вроде разобрался по предыдущей ссылке:

где-то вначале:
Код:
: Gl_GREEN 0 0x7FFFFFFF 0 glColor3i ;

: Gl_RED 0x7FFFFFFF 0 0 glColor3i ;

: Gl_BLUE 0 0 0x7FFFFFFF glColor3i ;


в отрисовке сцены:
Код:
  GL_TRIANGLES glBegin
  Gl_GREEN
   Point5 glVertex3dv
  Gl_RED
   Point6 glVertex3dv
  Gl_BLUE
   Point7 glVertex3dv
  glEnd


цвета переливчатые получаются однако ;)

Автор:  Hishnik [ Вт дек 27, 2011 12:55 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

WingLion писал(а):
Тупит. Вместо ожидаемого прямо(четырех)угольника нарисовал какой-то непонятный "флаг вражеской наружности"

Да, вершины надо обходить в каком-то определенном направлении - по часовой стрелке или против часовой. Желательно сразу с этим определиться, потому что потом одна из сторон будет лицевой.
WingLion писал(а):
Хм... a GL_POLYGONS ... хнык... нихт арбайтен...

Добавлю.
WingLion писал(а):
1. Нужна (видимо, для перемещения внутри сцены) функция glTranslatef

Есть такое, работает. Сейчас пример сделаю.

WingLion писал(а):
2. Нужен пример, как рисовать на полигонах текстуры? (из *.bmp файлов)

Аналогично.
WingLion писал(а):
цвета переливчатые получаются однако

Правильно, согласно программе, каждая вершина своего цвета получается. Вот оно и строит переходы цветов.

OpenGL организован как машина состояний. Цвет не просто влияет на следующее действие, а задается, и используется всеми последующими построениями, которым он вообще нужен. Такой подход приятен тем, что в движке OpenGL есть еще масса параметров, которые применяются автоматически, поскольку мы их не меняли. Когда мы до них доберемся, это изменит картинку, но даже без явного изменения они работают.

Автор:  Hishnik [ Вт дек 27, 2011 16:18 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

WingLion писал(а):
Хм... a GL_POLYGONS ... хнык... нихт арбайтен...

Как оказалось по документации на OpenGL - и не должен. Оно называется GL_POLYGON, и в кварке есть. В http://www.msyst.ru/quark.pdf в конце есть таблица констант, которые реализованы как слова (упс, список в документации почему-то неполон, реально есть больше).

Автор:  WingLion [ Вт дек 27, 2011 18:29 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

Хищник писал(а):
В http://www.msyst.ru/quark.pdf в конце есть таблица констант, которые реализованы как слова (упс, список в документации почему-то неполон, реально есть больше).


Было бы неплохо, чтобы каждая константа была с описанием, о том, для чего она и что делает, а то гадать трудновато.

Автор:  Hishnik [ Вт дек 27, 2011 18:45 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

WingLion писал(а):
Было бы неплохо, чтобы каждая константа была с описанием, о том, для чего она и что делает, а то гадать трудновато.

Это уже проще по какому-нибудь учебнику, поскольку там некоторые вещи нетривиальны. Я писал константы в процессе освоения учебника по OpenGL, чтобы получались те примеры.

Автор:  WingLion [ Вт дек 27, 2011 19:01 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

Хищник писал(а):
Это уже проще по какому-нибудь учебнику, поскольку там некоторые вещи нетривиальны.


Только учебники обычно не дают примеров кода на форте и не объясняют, как использовать на форте те же константы... Поэтому, минимальный ликбез необходим.

Автор:  Гость [ Вт дек 27, 2011 19:41 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

WingLion писал(а):
Хищник писал(а):
Это уже проще по какому-нибудь учебнику, поскольку там некоторые вещи нетривиальны.


Только учебники обычно не дают примеров кода на форте и не объясняют, как использовать на форте те же константы... Поэтому, минимальный ликбез необходим.


Вроде были для Форт систем уроки (Forth+OpenGL в google) также можно брать, наверное, из примеров BigForth?
Win32Forth ... и наверное отдельные и существующие в проектах графические наработки?

Автор:  Hishnik [ Вт дек 27, 2011 19:48 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

WingLion писал(а):
Только учебники обычно не дают примеров кода на форте и не объясняют, как использовать на форте те же константы... Поэтому, минимальный ликбез необходим.

Я для начала листал достаточно старую книгу Краснова по программированию OpenGL на Дельфи и переписывал примеры оттуда. Форт сам по себе не очень нужен, оттуда нужен порядок вызова функций, а подключаются они все равно через GETPROCADDRESS. Некоторая сложность с передачей чисел с плавающей точкой - в кварке они на стеке сопроцессора, а в OpenGL должны лежать на стеке параметров. Но это нивелируется тем, что в самой библиотеке рекомендуется передавать не параметры, а указатель на массив с ними. Другая тонкость - иногда функции в dll отличаются от функций, как они написаны в книгах. Отличие в добавленной букве A или U (ASCII/Unicode, если функция работает со строками).

Автор:  Hishnik [ Вт дек 27, 2011 19:52 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

Гость писал(а):
Вроде были для Форт систем уроки (Forth+OpenGL в google) также можно брать, наверное, из примеров BigForth?
Win32Forth ... и наверное отдельные и существующие в проектах графические наработки?

А смысл? Разобраться надо с OpenGL, а не с Фортом. На 95% программа будет состоять из вызовов функций OpenGL, и надо просто научиться делать это в нужном порядке для достижения требуемого эффекта. Можно, конечно, потыкаться по ссылкам в надежде, что где-то это уже есть... правда, это перетекает в глобальную проблему интернет-поиска: "а где бы скачать себе мозгов?" :)

Автор:  Гость [ Вт дек 27, 2011 20:16 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

Хищник писал(а):
Можно, конечно, потыкаться по ссылкам в надежде, что где-то это уже есть... правда, это перетекает в глобальную проблему интернет-поиска: "а где бы скачать себе мозгов?" :)


Это реализовано не только в Quark Форте и "мозги" тут ни причём а разбираться можно используя готовые исходники
на Форт языке и конечно грамотную книжку по OpenGL (для "прояснения" и "уяснения" тонкостей использования)

Автор:  Hishnik [ Вт дек 27, 2011 20:20 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

Гость писал(а):
Это реализовано не только в Quark Форте

А речи об эксклюзивности вообще не идет.
Гость писал(а):
и "мозги" тут ни причём

Именно мозги и нужны. Без понимания того, как реализуется графика, ничего не будет. Хоть десять трансляторов Форта скачай.
Гость писал(а):
а разбираться можно используя готовые исходники
на Форт языке и конечно грамотную книжку по OpenGL (для "прояснения" и "уяснения" тонкостей использования)

Нет. На первом месте грамотная книжка, а вот для прояснения можно и Форт. И учить по книжке надо не тонкости использования, а само использование, начиная с основ.

Автор:  Hishnik [ Ср дек 28, 2011 01:03 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

Продолжаем. На очереди текстуры.

Сначала под текстуру надо выделить место:

Код:
CREATE MyTexture[] 64 64 * CELLS ALLOT


Текстуру надо чем-то заполнить. Например, полноцветным (24 бита на пиксел) bmp-файлом. Это можно сделать и без отдельной библиотеки для работы с bmp, учитывая то, что заголовок занимает 54 байта, а дальше идут данные. Например, вот так (имеется в виду, что у нас уже есть файл размером 64 на 64):

Код:
: LoadHishnik
" avatar.bmp" OPEN TO HF-OUT
HF-OUT MyTexture[] 54 READFILE
HF-OUT MyTexture[] 64 64 * 3 * READFILE
HF-OUT CLOSE
;


Идем дальше. Теперь надо текстуру правильно разместить в пространстве, ну и заодно в каких-то размерах (ведь не 64 на 64 же?). Для этого создаем текстурные координаты:

Код:
CREATE TexPoint0 0.0 F, 0.0 F, 0.0 F,
CREATE TexPoint1 1.0 F, 0.0 F, 0.0 F,
CREATE TexPoint2 1.0 F, 1.0 F, 0.0 F,
CREATE TexPoint3 0.0 F, 1.0 F, 0.0 F,     


Можно убедиться, что это координаты углов квадрата со стороной 1. Потом мы их будем использовать.

Код:
: PREPARE_TEXTURE
  GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_LINEAR glTexParameteri
  GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_LINEAR glTexParameteri

  GL_TEXTURE_2D 0 3
  64 64 0 GL_RGB GL_UNSIGNED_BYTE MyTexture[]
  glTexImage2D
;


Вот тут, в слове PREPARE_TEXTURE, мы описываем, что это все означает. Первые две строчки задают тип масштабирования. Это нужно затем, чтобы понять, что делать с текстурой, которую надо отобразить, к примеру, в 37 на 25 пикселов. Тут написано GL_LINEAR, что означает линейную интерполяцию.

Дальше идет сложная функция glTexImage2D. У нее куча параметров. Можно заметить среди них размеры (64 64), и формат (GL_RGB GL_UNSIGNED_BYTE - то есть пикселы в формате RGB, каждый цвет - беззнаковый байт). Здесь проще сверяться с документацией.


Наконец, задаем саму текстуру. Во-первых, разрешаем ее использование (GL_TEXTURE_2D glEnable). Потом нужно будет его запретить, а то она будет рисоваться везде. Во-вторых, рисуем фигуру, на которой и будет текстура, это GL_QUADS


Код:

: TEXTURE

  GL_TEXTURE_2D glEnable

  GL_QUADS glBegin
    TexPoint0 glTexCoord2dv TexPoint0 glVertex3dv
    TexPoint1 glTexCoord2dv TexPoint1 glVertex3dv
    TexPoint2 glTexCoord2dv TexPoint2 glVertex3dv
    TexPoint3 glTexCoord2dv TexPoint3 glVertex3dv
  glEnd
  GL_TEXTURE_2D glDisable
;                             


Теперь делаем копипаст из предыдущего примера, чтобы все это так же вращалось.

Код:
: SHOW-TEXTURE
  0 0 500 500 glViewPort
  glPushMatrix


  GL_DEPTH_TEST glEnable
  GL_DEPTH_BUFFER_BIT glClear

  GL_LIGHTING glEnable
  GL_LIGHT0 glEnable
  GL_LIGHT1 glEnable
  GL_COLOR_MATERIAL glEnable
  GL_LINE_SMOOTH glEnable

  0 0x7FFFFFFF 0 glColor3i


  NX F@ ROTATEANGLE SF!
  1.0 glX SF!
  0.0 glY SF!
  0.0 glZ SF!
  3DROTATE

  NY F@ ROTATEANGLE SF! // -120
  0.0 glX SF!
  1.0 glY SF!
  0.0 glZ SF!
  3DROTATE

  NZ F@ ROTATEANGLE SF! // 100
  0.0 glX SF!
  0.0 glY SF!
  1.0 glZ SF!
  3DROTATE

// начинается текстура:
// линии координат по трем осям

  GL_LINES glBegin
    Point1 glVertex3dv
    Point2 glVertex3dv
  glEnd
  GL_LINES glBegin
    Point3 glVertex3dv
    Point4 glVertex3dv
  glEnd
  GL_LINES glBegin
    Point5 glVertex3dv
    Point6 glVertex3dv
  glEnd


  0x7FFFFFFF DUP DUP glColor3i

// рисуем

  PREPARE_TEXTURE

  TEXTURE

  glPopMatrix

;                         

' SHOW-TEXTURE TO 3D


У меня, с учетом добавленной картинки, крутится вот такой оптимистичный кошак :)
Вложение:
quark9.gif
quark9.gif [ 50.4 Кб | Просмотров: 21226 ]

Автор:  WingLion [ Ср дек 28, 2011 04:19 ]
Заголовок сообщения:  Re: Quark: простейшее 3D

Так... для кодирования чего-то, наподобие Wolf3D, теперь не хватает только вывода звука... :)

Страница 2 из 3 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/