Мех на Blitz3D
Материал из Blitz Et Cetera
В общем, все это очень просто... надо только знать как и что. Начнем с единственной заготовки:
Такую картинку довольно несложно генерировать, но это уже не в этой статье.
Эта картинка обозначает некую небольшую часть волос в разрезе.
Идея такая: эту текстуру мы наносим, как полупрозрачную, на объект, потом копируем этот объект и чуть-чуть его увеличиваем. Когда мы сделаем много копий, то у нас получится псевдо-мех.
Начнем устанавливаем параметры, создаем камеру, делаем тип в котором будем хранить множество объектов, тут именно тип, потому что массив для этого не подходит.
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
У вас должно выйти что-то типа:
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("Hair.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
End
Да да, знаю, это медленно на geforce 4 mx 440, но на geforce 6600gt все летает!
Автор: Jimon (e-mail: jimon.j1m0n gmail.com)
|