Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 12:28

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 17:23 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Итак, чтобы не перегружать изложение кучей кода, начинаем пробовать 3D.

Код:
0 VALUE ActiveLibrary

: FUNCTION ActiveLibrary SWAP GETPROCADDRESS VALUE ;

" opengl32.dll" LOADLIBRARY VALUE OPENGL
OPENGL TO ActiveLibrary


" glViewport" FUNCTION glViewPort@   : glViewPort glViewPort@ API4 DROP ;
" glPointSize" FUNCTION glPointSize@ : glPointSize glPointSize@ API1 DROP ;
" glColor3i" FUNCTION glColor3i@     : glColor3i glColor3i@ API3 DROP ;
" glColor3ubv" FUNCTION glColor3ubv@ : glColor3ubv glColor3ubv@ API1 DROP ;
" glColor4ubv" FUNCTION glColor4ubv@ : glColor4ubv glColor4ubv@ API1 DROP ;
" glVertex2dv" FUNCTION glVertex2dv@ : glVertex2dv glVertex2dv@ API1 DROP ;
" glVertex3dv" FUNCTION glVertex3dv@ : glVertex3dv glVertex3dv@ API1 DROP ;
" glBegin" FUNCTION glBegin@         : glBegin glBegin@ API1 DROP ;
" glEnd" FUNCTION glEnd@             : glEnd glEnd@ API0 DROP ;
" glEnable" FUNCTION glEnable@       : glEnable glEnable@ API1 DROP ;
" glDisable" FUNCTION glDisable@     : glDisable glDisable@ API1 DROP ;
" glClear" FUNCTION glClear@         : glClear glClear@ API1 DROP ;
" glPushMatrix" FUNCTION glPushMatrix@ : glPushMatrix glPushMatrix@ API0 DROP ;
" glPopMatrix" FUNCTION glPopMatrix@   : glPopMatrix glPopMatrix@ API0 DROP ;
" glFrustum" FUNCTION glFrustum@       : glFrustum 6 glFrustum@ API DROP ;
" glTranslatef" FUNCTION glTranslatef@ : glTranslatef glTranslatef@ API3 DROP ;
" glTexImage2D" FUNCTION glTexImage2D@ : glTexImage2D glTexImage2D@ API9 DROP ;
" glTexParameteri" FUNCTION glTexParameteri@ : glTexParameteri glTexParameteri@ API3 DROP ;
" glTexCoord2dv" FUNCTION glTexCoord2dv@ : glTexCoord2dv glTexCoord2dv@ API1 DROP ;
" glTexEnvf" FUNCTION glTexEnvf@ : glTexEnvf glTexEnvf@ API3 DROP ;

CREATE Point1 3 FLOATS ALLOT
CREATE Point2 3 FLOATS ALLOT


: SET3D //  POINT, F: X, Y, Z --
  DUP 2 -TH F!
  DUP 1 -TH F!
  F!
;

: MY_SCENE

  0 0 500 500 glViewPort

  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

  glPushMatrix

// пара точек

  -0.5 0.0 0.0 Point1 SET3D
   0.5 0.0 0.0 Point2 SET3D

  GL_LINES glBegin
    Point1 glVertex3dv
    Point2 glVertex3dv
  glEnd

  glPopMatrix
;

' MY_SCENE TO 3D


Слово 3D векторное, и выполняется постоянно в процессе прокачки сообщений. Записав туда отрисовку собственной сцены, мы ее и получаем.

На очереди повороты...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 18:25 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Нужны минимальные комментарии для чайника.

А так, понюхал, полизал, на хвост примерил...

Даже запустил командой Quark.exe test.frt где в test.frt приведенный пример скопирован

Получил зеленую горизонтальную линию на ~1/8 экрана по ширине, а дальше...

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

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 18:41 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
кхе-кхе... даже нарисовать линию в другом месте не получилось изменением координат точек в исходнике...

Там границы 1.0 ... -1.0 видимо должны быть :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 18:45 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Да, и одна координата перпендикулярно экрану. Размер прямоугольника, к которому относятся координаты -1.0..1.0, задаются через glViewPort.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 18:55 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Цвет и положение линии поменять удалось... а нарисовать две линии - проблемс...

Видимо, не тем хвостом делаю...

