В общем, все это очень просто... надо только знать как и что. Начнем с единственной заготовки: Такую картинку довольно несложно генерировать, но это уже не в этой статье. Эта картинка обозначает некую небольшую часть волос в разрезе. Идея такая: эту текстуру мы наносим, как полупрозрачную, на объект, потом копируем этот объект и чуть-чуть его увеличиваем. Когда мы сделаем много копий, то у нас получится псевдо-мех. Начнем устанавливаем параметры, создаем камеру, делаем тип в котором будем хранить множество объектов, тут именно тип, потому что массив для этого не подходит. Graphics3D 640,480,32,2 SetBuffer BackBuffer() cam=CreateCamera() MoveEntity cam,0,0,-7 Type cub Field ent% End Type Дальше установим базовые переменные. Можете поиграться со значениями. cachestvo#=300 ;scale x#=4 y#=x z#=x mm#=0 ;smeshenie t#=1 ;bufers xz#=0 yz#=0 t=t/cachestvo# Дальше самое главное! Нам надо сделать много практически одинаковых кубиков. For f#=0 To cachestvo c.cub=New cub c\ent=CreateCube() EntityFX c\ent,1 EntityColor c\ent,218,194,103 ScaleEntity c\ent,mm+f/(cachestvo/x),mm+f/(cachestvo/y),mm+f/(cachestvo/z) t1=LoadTexture("a.jpg",2) ScaleTexture t1,0.35,0.35 ;Это надо для придания небольшой ломаности волосам xz=xz+t+Rnd(-0.006,0.006) yz=yz+t+Rnd(-0.006,0.006) EntityAlpha c\ent,1-f/cachestvo PositionTexture t1,xz,yz EntityTexture c\ent,t1 Next Дальше - мелочи: так как у нас много объектов, надо их крутить все... While Not KeyHit(1) For c.cub=Each cub TurnEntity c\ent,0,1,0 Next UpdateWorld RenderWorld Flip Wend End У вас должно выйти что-то типа: ;hair.bb Graphics3D 640,480,32,2 SetBuffer BackBuffer() cam=CreateCamera() MoveEntity cam,0,0,-7 Type cub Field ent% End Type cachestvo#=300 ;scale x#=4 y#=x z#=x mm#=0 ;smeshenie t#=1 ;bufers xz#=0 yz#=0 t=t/cachestvo# For f#=0 To cachestvo c.cub=New cub c\ent=CreateCube() EntityFX c\ent,1 EntityColor c\ent,218,194,103 ScaleEntity c\ent,mm+f/(cachestvo/x),mm+f/(cachestvo/y),mm+f/(cachestvo/z) t1=LoadTexture("a.png",2) ScaleTexture t1,0.35,0.35 ;ето надо для придания небольшой ломаности волосам xz=xz+t+Rnd(-0.006,0.006) yz=yz+t+Rnd(-0.006,0.006) EntityAlpha c\ent,1-f/cachestvo PositionTexture t1,xz,yz EntityTexture c\ent,t1 Next While Not KeyHit(1) For c.cub=Each cub TurnEntity c\ent,0,1,0 Next UpdateWorld RenderWorld Flip Wend Да да, знаю, это медленно на geforce 4 mx 440, но на geforce 6600gt все летает!
Источник: http://blitzetc.boolean.name/ |