Post by bluatigro on May 14, 2021 6:29:45 GMT -5
i wood like a dobble buffer
'bluaigro 14 may 2021
'line3d avartar
'lb4.5.1 version
WindowWidth = DisplayWidth
WindowHeight = DisplayHeight
global winx , winy , pi
winx = WindowWidth
winy = WindowHeight
pi = atn( 1 ) * 4
'nomainwin
global xyz , xzy , yxz , yzx , zxy , zyx
xyz = 0
xzy = 1
yxz = 2
yzx = 3
zxy = 4
zyx = 5
global number , rotx , roty , rotz , trans , temp , temp2 , angle
rotx = 21
roty = 22
rotz = 23
trans = 24
temp = 25
temp2 = 26
global leftno , rightno , arm , elbow , wrist , leg , knee , enkle , neck
leftno = 0
arm = 0
elbow = 1
wrist = 2
leg = 3
knee = 4
enkle = 5
neck = 6
rightno = 32
dim m( index( 26 , 3 , 3 ) ) , sk( 64 , 2 )
open "line 3d" for graphics as #m
#m "trapclose [quit]"
timer 100 , [timer.tick]
wait
[timer.tick]
scan
print "tick"
#m "fill black"
call link 1 , 0 , 0 , 0 , 30 , 0 , 0 , xyz , 0
call anim.human.walk angle , 30
call human 5 , rgb( 255 , 0 , 0 )
angle = angle + 5
wait
[quit]
print "Done."
close #m
end
function index( a , b , c )
index = a * 16 + b * 4 + c
end function
function rgb( r , g , b )
r = r and 255
g = g and 255
b = b and 255
rgb = r + g * 256 + b * 256 ^ 2
end function
sub setcolor kl
r = int( kl ) and 255
g = int( kl / 256 ) and 255
b = int( kl / 256 ^ 2 ) and 255
#m "color " ; r ; " " ; g ; " " ; b
end sub
sub matrix.x a , b , uit
for i = 0 to 3
for j = 0 to 3
m( index( uit , i , j ) ) = 0
for k = 0 to 3
m( index( uit , i , j ) ) = m( index( uit , i , j ) ) _
+ m( index( a , i , k ) ) * m( index( b , k , j ) )
next k
next j
next i
end sub
sub matrix.reeks uit , a , b , c , p
call matrix.x a , b , temp
call matrix.x temp , c , temp2
call matrix.x temp2 , trans , temp
call matrix.x temp , p , uit
end sub
sub matrix.copy a , uit
for i = 0 to 3
for j = 0 to 3
m( index( uit , i , j ) ) = m( index( a , i , j ) )
next j
next i
end sub
sub matrix.init
for i = 0 to 3
for j = 0 to 3
m( index( 0 , i , j ) ) = 0
next j
m( index( 0 , i , i ) ) = 1
next i
end sub
function pend( fase , amp )
pend = sin( rad( fase ) ) * amp
end function
sub skelet lim , x,y,z
' for setting the angles of a lim of a avartar
if lim < 0 or lim > 64 then exit sub
sk(lim,0) = x
sk(lim,1) = y
sk(lim,2) = z
end sub
sub child no , x , y , z , lim , ax , p
' for creating a new matrix for a avartar lim
' wil effect futur drawings
if lim < 0 or lim > 64 then exit sub
call link no,x,y,z,sk(lim,1),sk(lim,0),sk(lim,2),ax,p
end sub
sub link no , x , y , z , xz , yz , xy , ax , p
' for creating a new matrix
' wil effect future drawings
if no < 1 or no > 20 then exit sub
if p < 0 or p > 20 then exit sub
if p = no then exit sub
call matrix.init
call matrix.copy 0 , rotx
call matrix.copy 0 , roty
call matrix.copy 0 , rotz
call matrix.copy 0 , trans
m( index( rotx , 1 , 1 ) ) = cos( rad( yz ) )
m( index( rotx , 1 , 2 ) ) = sin( rad( yz ) )
m( index( rotx , 2 , 1 ) ) = 0-sin( rad( yz ) )
m( index( rotx , 2 , 2 ) ) = cos( rad( yz ) )
m( index( roty , 0 , 0 ) ) = cos( rad( xz ) )
m( index( roty , 0 , 2 ) ) = sin( rad( xz ) )
m( index( roty , 2 , 0 ) ) = 0-sin( rad( xz ) )
m( index( roty , 2 , 2 ) ) = cos( rad( xz ) )
m( index( rotz , 0 , 0 ) ) = cos( rad( xy ) )
m( index( rotz , 0 , 2 ) ) = sin( rad( xy ) )
m( index( rotz , 2 , 0 ) ) = 0-sin( rad( xy ) )
m( index( rotz , 2 , 2 ) ) = cos( rad( xy ) )
m( index( trans , 3 , 0 ) ) = x
m( index( trans , 3 , 1 ) ) = y
m( index( trans , 3 , 2 ) ) = z
select case ax
case xyz
call matrix.reeks no , rotx , roty , rotz , p
case xzy
call matrix.reeks no , rotx , rotz , roty , p
case yxz
call matrix.reeks no , roty , rotx , rotz , p
case yzx
call matrix.reeks no , roty , rotz , rotx , p
case zxy
call matrix.reeks no , rotz , rotx , roty , p
case zyx
call matrix.reeks no , rotz , roty , rotx , p
case else
call matrix.reeks no , rotx , roty , rotz , p
end select
number = no
end sub
function rad( deg )
rad = deg * pi / 180
end function
sub spot byref x , byref y , byref z
' from local to world coordinates
hx = m( index( number , 0 , 0 ) ) * x _
+ m( index( number , 1 , 0 ) ) * y _
+ m( index( number , 2 , 0 ) ) * z _
+ m( index( number , 3 , 0 ) )
hy = m( index( number , 0 , 1 ) ) * x _
+ m( index( number , 1 , 1 ) ) * y _
+ m( index( number , 2 , 1 ) ) * z _
+ m( index( number , 3 , 1 ) )
hz = m( index( number , 0 , 2 ) ) * x _
+ m( index( number , 1 , 2 ) ) * y _
+ m( index( number , 2 , 2 ) ) * z _
+ m( index( number , 3 , 2 ) )
x = hx
y = hy
z = hz
end sub
sub line3d x1,y1,z1 , x2,y2,z2 , thik , kl
'call spot x1,y1,z1
'call spot x2,y2,z2
hx = m( index( number , 0 , 0 ) ) * x1 _
+ m( index( number , 1 , 0 ) ) * y1 _
+ m( index( number , 2 , 0 ) ) * z1 _
+ m( index( number , 3 , 0 ) )
hy = m( index( number , 0 , 1 ) ) * x1 _
+ m( index( number , 1 , 1 ) ) * y1 _
+ m( index( number , 2 , 1 ) ) * z1 _
+ m( index( number , 3 , 1 ) )
hz = m( index( number , 0 , 2 ) ) * x1 _
+ m( index( number , 1 , 2 ) ) * y1 _
+ m( index( number , 2 , 2 ) ) * z1 _
+ m( index( number , 3 , 2 ) )
x1 = hx
y1 = hy
z1 = hz
hx = m( index( number , 0 , 0 ) ) * x2 _
+ m( index( number , 1 , 0 ) ) * y2 _
+ m( index( number , 2 , 0 ) ) * z2 _
+ m( index( number , 3 , 0 ) )
hy = m( index( number , 0 , 1 ) ) * x2 _
+ m( index( number , 1 , 1 ) ) * y2 _
+ m( index( number , 2 , 1 ) ) * z2 _
+ m( index( number , 3 , 1 ) )
hz = m( index( number , 0 , 2 ) ) * x2 _
+ m( index( number , 1 , 2 ) ) * y2 _
+ m( index( number , 2 , 2 ) ) * z2 _
+ m( index( number , 3 , 2 ) )
x2 = hx
y2 = hy
z2 = hz
if z1 < -900 or z2 < -900 then exit sub
xa = winx / 2 + x1 / ( z1 + 1000 ) * 1000
ya = winy / 2 - y1 / ( z1 + 1000 ) * 1000
xb = winx / 2 + x2 / ( z2 + 1000 ) * 1000
yb = winy / 2 - y2 / ( z2 + 1000 ) * 1000
call setcolor kl
#m "size " ; thik
#m "down"
#m "line " ; xa ; " " ; ya ; " " ; xb ; " " ; yb
#m "up"
end sub
sub cube mx,my,mz , dx,dy,dz , thik , kl
call line3d mx+dx,my+dy,mz+dz , mx-dx,my+dy,mz+dz , thik , kl
call line3d mx+dx,my+dy,mz-dz , mx-dx,my+dy,mz-dz , thik , kl
call line3d mx+dx,my-dy,mz+dz , mx-dx,my-dy,mz+dz , thik , kl
call line3d mx+dx,my-dy,mz-dz , mx-dx,my-dy,mz-dz , thik , kl
call line3d mx+dx,my+dy,mz+dz , mx+dx,my-dy,mz+dz , thik , kl
call line3d mx+dx,my+dy,mz-dz , mx+dx,my-dy,mz-dz , thik , kl
call line3d mx-dx,my+dy,mz+dz , mx-dx,my-dy,mz+dz , thik , kl
call line3d mx-dx,my+dy,mz-dz , mx-dx,my-dy,mz-dz , thik , kl
call line3d mx+dx,my+dy,mz+dz , mx+dx,my+dy,mz-dz , thik , kl
call line3d mx+dx,my-dy,mz+dz , mx+dx,my-dy,mz-dz , thik , kl
call line3d mx-dx,my+dy,mz+dz , mx-dx,my+dy,mz-dz , thik , kl
call line3d mx-dx,my-dy,mz+dz , mx-dx,my-dy,mz-dz , thik , kl
end sub
sub human thik , kl
' example avartar
no = number
call line3d 0,0,0 , 0,200,0 , thik , kl
call line3d -70,0,0 , 70,0,0, thik , kl
call line3d -90,200,0 , 90,200,0 , thik , kl
call child 2 , 0,210,0 , leftno + neck , xyz , no
call child 3 , 0,30,0 , rightno + neck , zyx , 2
call cube 0,0,0 , 30,30,30 , thik , kl
call child 2 , -90,200,0, rightno + arm , xzy , no
call line3d 0,0,0 , 0,-100,0 , thik , kl
call child 3 , 0,-100,0 , rightno + elbow , xyz , 2
call line3d 0,0,0 , 0,-100,0 , thik , kl
call child 4 , 0,-120,0 , rightno + wrist , yzx , 3
call cube 0,-10,0 , 3,10,10 , thik , kl
call child 2 , 90,200,0, leftno + arm , xzy , no
call line3d 0,0,0 , 0,-100,0 , thik , kl
call child 3 , 0,-100,0 , leftno + elbow , xyz , 2
call line3d 0,0,0 , 0,-100,0 , thik , kl
call child 4 , 0,-120,0 , leftno + wrist , yzx , 3
call cube 0,-10,0 , 3,10,10 , thik , kl
call child 2 , -70,0,0 , rightno + leg , yzx , no
call line3d 0,0,0 , 0,-100,0 , thik , kl
call child 3 , 0,-100,0 , rightno + knee , xyz , 2
call line3d 0,0,0 , 0,-100,0 , thik , kl
call child 4 , 0,-100,0 , rightno + enkle , xzy , 3
call line3d 0,0,0 , 0,0,-40 , thik , kl
call child 2 , 70,0,0 , leftno + leg , yzx , no
call line3d 0,0,0 , 0,-100,0 , thik , kl
call child 3 , 0,-100,0 , leftno + knee , xyz , 2
call line3d 0,0,0 , 0,-100,0 , thik , kl
call child 4 , 0,-100,0 , leftno + enkle , xzy , 3
call line3d 0,0,0 , 0,0,-40 , thik , kl
end sub
sub anim.human.walk fase , amp
' example animation
call skelet rightno + leg , pend( fase , amp ) , 0 , 0
call skelet rightno + knee , pend( fase - 90 , amp ) - amp , 0 , 0
call skelet leftno + leg , pend( fase + 180, amp ) , 0 , 0
call skelet leftno + knee , pend( fase + 90 , amp ) - amp , 0 , 0
call skelet rightno + arm , pend( fase + 180, amp ) , 0 , 0
call skelet rightno + elbow , abs( amp ) , 0 , 0
call skelet leftno + arm , pend( fase , amp ) , 0 , 0
call skelet leftno + elbow , abs( amp ) , 0 , 0
end sub