Код:
  -0.5 0.0 0.0 Point1 SET3D
   0.5 0.0 0.0 Point2 SET3D
  -0.5 0.0 0.5 Point3 SET3D
   0.5 0.0 -0.5 Point4 SET3D


Код:
  GL_LINES glBegin
    Point1 glVertex3dv
    Point2 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point3 glVertex3dv
    Point4 glVertex3dv
  glEnd

рисует только одну линию, а то и вовсе ничего не рисует

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 19:01 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Все правильно, рисуются две линии. Point3 и Point4 объявлены так же?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 19:14 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Хищник писал(а):
Все правильно, рисуются две линии. Point3 и Point4 объявлены так же?


Да, объявлены так же (иначе то оно ошибку бы выдало?)

Сейчас буду пробовать еще. Возможно, наглючил где..

(через минуту)

И вправду наглючил... линии одна на одну легли... :o
поправил координаты, теперь вижу две линии

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 19:24 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Собственно, теперь вопрос, как это 3D увидеть?

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

Нарисовал "параллелепипед"


Код:
   0.3 0.0 0.3 Point1 SET3D
   0.3 0.0 -0.3 Point2 SET3D

    -0.3 0.0  0.3 Point3 SET3D
    -0.3 0.0  -0.3 Point4 SET3D

   0.3 0.0 0.3 Point5 SET3D
   0.3 0.0 -0.3 Point6 SET3D

    -0.3 0.0  0.3 Point7 SET3D
    -0.3 0.0  -0.3 Point8 SET3D


  GL_LINES glBegin
    Point1 glVertex3dv
    Point2 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point2 glVertex3dv
    Point4 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point4 glVertex3dv
    Point3 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point3 glVertex3dv
    Point1 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point5 glVertex3dv
    Point6 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point6 glVertex3dv
    Point8 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point8 glVertex3dv
    Point7 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point7 glVertex3dv
    Point5 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point1 glVertex3dv
    Point5 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point2 glVertex3dv
    Point6 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point3 glVertex3dv
    Point7 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point4 glVertex3dv
    Point8 glVertex3dv
  glEnd


Выглядит как прямоугольник, пока не сместить 5-8 точки по диагонали

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 20:06 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
WingLion писал(а):
Собственно, теперь вопрос, как это 3D увидеть?

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


Откуда и вылезает вращение! :)

Итак, куда-нибудь наверх:

Код:
FLOAT NX
FLOAT NY
FLOAT NZ


: X+ NX F@ 10.0 F+ NX F! NX F@ 360.0 F> IF NX F@ 360.0 F- NX F! THEN ;
: X- NX F@ 10.0 F- NX F! NX F@ 0.0 F< IF NX F@ 360.0 F+ NX F! THEN ;
: Y+ NY F@ 10.0 F+ NY F! NY F@ 360.0 F> IF NY F@ 360.0 F- NY F! THEN ;
: Y- NY F@ 10.0 F- NY F! NY F@ 0.0 F< IF NY F@ 360.0 F+ NY F! THEN ;
: Z+ NZ F@ 10.0 F+ NZ F! NZ F@ 360.0 F> IF NZ F@ 360.0 F- NZ F! THEN ;
: Z- NZ F@ 10.0 F- NZ F! NZ F@ 0.0 F< IF NZ F@ 360.0 F+ NZ F! THEN ;   


Внутрь MY_SCENE, после glPushMatrix:

Код:
  NX F@ ROTATEANGLE SF!
  1.0 glX SF!
  0.0 glY SF!
  0.0 glZ SF!
  3DROTATE

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

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


ROTATEANGLE уже есть в движке, для удобства.

В самый конец, где было назначение вектора на 3D (хотя это не принципиально, можно и после объявления "вращалок" наверху):


Код:
' X+ TO K_UP
' X- TO K_DOWN
' Y+ TO K_LEFT
' Y- TO K_RIGHT
' Z+ TO K_PGUP
' Z- TO K_PGDOWN     


Все, теперь стрелки и PageUp/PageDown :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 20:19 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Код:
CREATE Point1 3 FLOATS ALLOT
CREATE Point2 3 FLOATS ALLOT
CREATE Point3 3 FLOATS ALLOT
CREATE Point4 3 FLOATS ALLOT
CREATE Point5 3 FLOATS ALLOT
CREATE Point6 3 FLOATS ALLOT
CREATE Point7 3 FLOATS ALLOT
CREATE Point8 3 FLOATS ALLOT

