Журнал о программированнии на языках Blitz3D, BlitzPlus, BlitzMax

Мех на 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_sobaka_gmail.com)

Другие

Друзья