[bb] 3D Motion Blur Starfield by AntonyWells [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:42

Previous topic - Next topic

BlitzBot

Title : 3D Motion Blur Starfield
Author : AntonyWells
Posted : 1+ years ago

Description : Using custom Matrice functions, to render an interactive 3D starfield with per-pixel motion blur.
Change Stars =5000 to lower/increase the starcount.
Move the mouse to alter the pitch and yaw of the camera.

Press Lmb/Rmb to move camera along Z. (Use cX,cY vars to move along other axis)

-Edit-> Should have put this in the 2D section.


Code :
Code (blitzbasic) Select
Graphics 640,480,32,1
SetBuffer BackBuffer()

;--
Function Line(x#,y#,x1#,y1#,cv#)
xd=x1-x
yd=y1-y
If Abs(xd)>Abs(yd) steps=Abs(xd) Else steps=Abs(yd)
If steps<2 steps=2
xi#=xd/Float(steps)
yi#=yd/Float(steps)
ci#=cv/Float(steps)
av#=0
For steps=steps To 1 Step -1
WritePixelFast x,y,av Or (av Shl 8) Or (av Shl 16)
av=av+ci
x=x+xi
y=y+yi
Next

End Function


;--Star

Dim mt#(4,4,8) ;Eight matrix buffers

Global sCount

Type vector

Field x#,y#,z#

End Type

Type star
    Field ox,oy,oz
    Field loc.vector,oT,reset
End Type

;-Cam

Global cX#,cY#,cZ#

Global cP#,cT#,cR# ;cT = CYaw.


initStars(5000)

Repeat:Cls
cR=cR+1
cP = cP+ MouseXSpeed()*0.2
cT = cT+ MouseYSpeed()*0.2
cZ=cZ+MouseDown(1)*6
cZ=cZ-MouseDown(2)*6

MoveMouse 320,240
FlushMouse
starCycle()
Flip:Until KeyDown(1)

EndGraphics
End

;-Star Functions


Function initStars(starCount = 1000)
   Local star.star
   For j = 1 To starCount
      star = New star
      starloc = vector( Rnd(-3000,3000),Rnd(-3000,3000),          Rnd(-4000,4000) )
   Next
End Function

Const s1# = 255*256

Function starCycle()

Local star.star,dp.vector,oz

dp = New vector

gen_x_mat(1,cP)

gen_y_mat(2,cT)

multi_mat(1,2,3)

gen_z_mat(2,cR)

gen_t_mat(5, cX,cY,cZ)

multi_mat(3,2,1)

multi_mat(1,5,2)

i=2

LockBuffer

For star = Each star



oz = ((mt(1,3,i) * starlocx) + (mt(2,3,i) * starlocy) + (mt(3,3,i) * starlocz) + mt(4,3,i) ) + 256

cV = ((s1) / ( oz))



nX=320+ ( ((mt(1,1,i) * starlocx) + (mt(2,1,i) * starlocy) + (mt(3,1,i) * starlocz) + mt(4,1,i))   *256) / (oz)



nY=200+ ((  (mt(1,2,i) * starlocx) + (mt(2,2,i) * starlocy) + (mt(3,2,i) * starlocz) + mt(4,2,i))  *256) / (oz)

If cv<0 cv=0
If cv>255 cv=255

If ny>0 And  ny<480 And nx>0 And nx<640

If stareset=True
starox=nx
staroy=ny
stareset=False
EndIf

Line starox,staroy,nx,ny,cv
Else
stareset=True
EndIf

starox=starox+(nx-starox)*0.25
staroy=staroy+(ny-staroy)*0.25


Next

UnlockBuffer

Delete dp

Return sRen

End Function



;--Music


Function playTrack(num=1)

PlayMusic("t"+num+".mid")

End Function


Function gen_x_mat(i,a#)

mt(1,1,i)=1:mt(2,1,i)=0:mt(3,1,i)=0:mt(4,1,i)=0

mt(1,2,i)=0:mt(2,2,i)=Cos(a):mt(3,2,i)=Sin(a):mt(4,2,i)=0

mt(1,3,i)=0:mt(2,3,i)=-Sin(a):mt(3,3,i)=Cos(a):mt(4,3,i)=0

mt(1,4,i)=0:mt(2,4,i)=0:mt(3,4,i)=0:mt(4,4,i)=1

End Function

Function gen_y_mat(i,a#)

mt(1,1,i)=Cos(a):mt(2,1,i)=0:mt(3,1,i)=-Sin(a):mt(4,1,i)=0

mt(1,2,i)=0:mt(2,2,i)=1:mt(3,2,i)=0:mt(4,2,i)=0

mt(1,3,i)=Sin(a):mt(2,3,i)=0:mt(3,3,i)=Cos(a):mt(4,3,i)=0

mt(1,4,i)=0:mt(2,4,i)=0:mt(3,4,i)=0:mt(4,4,i)=0

End Function

Function gen_z_mat(i,a#)

mt(1,1,i)=Cos(a):mt(2,1,i)=Sin(a):mt(3,1,i)=0:mt(4,1,i)=0

mt(1,2,i)=-Sin(a):mt(2,2,i)=Cos(a):mt(3,2,i)=0:mt(4,2,i)=0

mt(1,3,i)=0:mt(2,3,i)=0:mt(3,3,i)=1:mt(4,3,i)=0

mt(1,4,i)=0:mt(2,4,i)=0:mt(3,4,i)=0:mt(4,4,i)=0

End Function


Function gen_t_mat(i,x#,y#,z#)

mt(1,1,i)=1:mt(2,1,i)=0:mt(3,1,i)=0:mt(4,1,i)=x

mt(1,2,i)=0:mt(2,2,i)=1:mt(3,2,i)=0:mt(4,2,i)=y

mt(1,3,i)=0:mt(2,3,i)=0:mt(3,3,i)=1:mt(4,3,i)=z

mt(1,4,i)=0:mt(2,4,i)=0:mt(3,4,i)=0:mt(4,4,i)=1

End Function

Function multi_mat(i1,i2,i3) ;Takes matrices i1 and i2 and combines them, resulting in i3

For m=1 To 4
For m1=1 To 4
mt(m,m1,i3)=0
For m2=1 To 4
mt(m,m1,i3)=mt(m,m1,i3)+mt(m,m2,i2)*mt(m2,m1,i1)
Next
Next
Next

End Function


Function vector.vector(x#=0,y#=0,z#=0)
v.vector=New vector:vx=x:vy=y:vz=z
Return v
End Function


;------------------


Comments :


churchaxe(Posted 1+ years ago)

 cool stuff!


Clyde(Posted 1+ years ago)

 Nice one and like the Spiralling!