: SET3D //  POINT, F: X, Y, Z --
  DUP 2 -TH F!
  DUP 1 -TH F!
  F!
;

// уже не пара точек
: INIT_POINTS
   0.3 0.0 0.3 Point1 SET3D
   0.3 0.0 -0.3 Point2 SET3D

    -0.3 0.0  0.3 Point3 SET3D
    -0.3 0.0  -0.3 Point4 SET3D

   0.4 0.0 0.4 Point5 SET3D
   0.4 0.0 -0.2 Point6 SET3D

    -0.2 0.0  0.4 Point7 SET3D
    -0.2 0.0  -0.2 Point8 SET3D
;

: MY_SCENE

  0 0 1680 1080 glViewPort

  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

// вот тут, собственно, и описывается сцена

// задаем цвет
  0x7FFFFFFF 0x7FFFFFFF 0x7FFFFFFF glColor3i

  glPushMatrix

// рисуем "параллелепипед" (8-вершинный 12-гранник однако)
  GL_LINES glBegin
    Point1 glVertex3dv
    Point2 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point2 glVertex3dv
    Point4 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point4 glVertex3dv
    Point3 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point3 glVertex3dv
    Point1 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point5 glVertex3dv
    Point6 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point6 glVertex3dv
    Point8 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point8 glVertex3dv
    Point7 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point7 glVertex3dv
    Point5 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point1 glVertex3dv
    Point5 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point2 glVertex3dv
    Point6 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point3 glVertex3dv
    Point7 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point4 glVertex3dv
    Point8 glVertex3dv
  glEnd

  glPopMatrix
;

INIT_POINTS

' MY_SCENE TO 3D

// смещение координаты точки

: SH_3DPOINT // dx,dy,dz,3dpoint --
  DUP 2 -TH F+!
  DUP 1 -TH F+!
  F+!
;

// определяю простейшие действия на кнопки

' BYE TO K_ESC // для быстрого выхода

: PIC_LEFT   // смещение всей картики влево
-0.1 0.0 0.0 Point1 SH_3DPOINT
-0.1 0.0 0.0 Point2 SH_3DPOINT
-0.1 0.0 0.0 Point3 SH_3DPOINT
-0.1 0.0 0.0 Point4 SH_3DPOINT
-0.1 0.0 0.0 Point5 SH_3DPOINT
-0.1 0.0 0.0 Point6 SH_3DPOINT
-0.1 0.0 0.0 Point7 SH_3DPOINT
-0.1 0.0 0.0 Point8 SH_3DPOINT
;

' PIC_LEFT TO K_LEFT

: PIC_RIGHT // смещение всей картинки вправо
0.1 0.0 0.0 Point1 SH_3DPOINT
0.1 0.0 0.0 Point2 SH_3DPOINT
0.1 0.0 0.0 Point3 SH_3DPOINT
0.1 0.0 0.0 Point4 SH_3DPOINT
0.1 0.0 0.0 Point5 SH_3DPOINT
0.1 0.0 0.0 Point6 SH_3DPOINT
0.1 0.0 0.0 Point7 SH_3DPOINT
0.1 0.0 0.0 Point8 SH_3DPOINT
;

' PIC_RIGHT  TO K_RIGHT

: PIC_UP // вверх
0.0 0.0 0.1 Point1 SH_3DPOINT
0.0 0.0 0.1 Point2 SH_3DPOINT
0.0 0.0 0.1 Point3 SH_3DPOINT
0.0 0.0 0.1 Point4 SH_3DPOINT
0.0 0.0 0.1 Point5 SH_3DPOINT
0.0 0.0 0.1 Point6 SH_3DPOINT
0.0 0.0 0.1 Point7 SH_3DPOINT
0.0 0.0 0.1 Point8 SH_3DPOINT
;

' PIC_UP  TO K_UP

: PIC_DOWN // вниз
0.0 0.0 -0.1 Point1 SH_3DPOINT
0.0 0.0 -0.1 Point2 SH_3DPOINT
0.0 0.0 -0.1 Point3 SH_3DPOINT
0.0 0.0 -0.1 Point4 SH_3DPOINT
0.0 0.0 -0.1 Point5 SH_3DPOINT
0.0 0.0 -0.1 Point6 SH_3DPOINT
0.0 0.0 -0.1 Point7 SH_3DPOINT
0.0 0.0 -0.1 Point8 SH_3DPOINT
;

