Code archives/3D Graphics - Effects/3D Motion Blur Starfield
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| 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. | |||||
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
star\loc = 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) * star\loc\x) + (mt(2,3,i) * star\loc\y) + (mt(3,3,i) * star\loc\z) + mt(4,3,i) ) + 256
cV = ((s1) / ( oz))
nX=320+ ( ((mt(1,1,i) * star\loc\x) + (mt(2,1,i) * star\loc\y) + (mt(3,1,i) * star\loc\z) + mt(4,1,i)) *256) / (oz)
nY=200+ (( (mt(1,2,i) * star\loc\x) + (mt(2,2,i) * star\loc\y) + (mt(3,2,i) * star\loc\z) + 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 star\reset=True
star\ox=nx
star\oy=ny
star\reset=False
EndIf
Line star\ox,star\oy,nx,ny,cv
Else
star\reset=True
EndIf
star\ox=star\ox+(nx-star\ox)*0.25
star\oy=star\oy+(ny-star\oy)*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:v\x=x:v\y=y:v\z=z
Return v
End Function
;------------------ |
Comments
| ||
| cool stuff! |
| ||
| Nice one and like the Spiralling! |
Code Archives Forum