3d-sprite

Pixilang по русски
Post Reply
User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

3d-sprite

Post by Al_Rado » Fri Feb 06, 2009 4:43 pm

Собственно, просмотрщик спрайтов в 3d ) Повороты/вращения мышью

Code: Select all

// Al_Rado  http://al-rado.ya.ru
// 3d_pixel // 3d-просмотрщик спрайтов 06.02.09

logo = load_pixi ("img.gif")
CUBE_PIXEL
x_logo = get_pixi_xsize ( logo ) // ширина лого
y_logo = get_pixi_ysize ( logo ) // высота лого
start_timer( 0 ) // запускаем таймер
use_mouse=0 // флаг использования мыши
s = 200 // значение масштаба
x_line=0
y_line=0
px_line=20
py_line=20
alfa_color = get_pixi_alpha(logo) // прозрачный цвет, например WHITE

main: // главный цикл программы
t = get_timer( 0 ) / 32 * 2 // переменная для изменения углов вращения, основана на данных таймера
t_scale( s, s, s ) // масштабируем картинку
  clear(#aaaaaa)
  handle_pen_keys ({use_mouse=1}, {use_mouse=1 px_line=x_line  py_line=y_line rx=gpx ry=gpy x_line=gpx  y_line=gpy}, {use_mouse=0})
  t_rotate_x( ry, 0, 0 ) // вращение по оси X
  t_rotate_y( rx, 0, 0 ) // вращение по оси Y
  sort_triangles( cube, cube_t ) // сортируем треугольники
  VIVOD_PIXI
  t_reset  // очищаем все трансформации
  if use_mouse=0 { ry=ry+(py_line+y_line)/10  rx=rx+(px_line+x_line)/10 } 

frame(30)
go main


////////////////////////////////////////////////////////////////////
//////////////////////////ПОДПРОГРАММЫ//////////////////////////////
////////////////////////////////////////////////////////////////////

VIVOD_PIXI: // отрисовка лого кубиками
t_translate (-256*8*(x_logo/2)-2048,-256*8*(y_logo/2),0) // сдвигаем всё по оси X и Y в левый верхний угол (половина ширины/высоты лого * ширину кубика+промежуток ) + корректировка

l=0
m=0 while m < y_logo {
   n=0 while n < x_logo {
      t_translate ( (256*8),0 ,0 ) // переводим по оси X на кубик правее
      if logo [l] != alfa_color { color=logo[l]  COLOR_CUBE_PIXEL triangles3d( cube, cube_t ) } // если ячейка массива лого не равна нулю (любой символ кроме точки), то рисуем кубик
   l+1
   n+1
   }
t_translate ( -256*8*(x_logo) ,(256*8) ,0 ) // переводим по оси Y на кубик ниже, по оси X возвращаем в начало
m+1
}
ret

CUBE_PIXEL:
// данные для построения куба
s = 1200 // длинна стороны куба
cube=new_array(64)
cube[0]=-s
cube[1]=-s
cube[2]=-s
cube[8]=s
cube[9]=-s
cube[10]=-s
cube[16]=s
cube[17]=s
cube[18]=-s
cube[24]=-s
cube[25]=s
cube[26]=-s
cube[32]=-s
cube[33]=-s
cube[34]=s
cube[40]=s
cube[41]=-s
cube[42]=s
cube[48]=s
cube[49]=s
cube[50]=s
cube[56]=-s
cube[57]=s
cube[58]=s

cube_t=new_array(96)
cube_t[0]=0
cube_t[1]=1
cube_t[2]=2
cube_t[3]=#80FF70
cube_t[4]=256
cube_t[8]=0
cube_t[9]=2
cube_t[10]=3
cube_t[11]=#80FF70
cube_t[12]=256
cube_t[16]=4
cube_t[17]=5
cube_t[18]=6
cube_t[19]=#90A0B0
cube_t[20]=256
cube_t[24]=4
cube_t[25]=6
cube_t[26]=7
cube_t[27]=#90A0B0
cube_t[28]=256
cube_t[32]=0
cube_t[33]=7
cube_t[34]=4
cube_t[35]=#909090
cube_t[36]=256
cube_t[40]=0
cube_t[41]=3
cube_t[42]=7
cube_t[43]=#909090
cube_t[44]=256
cube_t[48]=1
cube_t[49]=2
cube_t[50]=5
cube_t[51]=#FFFFFF
cube_t[52]=256
cube_t[56]=2
cube_t[57]=5
cube_t[58]=6
cube_t[59]=#FFFFFF
cube_t[60]=256
cube_t[64]=0
cube_t[65]=1
cube_t[66]=5
cube_t[67]=#40E0F0
cube_t[68]=256
cube_t[72]=0
cube_t[73]=4
cube_t[74]=5
cube_t[75]=#40E0F0
cube_t[76]=256
cube_t[80]=3
cube_t[81]=2
cube_t[82]=7
cube_t[83]=#909090
cube_t[84]=256
cube_t[88]=2
cube_t[89]=6
cube_t[90]=7
cube_t[91]=#909090
cube_t[92]=256
ret

COLOR_CUBE_PIXEL: // одна сторона кубика - цвет пикселя, остальные осветленные/затемненные стороны
color = get_color (get_red(color)+10,get_green(color)+10,get_blue(color)+10 )
cube_t[3]=	color
cube_t[11]=	color
cube_t[19]= get_color (get_red(color)/3,get_green(color)/3,get_blue(color)/3 )
cube_t[27]= get_color (get_red(color)/3,get_green(color)/3,get_blue(color)/3 )
cube_t[35]= get_color (get_red(color)/2,get_green(color)/2,get_blue(color)/2 )
cube_t[43]= get_color (get_red(color)/2,get_green(color)/2,get_blue(color)/2 )
cube_t[51]=	get_color (get_red(color)*3,get_green(color)*3,get_blue(color)*3 )
cube_t[59]=	get_color (get_red(color)*3,get_green(color)*3,get_blue(color)*3 )
cube_t[67]=	get_color (get_red(color)*2,get_green(color)*2,get_blue(color)*2 )
cube_t[75]=	get_color (get_red(color)*2,get_green(color)*2,get_blue(color)*2 )
cube_t[83]=	get_color (get_red(color)/2,get_green(color)/2,get_blue(color)/2 )
cube_t[91]=	get_color (get_red(color)/2,get_green(color)/2,get_blue(color)/2 )
ret

Для примера этот чел:
http://www.picamatic.com/show/2009/02/0 ... _41x77.gif
Attachments
3d_sprite.gif
Скриншот
3d_sprite.gif (5.51 KiB) Viewed 4531 times
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

goglus
Posts: 122
Joined: Tue Dec 04, 2007 4:19 pm
Contact:

Re: 3d-sprite

Post by goglus » Fri Feb 06, 2009 4:52 pm

класс

J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Re: 3d-sprite

Post by J3d1 » Fri Feb 06, 2009 5:19 pm

Круто! Молодец!

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: 3d-sprite

Post by Al_Rado » Fri Feb 06, 2009 5:53 pm

Спасиб )
Если бы еще кубики всегда нормально отрисовывались, было бы еще симпотнее :)
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

Post Reply