' PIC_DOWN  TO K_DOWN


такая вот тестовая программка вышла (без начальной шапки)
стрелками параллелепипед перемещается по экрану, клавишa ЕSC - выход

один минус - отрисовка ...ме-е---е-е-дленная-я-я-я...

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 20:38 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
WingLion писал(а):
один минус - отрисовка ...ме-е---е-е-дленная-я-я-я...

Потому что клавиши по таймеру, 18,2 Гц.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 20:50 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Хищник писал(а):
Потому что клавиши по таймеру, 18,2 Гц.


И ускорить никак? ;)

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 21:02 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Вопросик странный возник...

При тестировании вращения возникает ощущение, что крутится оно в четырех измерениях... параллелепипед иногда вырождается в совершенно плоскую фигуру...

Вот такой код: Может, напортачил где...

Код:
CREATE Point1 3 FLOATS ALLOT
CREATE Point2 3 FLOATS ALLOT
CREATE Point3 3 FLOATS ALLOT
CREATE Point4 3 FLOATS ALLOT
CREATE Point5 3 FLOATS ALLOT
CREATE Point6 3 FLOATS ALLOT
CREATE Point7 3 FLOATS ALLOT
CREATE Point8 3 FLOATS ALLOT

: SET3D //  POINT, F: X, Y, Z --
  DUP 2 -TH F!
  DUP 1 -TH F!
  F!
;

// уже не пара точек
: INIT_POINTS
   0.3 0.0 0.3 Point1 SET3D
   0.3 0.0 -0.3 Point2 SET3D

    -0.3 0.0  0.3 Point3 SET3D
    -0.3 0.0  -0.3 Point4 SET3D

   0.4 0.0 0.4 Point5 SET3D
   0.4 0.0 -0.2 Point6 SET3D

    -0.2 0.0  0.4 Point7 SET3D
    -0.2 0.0  -0.2 Point8 SET3D
;

FLOAT NX
FLOAT NY
FLOAT NZ

: X+ NX F@ 10.0 F+ NX F! NX F@ 360.0 F> IF NX F@ 360.0 F- NX F! THEN ;
: X- NX F@ 10.0 F- NX F! NX F@ 0.0 F< IF NX F@ 360.0 F+ NX F! THEN ;
: Y+ NY F@ 10.0 F+ NY F! NY F@ 360.0 F> IF NY F@ 360.0 F- NY F! THEN ;
: Y- NY F@ 10.0 F- NY F! NY F@ 0.0 F< IF NY F@ 360.0 F+ NY F! THEN ;
: Z+ NZ F@ 10.0 F+ NZ F! NZ F@ 360.0 F> IF NZ F@ 360.0 F- NZ F! THEN ;
: Z- NZ F@ 10.0 F- NZ F! NZ F@ 0.0 F< IF NZ F@ 360.0 F+ NZ F! THEN ;




: MY_SCENE

  0 0 1680 1080 glViewPort

  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

// вот тут, собственно, и описывается сцена

// задаем цвет
  0x7FFFFFFF 0x7FFFFFFF 0x7FFFFFFF glColor3i

  glPushMatrix

// для врашения
NX F@ ROTATEANGLE SF!
  1.0 glX SF!
  0.0 glY SF!
  0.0 glZ SF!
  3DROTATE

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

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

// рисуем "параллелепипед" (8-вершинный 12-гранник однако)
  GL_LINES glBegin
    Point1 glVertex3dv
    Point2 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point2 glVertex3dv
    Point4 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point4 glVertex3dv
    Point3 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point3 glVertex3dv
    Point1 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point5 glVertex3dv
    Point6 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point6 glVertex3dv
    Point8 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point8 glVertex3dv
    Point7 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point7 glVertex3dv
    Point5 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point1 glVertex3dv
    Point5 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point2 glVertex3dv
    Point6 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point3 glVertex3dv
    Point7 glVertex3dv
  glEnd

  GL_LINES glBegin
    Point4 glVertex3dv
    Point8 glVertex3dv
  glEnd

  glPopMatrix

;

INIT_POINTS

' MY_SCENE TO 3D

// смещение координаты точки

: SH_3DPOINT // dx,dy,dz,3dpoint --
  DUP 2 -TH F+!
  DUP 1 -TH F+!
  F+!
;

// определяю простейшие действия на кнопки

' BYE TO K_ESC // для быстрого выхода

: PIC_LEFT   // смещение всей картики влево
-0.1 0.0 0.0 Point1 SH_3DPOINT
-0.1 0.0 0.0 Point2 SH_3DPOINT
-0.1 0.0 0.0 Point3 SH_3DPOINT
-0.1 0.0 0.0 Point4 SH_3DPOINT
-0.1 0.0 0.0 Point5 SH_3DPOINT
-0.1 0.0 0.0 Point6 SH_3DPOINT
-0.1 0.0 0.0 Point7 SH_3DPOINT
-0.1 0.0 0.0 Point8 SH_3DPOINT
;

' PIC_LEFT TO K_LEFT

: PIC_RIGHT // смещение всей картинки вправо
0.1 0.0 0.0 Point1 SH_3DPOINT
0.1 0.0 0.0 Point2 SH_3DPOINT
0.1 0.0 0.0 Point3 SH_3DPOINT
0.1 0.0 0.0 Point4 SH_3DPOINT
0.1 0.0 0.0 Point5 SH_3DPOINT
0.1 0.0 0.0 Point6 SH_3DPOINT
0.1 0.0 0.0 Point7 SH_3DPOINT
0.1 0.0 0.0 Point8 SH_3DPOINT
;

' PIC_RIGHT  TO K_RIGHT

: PIC_UP // вверх
0.0 0.0 0.1 Point1 SH_3DPOINT
0.0 0.0 0.1 Point2 SH_3DPOINT
0.0 0.0 0.1 Point3 SH_3DPOINT
0.0 0.0 0.1 Point4 SH_3DPOINT
0.0 0.0 0.1 Point5 SH_3DPOINT
0.0 0.0 0.1 Point6 SH_3DPOINT
0.0 0.0 0.1 Point7 SH_3DPOINT
0.0 0.0 0.1 Point8 SH_3DPOINT
;

' PIC_UP  TO K_UP

: PIC_DOWN // вниз
0.0 0.0 -0.1 Point1 SH_3DPOINT
0.0 0.0 -0.1 Point2 SH_3DPOINT
0.0 0.0 -0.1 Point3 SH_3DPOINT
0.0 0.0 -0.1 Point4 SH_3DPOINT
0.0 0.0 -0.1 Point5 SH_3DPOINT
0.0 0.0 -0.1 Point6 SH_3DPOINT
0.0 0.0 -0.1 Point7 SH_3DPOINT
0.0 0.0 -0.1 Point8 SH_3DPOINT
;

' PIC_DOWN  TO K_DOWN

' X+ TO K_SHIFT_UP
' X- TO K_SHIFT_DOWN
' Y+ TO K_SHIFT_LEFT
' Y- TO K_SHIFT_RIGHT
' Z+ TO K_SHIFT_PGUP
' Z- TO K_SHIFT_PGDOWN   

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 21:39 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
WingLion писал(а):
При тестировании вращения возникает ощущение, что крутится оно в четырех измерениях... параллелепипед иногда вырождается в совершенно плоскую фигуру...

Это как раз следствия одной из сложностей вращения: поочередное вращение по разным осям может привести к возникновению "шарнирного замка". Более подробно про вращение описано здесь: http://www.rossprogrammproduct.com/tran ... %20FAQ.htm
Я использую для вращения матрицы: можно не только вращать, но и задавать пропорции, размеры, отражение и позицию. А еще удобно работать с движением: скорость задается обычным вектором - три координаты по числу осей, а итератор тупо "плюсует" его к текущим координатам объекта, если вызывается через постоянные промежутки времени, или вычисляет изменение координат в зависимости от прошедшего времени с последнего изменения. Аналогично и с ускорением.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: простейшее 3D
СообщениеДобавлено: Вс дек 25, 2011 21:50 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Код:
NX F@ ROTATEANGLE SF!
  1.0 glX SF!
  0.0 glY SF!
  0.0 glZ SF!
  3DROTATE


Вот в этом кусочке кода задается вектор, вокруг которого производится вращение. В тестовом примере векторы поочередно устанавливаются вдоль каждой из осей. Можно ставить сразу нужный вектор, задав его координаты. Для OpenGL желательно его отнормировать (длина равна 1.0). Тогда можно будет повернуть в нужное положение за одну операцию вращения.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB