## Efektit

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Someday coder
Active Member
Posts: 106
Joined: Wed Jul 30, 2008 5:04 pm

### Re: Efektit

Peliin tuli väännettyä meteoriitteja ja räjähdyksiä,

Code: Select all

``````FrameLimit 45
SCREEN 600,400
Dim meteors(5,3)
Dim exp(30,3)

For i=0 To 1
meteors(i,0)=Rand(100,-300)
meteors(i,1)=Rand(0,-300)
meteors(i,2)=-45
meteors(i,3)=Rand(14,20)
Next i

Repeat

For i=0 To 1
x#=meteors(i,0)
y#=meteors(i,1)
a#=meteors(i,2)
s#=meteors(i,3)
If x# > 600 Or y# > 300+((s#-14)/6)*40 Then
If y# > 300+((s#-14)/6)*40 Then explosive(x#,y#,-a#,s#*2)
meteors(i,0)=Rand(100,-300)
meteors(i,1)=Rand(0,-300)
meteors(i,2)=-45
meteors(i,3)=Rand(14,20)
x#=meteors(i,0)
y#=meteors(i,1)
a#=meteors(i,2)
s#=meteors(i,3)
EndIf
x#=x#+Cos(a#)*s#
y#=y#-Sin(a#)*s#
x2#=x#+Cos(WrapAngle(a#-180))*(s#/2)
y2#=y#-Sin(WrapAngle(a#-180))*(s#/2)
x3#=x2#+Cos(WrapAngle(a#-180))*s#
y3#=y2#-Sin(WrapAngle(a#-180))*s#
Color cbred
Line x#,y#,x2#,y2#
Color cbyellow
Line x2#,y2#,x3#,y3#
If s# > 15 Then
Color cbred
Color cbyellow
EndIf
If s# > 17 Then
Color cbred
Color cbyellow
EndIf
meteors(i,0)=x#
meteors(i,1)=y#
Next i

For i=0 To 30
x#=exp(i,0)
y#=exp(i,1)
d#=exp(i,2)
p#=exp(i,3)
s#=p/85
x=x+Cos(d)*s#
y=y-Sin(d)*s#
x2#=x+Cos(d)*s#
y2#=y-Sin(d)*s#
d-10
Color s#/15*255,s#/15*255,s#/15*255
Line x,y,x2,y2
exp(i,0)=x2
exp(i,1)=y2
exp(i,3)=exp(i,3)/(1.5/s#+1)
Next i
Line 0,300,600,300
Color cbwhite
Text 10,370,"Magic shield productions"

DrawScreen
Forever

Function explosive(x#,y#,d#,p#)
For i=0 To 30
exp(i,0)=Rand(x-p/20+Cos(d)*Rand(0,p/10),x+p/20+Cos(d)*Rand(0,p/10))
exp(i,1)=Rand(y-p/2-Sin(d)*Rand(0,p),y+p/2-Sin(d)*Rand(0,p))
exp(i,2)=Rand(d-p*2,d+p)
exp(i,3)=Rand(p*3,p*p)
Next i
EndFunction
``````

DatsuniG
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

### Re: Efektit

Kämänen liekki-efekti:

Code: Select all

``````Const MAXPARTICLES = 150
Const PARTICLEMAXSIZE = 40

Global gEmitterAmount, gParticleAmount

Type FireEmitter
Field x#
Field y#
Field w#
Field duration
Field timerr
Field Amount
EndType

Type FireParticles
Field x#
Field y#
Field r#
Field g#
Field b#
Field size#
Field targ#
EndType

Repeat
If MouseHit(1) Then CreateFireEmitter(MouseX(),MouseY(),100,10000)
UpdateFireEmitters()
UpdateFireParticles()
DrawScreen
Forever

Function CreateFireEmitter(x#,y#,w#,duration)
neu.FireEmitter = New(FireEmitter)
neu\x = x
neu\y = y
neu\w = w
neu\duration = duration
neu\timerr = Timer()
gEmitterAmount + 1
EndFunction

Function UpdateFireEmitters()
For neu.FireEmitter = Each FireEmitter
If neu\amount < MAXPARTICLES / gEmitterAmount And gParticleAmount < MAXPARTICLES Then
uusi.FireParticles = New(FireParticles)
uusi\x = neu\x + Rnd(neu\w)
uusi\y = neu\y
uusi\r = 255
uusi\g = 255
uusi\b = 255
uusi\targ = neu\x + neu\w / 2
uusi\size = PARTICLEMAXSIZE
gParticleAmount + 1
EndIf
If Timer() - neu\timerr > neu\duration Then
Delete neu
gEmitterAmount - 1
EndIf
Next neu
EndFunction

Function UpdateFireParticles()
For uusi.FireParticles = Each FireParticles
uusi\y = uusi\y - 2
If uusi\x > uusi\targ Then uusi\x - 0.2 Else uusi\x + 0.2
uusi\g = Max(0,uusi\g - 2)
uusi\b = max(0,uusi\b - 5)
uusi\size - 0.4
Color uusi\r,uusi\g,uusi\b
Circle uusi\x,uusi\y,uusi\size
If (uusi\b = 0 And uusi\g = 0) Or uusi\x < 0 Or uusi\x > ScreenWidth() Or uusi\y < 0 Or uusi\y > ScreenHeight() Or uusi\size < 2 Then Delete uusi : gParticleAmount - 1
Next uusi
EndFunction
``````
Hengität nyt manuaalisesti.

koodaaja
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

### Re: Efektit

3D-systeemi edistyy. Valaistujen kartioiden sijaan tällä kertaa pientä matriisikikkailua. Jos rupeatte koodia tutkimaan niin havaitsette todennäköisesti muutamassakin kohdassa lyhenteen 'kgl', joka on ogl:stä suoraan apinoituna "koodaaja's graphic library". Ei tästä tosin ainakaan tällaisenaan vielä mitään kirjastoa saa aikaan, mutta ehkäpä joskus (todennäköisesti ei, seuraava coolbasic painaa niin nopeasti päälle että sillä kannattaa mieluummin alkaa sitten kehitellä)

Code: Select all

``````Const w = 400
Const h = 300
Const cop = 800 // w*2

SCREEN w*2, h*2

Type kgl_tris
Field x1
Field y1
Field x2
Field y2
Field x3
Field y3
Field r
Field g
Field b
EndType

Type kgl_matrix
Field a#
Field b#
Field c#
Field d#

Field e#
Field f#
Field g#
Field h#

Field i#
Field j#
Field k#
Field l#

Field m#
Field n#
Field o#
Field p#
EndType

Dim kgl_t_id(999)
Dim kgl_t_z(999) As Float
Global kgl_used_triangles%
Global kgl_curmatrix%
Global kgl_identity
kgl_used_triangles = 0

kgl_tmp_identity.kgl_matrix = New(kgl_matrix)
kgl_tmp_identity\a = 1:kgl_tmp_identity\b = 0:kgl_tmp_identity\c = 0:kgl_tmp_identity\d = 0
kgl_tmp_identity\e = 0:kgl_tmp_identity\f = 1:kgl_tmp_identity\g = 0:kgl_tmp_identity\h = 0
kgl_tmp_identity\i = 0:kgl_tmp_identity\j = 0:kgl_tmp_identity\k = 1:kgl_tmp_identity\l = 0
kgl_tmp_identity\m = 0:kgl_tmp_identity\n = 0:kgl_tmp_identity\o = 0:kgl_tmp_identity\p = 1

kgl_identity = ConvertToInteger(kgl_tmp_identity.kgl_matrix)

kgl_curmatrix = kgl_identity

Function kgl_setworldmatrix(newmatrix)
kgl_curmatrix = newmatrix
EndFunction

Function kgl_getrotation(ang#, axx#, axy#, axz#)

sina# = Sin(ang*.5)
qx# = axx#*sina#
qy# = axy#*sina#
qz# = axz#*sina#
qw# = Cos(ang*.5)

L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L

m.kgl_matrix = New(kgl_matrix)

m\a = 1-2*(qy*qy+z*z)
m\b = 2*(qx*qy-qz*qw)
m\c = 2*(qx*qz+qy*qw)
m\d = 0

m\e = 2*(qx*qy+qz*qw)
m\f = 1-2*(qx*qx+qz*qz)
m\g = 2*(qy*qz-qx*qw)
m\h = 0

m\i = 2*(qx*qz-qy*qw)
m\j = 2*(qy*qz+qx*qw)
m\k = 1-2*(qx*qx+qy*qy)
m\l = 0

m\m = 0
m\n = 0
m\o = 0
m\p = 1

Return ConvertToInteger(m)

EndFunction

Function kgl_gettranslation(x#, y#, z#)
m.kgl_matrix = New(kgl_matrix)
m\a=1:m\b=0:m\c=0:m\d=0
m\e=0:m\f=1:m\g=0:m\h=0
m\i=0:m\j=0:m\k=1:m\l=0
m\m=x:m\n=y:m\o=z:m\p=1
Return ConvertToInteger(m)
EndFunction

Function kgl_multiply_matrix(m1_id, m2_id)

m.kgl_matrix = New(kgl_matrix)
m1.kgl_matrix = ConvertToType(m1_id)
m2.kgl_matrix = ConvertToType(m2_id)

m\a = m1\a*m2\a + m1\b*m2\e + m1\c*m2\i + m1\d*m2\m
m\b = m1\a*m2\b + m1\b*m2\f + m1\c*m2\j + m1\d*m2\n
m\c = m1\a*m2\c + m1\b*m2\g + m1\c*m2\k + m1\d*m2\o
m\d = m1\a*m2\d + m1\b*m2\h + m1\c*m2\l + m1\d*m2\p

m\e = m1\e*m2\a + m1\f*m2\e + m1\g*m2\i + m1\h*m2\m
m\f = m1\e*m2\b + m1\f*m2\f + m1\g*m2\j + m1\h*m2\n
m\g = m1\e*m2\c + m1\f*m2\g + m1\g*m2\k + m1\h*m2\o
m\h = m1\e*m2\d + m1\f*m2\h + m1\g*m2\l + m1\h*m2\p

m\i = m1\i*m2\a + m1\j*m2\e + m1\k*m2\i + m1\l*m2\m
m\j = m1\i*m2\b + m1\j*m2\f + m1\k*m2\j + m1\l*m2\n
m\k = m1\i*m2\c + m1\j*m2\g + m1\k*m2\k + m1\l*m2\o
m\l = m1\i*m2\d + m1\j*m2\h + m1\k*m2\l + m1\l*m2\p

m\m = m1\m*m2\a + m1\n*m2\e + m1\o*m2\i + m1\p*m2\m
m\n = m1\m*m2\b + m1\n*m2\f + m1\o*m2\j + m1\p*m2\n
m\o = m1\m*m2\c + m1\n*m2\g + m1\o*m2\k + m1\p*m2\o
m\p = m1\m*m2\d + m1\n*m2\h + m1\o*m2\l + m1\p*m2\p

Return ConvertToInteger(m)
EndFunction

Function render()
kgl_used_triangles = kgl_used_triangles - 1
If(kgl_used_triangles >1) Then sort()
Lock
For i = 0 To kgl_used_triangles
t.kgl_tris = ConvertToType(kgl_t_id(i))
filltriangle(t\x1, t\y1, t\x2, t\y2, t\x3, t\y3, t\r, t\g, t\b)
Delete t
Next i
Unlock
kgl_used_triangles = 0
EndFunction

Function sort()
changes = 1
gap# = kgl_used_triangles
Repeat
gap = gap/1.247330950103979
If gap = 10 Or gap = 9
gap = 11
EndIf
If gap<=1 Then gap = 1
changes = 0
For i = 0 To (kgl_used_triangles-gap)
igap = i + gap
If (kgl_t_z(i)<kgl_t_z(igap)) Then
tempz# = kgl_t_z(i)
tempid% = kgl_t_id(i)
kgl_t_z(i) = kgl_t_z(igap)
kgl_t_id(i) = kgl_t_id(igap)
kgl_t_z(igap) = tempz#
kgl_t_id(igap) = tempid%
changes = 1
EndIf
Next i
Until changes = 0 And gap=1
EndFunction

Function filltriangle(x1#, y1#, x2#, y2#, x3#, y3#, r%, g%, b%)
Color r, g, b
If (y1>y2) Then
tmpy = y1
tmpx = x1
y1 = y2
x1 = x2
y2 = tmpy
x2 = tmpx
EndIf
If (y1>y3) Then
tmpy = y1
tmpx = x1
y1 = y3
x1 = x3
y3 = tmpy
x3 = tmpx
EndIf
If (y2>y3) Then
tmpy = y2
tmpx = x2
y2 = y3
x2 = x3
y3 = tmpy
x3 = tmpx
EndIf
If(y2=y1) Then y1-0.001
If(y3=y2) Then y3+0.001
slp1# = (x3-x1)/(y3-y1)
slp2# = (x2-x1)/(y2-y1)
slp3# = (x3-x2)/(y3-y2)
If(Int(y1)<Int(y2)) Then
For i = y1 To y2
Line x1+slp1*(i-y1), i, x2+slp2*(i-y2), i
Next i
EndIf
If(Int(y2)<Int(y3)) Then
For i = y2 To y3
Line x1+slp1*(i-y1), i, x3+slp3*(i-y3), i
Next i
EndIf
EndFunction

Function tri3D(x1#, y1#, z1#, x2#, y2#, z2#, x3#, y3#, z3#, r%, g%, b%, cull = 1)

m.kgl_matrix = ConvertToType(kgl_curmatrix)

nx1# = x1*m\a+y1*m\e+z1*m\i+m\m
ny1# = x1*m\b+y1*m\f+z1*m\j+m\n
nz1# = x1*m\c+y1*m\g+z1*m\k+m\o
x1 = nx1: y1 = ny1: z1 = nz1

nx2# = x2*m\a+y2*m\e+z2*m\i+m\m
ny2# = x2*m\b+y2*m\f+z2*m\j+m\n
nz2# = x2*m\c+y2*m\g+z2*m\k+m\o
x2 = nx2: y2 = ny2: z2 = nz2

nx3# = x3*m\a+y3*m\e+z3*m\i+m\m
ny3# = x3*m\b+y3*m\f+z3*m\j+m\n
nz3# = x3*m\c+y3*m\g+z3*m\k+m\o
x3 = nx3: y3 = ny3: z3 = nz3

If(z1<=1)Or(z2<=1)Or(z3<=1) Then Return 0
s1# = (1.0/z1#)*cop
s2# = (1.0/z2#)*cop
s3# = (1.0/z3#)*cop
t.kgl_tris = New(kgl_tris)
t\x1 = Int(s1*x1+w)
t\y1 = Int((-s1)*y1+h)
t\x2 = Int(s2*x2+w)
t\y2 = Int((-s2)*y2+h)
t\x3 = Int(s3*x3+w)
t\y3 = Int((-s3)*y3+h)
If (((t\x2-t\x1)*(t\y3-t\y1))-((t\x3-t\x1)*(t\y2-t\y1))<=0.0)And cull Then Delete t:Return 0
If (t\x1<0 And t\x2<0 And t\x3<0) Or (t\x1>2*w And t\x2>2*w And t\x3>2*w) Then Delete t:Return 0
t\r = r
t\g = g
t\b = b
kgl_t_id(kgl_used_triangles) = ConvertToInteger(t.kgl_tris)
kgl_t_z(kgl_used_triangles) = (z1# + z2# + z3#)/3.0
kgl_used_triangles = kgl_used_triangles + 1
EndFunction

Function drawcube(r, g, b)
tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, r, g, b)
tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, r, g, b)
tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, r, g, b)
tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, r, g, b)
tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, r, g, b)
tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, r, g, b)
tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction

Repeat

ang# = ang# - 1.0
For j = 0 To 3
kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(40*Cos(ang), 1.0, 0.0, 0.0), kgl_getrotation(j*90+ang, 0.0, 1.0, 0.0)), kgl_gettranslation(0, 0, 20) ))
For i = 0 To 4
kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(20*Sin(ang+90), 0, 1, 0), kgl_gettranslation(0, 0, 1.5+.5*Sin(ang*2))), kgl_curmatrix))
col = 50+i*20
drawcube(col, col, col)
Next i
Next j

render()

Color 255, 255, 255
Text 10, 10, Str(FPS())

DrawScreen

Forever
``````

Ruuttu
Devoted Member
Posts: 687
Joined: Thu Aug 30, 2007 5:11 pm
Location: Finland, Sipoo

### Re: Efektit

Wow, jopas pyöri hyvin - FPS 60. Hienosti animoitukin vielä . Tästä voi kuule tulla jotain suurta ja mahtavaa...tai sitten ei. CBC, folks.

WOW......

### Re: Efektit

koodaaja wrote:3D-systeemi edistyy. Valaistujen kartioiden sijaan tällä kertaa pientä matriisikikkailua. Jos rupeatte koodia tutkimaan niin havaitsette todennäköisesti muutamassakin kohdassa lyhenteen 'kgl', joka on ogl:stä suoraan apinoituna "koodaaja's graphic library". Ei tästä tosin ainakaan tällaisenaan vielä mitään kirjastoa saa aikaan, mutta ehkäpä joskus (todennäköisesti ei, seuraava coolbasic painaa niin nopeasti päälle että sillä kannattaa mieluummin alkaa sitten kehitellä)

Code: Select all

``````Const w = 400
Const h = 300
Const cop = 800 // w*2

SCREEN w*2, h*2

Type kgl_tris
Field x1
Field y1
Field x2
Field y2
Field x3
Field y3
Field r
Field g
Field b
EndType

Type kgl_matrix
Field a#
Field b#
Field c#
Field d#

Field e#
Field f#
Field g#
Field h#

Field i#
Field j#
Field k#
Field l#

Field m#
Field n#
Field o#
Field p#
EndType

Dim kgl_t_id(999)
Dim kgl_t_z(999) As Float
Global kgl_used_triangles%
Global kgl_curmatrix%
Global kgl_identity
kgl_used_triangles = 0

kgl_tmp_identity.kgl_matrix = New(kgl_matrix)
kgl_tmp_identity\a = 1:kgl_tmp_identity\b = 0:kgl_tmp_identity\c = 0:kgl_tmp_identity\d = 0
kgl_tmp_identity\e = 0:kgl_tmp_identity\f = 1:kgl_tmp_identity\g = 0:kgl_tmp_identity\h = 0
kgl_tmp_identity\i = 0:kgl_tmp_identity\j = 0:kgl_tmp_identity\k = 1:kgl_tmp_identity\l = 0
kgl_tmp_identity\m = 0:kgl_tmp_identity\n = 0:kgl_tmp_identity\o = 0:kgl_tmp_identity\p = 1

kgl_identity = ConvertToInteger(kgl_tmp_identity.kgl_matrix)

kgl_curmatrix = kgl_identity

Function kgl_setworldmatrix(newmatrix)
kgl_curmatrix = newmatrix
EndFunction

Function kgl_getrotation(ang#, axx#, axy#, axz#)

sina# = Sin(ang*.5)
qx# = axx#*sina#
qy# = axy#*sina#
qz# = axz#*sina#
qw# = Cos(ang*.5)

L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L

m.kgl_matrix = New(kgl_matrix)

m\a = 1-2*(qy*qy+z*z)
m\b = 2*(qx*qy-qz*qw)
m\c = 2*(qx*qz+qy*qw)
m\d = 0

m\e = 2*(qx*qy+qz*qw)
m\f = 1-2*(qx*qx+qz*qz)
m\g = 2*(qy*qz-qx*qw)
m\h = 0

m\i = 2*(qx*qz-qy*qw)
m\j = 2*(qy*qz+qx*qw)
m\k = 1-2*(qx*qx+qy*qy)
m\l = 0

m\m = 0
m\n = 0
m\o = 0
m\p = 1

Return ConvertToInteger(m)

EndFunction

Function kgl_gettranslation(x#, y#, z#)
m.kgl_matrix = New(kgl_matrix)
m\a=1:m\b=0:m\c=0:m\d=0
m\e=0:m\f=1:m\g=0:m\h=0
m\i=0:m\j=0:m\k=1:m\l=0
m\m=x:m\n=y:m\o=z:m\p=1
Return ConvertToInteger(m)
EndFunction

Function kgl_multiply_matrix(m1_id, m2_id)

m.kgl_matrix = New(kgl_matrix)
m1.kgl_matrix = ConvertToType(m1_id)
m2.kgl_matrix = ConvertToType(m2_id)

m\a = m1\a*m2\a + m1\b*m2\e + m1\c*m2\i + m1\d*m2\m
m\b = m1\a*m2\b + m1\b*m2\f + m1\c*m2\j + m1\d*m2\n
m\c = m1\a*m2\c + m1\b*m2\g + m1\c*m2\k + m1\d*m2\o
m\d = m1\a*m2\d + m1\b*m2\h + m1\c*m2\l + m1\d*m2\p

m\e = m1\e*m2\a + m1\f*m2\e + m1\g*m2\i + m1\h*m2\m
m\f = m1\e*m2\b + m1\f*m2\f + m1\g*m2\j + m1\h*m2\n
m\g = m1\e*m2\c + m1\f*m2\g + m1\g*m2\k + m1\h*m2\o
m\h = m1\e*m2\d + m1\f*m2\h + m1\g*m2\l + m1\h*m2\p

m\i = m1\i*m2\a + m1\j*m2\e + m1\k*m2\i + m1\l*m2\m
m\j = m1\i*m2\b + m1\j*m2\f + m1\k*m2\j + m1\l*m2\n
m\k = m1\i*m2\c + m1\j*m2\g + m1\k*m2\k + m1\l*m2\o
m\l = m1\i*m2\d + m1\j*m2\h + m1\k*m2\l + m1\l*m2\p

m\m = m1\m*m2\a + m1\n*m2\e + m1\o*m2\i + m1\p*m2\m
m\n = m1\m*m2\b + m1\n*m2\f + m1\o*m2\j + m1\p*m2\n
m\o = m1\m*m2\c + m1\n*m2\g + m1\o*m2\k + m1\p*m2\o
m\p = m1\m*m2\d + m1\n*m2\h + m1\o*m2\l + m1\p*m2\p

Return ConvertToInteger(m)
EndFunction

Function render()
kgl_used_triangles = kgl_used_triangles - 1
If(kgl_used_triangles >1) Then sort()
Lock
For i = 0 To kgl_used_triangles
t.kgl_tris = ConvertToType(kgl_t_id(i))
filltriangle(t\x1, t\y1, t\x2, t\y2, t\x3, t\y3, t\r, t\g, t\b)
Delete t
Next i
Unlock
kgl_used_triangles = 0
EndFunction

Function sort()
changes = 1
gap# = kgl_used_triangles
Repeat
gap = gap/1.247330950103979
If gap = 10 Or gap = 9
gap = 11
EndIf
If gap<=1 Then gap = 1
changes = 0
For i = 0 To (kgl_used_triangles-gap)
igap = i + gap
If (kgl_t_z(i)<kgl_t_z(igap)) Then
tempz# = kgl_t_z(i)
tempid% = kgl_t_id(i)
kgl_t_z(i) = kgl_t_z(igap)
kgl_t_id(i) = kgl_t_id(igap)
kgl_t_z(igap) = tempz#
kgl_t_id(igap) = tempid%
changes = 1
EndIf
Next i
Until changes = 0 And gap=1
EndFunction

Function filltriangle(x1#, y1#, x2#, y2#, x3#, y3#, r%, g%, b%)
Color r, g, b
If (y1>y2) Then
tmpy = y1
tmpx = x1
y1 = y2
x1 = x2
y2 = tmpy
x2 = tmpx
EndIf
If (y1>y3) Then
tmpy = y1
tmpx = x1
y1 = y3
x1 = x3
y3 = tmpy
x3 = tmpx
EndIf
If (y2>y3) Then
tmpy = y2
tmpx = x2
y2 = y3
x2 = x3
y3 = tmpy
x3 = tmpx
EndIf
If(y2=y1) Then y1-0.001
If(y3=y2) Then y3+0.001
slp1# = (x3-x1)/(y3-y1)
slp2# = (x2-x1)/(y2-y1)
slp3# = (x3-x2)/(y3-y2)
If(Int(y1)<Int(y2)) Then
For i = y1 To y2
Line x1+slp1*(i-y1), i, x2+slp2*(i-y2), i
Next i
EndIf
If(Int(y2)<Int(y3)) Then
For i = y2 To y3
Line x1+slp1*(i-y1), i, x3+slp3*(i-y3), i
Next i
EndIf
EndFunction

Function tri3D(x1#, y1#, z1#, x2#, y2#, z2#, x3#, y3#, z3#, r%, g%, b%, cull = 1)

m.kgl_matrix = ConvertToType(kgl_curmatrix)

nx1# = x1*m\a+y1*m\e+z1*m\i+m\m
ny1# = x1*m\b+y1*m\f+z1*m\j+m\n
nz1# = x1*m\c+y1*m\g+z1*m\k+m\o
x1 = nx1: y1 = ny1: z1 = nz1

nx2# = x2*m\a+y2*m\e+z2*m\i+m\m
ny2# = x2*m\b+y2*m\f+z2*m\j+m\n
nz2# = x2*m\c+y2*m\g+z2*m\k+m\o
x2 = nx2: y2 = ny2: z2 = nz2

nx3# = x3*m\a+y3*m\e+z3*m\i+m\m
ny3# = x3*m\b+y3*m\f+z3*m\j+m\n
nz3# = x3*m\c+y3*m\g+z3*m\k+m\o
x3 = nx3: y3 = ny3: z3 = nz3

If(z1<=1)Or(z2<=1)Or(z3<=1) Then Return 0
s1# = (1.0/z1#)*cop
s2# = (1.0/z2#)*cop
s3# = (1.0/z3#)*cop
t.kgl_tris = New(kgl_tris)
t\x1 = Int(s1*x1+w)
t\y1 = Int((-s1)*y1+h)
t\x2 = Int(s2*x2+w)
t\y2 = Int((-s2)*y2+h)
t\x3 = Int(s3*x3+w)
t\y3 = Int((-s3)*y3+h)
If (((t\x2-t\x1)*(t\y3-t\y1))-((t\x3-t\x1)*(t\y2-t\y1))<=0.0)And cull Then Delete t:Return 0
If (t\x1<0 And t\x2<0 And t\x3<0) Or (t\x1>2*w And t\x2>2*w And t\x3>2*w) Then Delete t:Return 0
t\r = r
t\g = g
t\b = b
kgl_t_id(kgl_used_triangles) = ConvertToInteger(t.kgl_tris)
kgl_t_z(kgl_used_triangles) = (z1# + z2# + z3#)/3.0
kgl_used_triangles = kgl_used_triangles + 1
EndFunction

Function drawcube(r, g, b)
tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, r, g, b)
tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, r, g, b)
tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, r, g, b)
tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, r, g, b)
tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, r, g, b)
tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, r, g, b)
tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction

Repeat

ang# = ang# - 1.0
For j = 0 To 3
kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(40*Cos(ang), 1.0, 0.0, 0.0), kgl_getrotation(j*90+ang, 0.0, 1.0, 0.0)), kgl_gettranslation(0, 0, 20) ))
For i = 0 To 4
kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(20*Sin(ang+90), 0, 1, 0), kgl_gettranslation(0, 0, 1.5+.5*Sin(ang*2))), kgl_curmatrix))
col = 50+i*20
drawcube(col, col, col)
Next i
Next j

render()

Color 255, 255, 255
Text 10, 10, Str(FPS())

DrawScreen

Forever
``````
Wow, Voitko tehdä esimerkin, jossa on neliö jota voi liikutttaa nuolilla.

JATothrim
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

### Re: Efektit

koodaaja wrote:3D-systeemi edistyy. Valaistujen kartioiden sijaan tällä kertaa pientä matriisikikkailua. Jos rupeatte koodia tutkimaan niin havaitsette todennäköisesti muutamassakin kohdassa lyhenteen 'kgl', joka on ogl:stä suoraan apinoituna "koodaaja's graphic library". Ei tästä tosin ainakaan tällaisenaan vielä mitään kirjastoa saa aikaan, mutta ehkäpä joskus (todennäköisesti ei, seuraava coolbasic painaa niin nopeasti päälle että sillä kannattaa mieluummin alkaa sitten kehitellä)

Code: Select all

``````... vau. matriiseja...
``````
Hieno 3D-moottorin alku! (Upeaa grafiikkaa) Muistipaloilla saisi kenties vieläkin enemmän nopeutta irti, kun objekti käännetään kokonaisuudessaan mahdollisiman nopeasti piirrettäväksi. (vähän kuin glLists + glCompile) Silmiin pisti hieman kuution piirtotapa: uusi instanssi luodaan ja poistetaan joka kierroksella?
-On selkeästi impulsiivinen koodaaja joka...

Pate5
Artist
Posts: 551
Joined: Tue Aug 28, 2007 4:53 pm
Location: Vantaa

### Re: Efektit

koodaaja wrote:3D-systeemi edistyy. Valaistujen kartioiden sijaan tällä kertaa pientä matriisikikkailua. Jos rupeatte koodia tutkimaan niin havaitsette todennäköisesti muutamassakin kohdassa lyhenteen 'kgl', joka on ogl:stä suoraan apinoituna "koodaaja's graphic library". Ei tästä tosin ainakaan tällaisenaan vielä mitään kirjastoa saa aikaan, mutta ehkäpä joskus (todennäköisesti ei, seuraava coolbasic painaa niin nopeasti päälle että sillä kannattaa mieluummin alkaa sitten kehitellä)

Code: Select all

``````Const w = 400
Const h = 300
Const cop = 800 // w*2

SCREEN w*2, h*2

Type kgl_tris
Field x1
Field y1
Field x2
Field y2
Field x3
Field y3
Field r
Field g
Field b
EndType

Type kgl_matrix
Field a#
Field b#
Field c#
Field d#

Field e#
Field f#
Field g#
Field h#

Field i#
Field j#
Field k#
Field l#

Field m#
Field n#
Field o#
Field p#
EndType

Dim kgl_t_id(999)
Dim kgl_t_z(999) As Float
Global kgl_used_triangles%
Global kgl_curmatrix%
Global kgl_identity
kgl_used_triangles = 0

kgl_tmp_identity.kgl_matrix = New(kgl_matrix)
kgl_tmp_identity\a = 1:kgl_tmp_identity\b = 0:kgl_tmp_identity\c = 0:kgl_tmp_identity\d = 0
kgl_tmp_identity\e = 0:kgl_tmp_identity\f = 1:kgl_tmp_identity\g = 0:kgl_tmp_identity\h = 0
kgl_tmp_identity\i = 0:kgl_tmp_identity\j = 0:kgl_tmp_identity\k = 1:kgl_tmp_identity\l = 0
kgl_tmp_identity\m = 0:kgl_tmp_identity\n = 0:kgl_tmp_identity\o = 0:kgl_tmp_identity\p = 1

kgl_identity = ConvertToInteger(kgl_tmp_identity.kgl_matrix)

kgl_curmatrix = kgl_identity

Function kgl_setworldmatrix(newmatrix)
kgl_curmatrix = newmatrix
EndFunction

Function kgl_getrotation(ang#, axx#, axy#, axz#)

sina# = Sin(ang*.5)
qx# = axx#*sina#
qy# = axy#*sina#
qz# = axz#*sina#
qw# = Cos(ang*.5)

L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L

m.kgl_matrix = New(kgl_matrix)

m\a = 1-2*(qy*qy+z*z)
m\b = 2*(qx*qy-qz*qw)
m\c = 2*(qx*qz+qy*qw)
m\d = 0

m\e = 2*(qx*qy+qz*qw)
m\f = 1-2*(qx*qx+qz*qz)
m\g = 2*(qy*qz-qx*qw)
m\h = 0

m\i = 2*(qx*qz-qy*qw)
m\j = 2*(qy*qz+qx*qw)
m\k = 1-2*(qx*qx+qy*qy)
m\l = 0

m\m = 0
m\n = 0
m\o = 0
m\p = 1

Return ConvertToInteger(m)

EndFunction

Function kgl_gettranslation(x#, y#, z#)
m.kgl_matrix = New(kgl_matrix)
m\a=1:m\b=0:m\c=0:m\d=0
m\e=0:m\f=1:m\g=0:m\h=0
m\i=0:m\j=0:m\k=1:m\l=0
m\m=x:m\n=y:m\o=z:m\p=1
Return ConvertToInteger(m)
EndFunction

Function kgl_multiply_matrix(m1_id, m2_id)

m.kgl_matrix = New(kgl_matrix)
m1.kgl_matrix = ConvertToType(m1_id)
m2.kgl_matrix = ConvertToType(m2_id)

m\a = m1\a*m2\a + m1\b*m2\e + m1\c*m2\i + m1\d*m2\m
m\b = m1\a*m2\b + m1\b*m2\f + m1\c*m2\j + m1\d*m2\n
m\c = m1\a*m2\c + m1\b*m2\g + m1\c*m2\k + m1\d*m2\o
m\d = m1\a*m2\d + m1\b*m2\h + m1\c*m2\l + m1\d*m2\p

m\e = m1\e*m2\a + m1\f*m2\e + m1\g*m2\i + m1\h*m2\m
m\f = m1\e*m2\b + m1\f*m2\f + m1\g*m2\j + m1\h*m2\n
m\g = m1\e*m2\c + m1\f*m2\g + m1\g*m2\k + m1\h*m2\o
m\h = m1\e*m2\d + m1\f*m2\h + m1\g*m2\l + m1\h*m2\p

m\i = m1\i*m2\a + m1\j*m2\e + m1\k*m2\i + m1\l*m2\m
m\j = m1\i*m2\b + m1\j*m2\f + m1\k*m2\j + m1\l*m2\n
m\k = m1\i*m2\c + m1\j*m2\g + m1\k*m2\k + m1\l*m2\o
m\l = m1\i*m2\d + m1\j*m2\h + m1\k*m2\l + m1\l*m2\p

m\m = m1\m*m2\a + m1\n*m2\e + m1\o*m2\i + m1\p*m2\m
m\n = m1\m*m2\b + m1\n*m2\f + m1\o*m2\j + m1\p*m2\n
m\o = m1\m*m2\c + m1\n*m2\g + m1\o*m2\k + m1\p*m2\o
m\p = m1\m*m2\d + m1\n*m2\h + m1\o*m2\l + m1\p*m2\p

Return ConvertToInteger(m)
EndFunction

Function render()
kgl_used_triangles = kgl_used_triangles - 1
If(kgl_used_triangles >1) Then sort()
Lock
For i = 0 To kgl_used_triangles
t.kgl_tris = ConvertToType(kgl_t_id(i))
filltriangle(t\x1, t\y1, t\x2, t\y2, t\x3, t\y3, t\r, t\g, t\b)
Delete t
Next i
Unlock
kgl_used_triangles = 0
EndFunction

Function sort()
changes = 1
gap# = kgl_used_triangles
Repeat
gap = gap/1.247330950103979
If gap = 10 Or gap = 9
gap = 11
EndIf
If gap<=1 Then gap = 1
changes = 0
For i = 0 To (kgl_used_triangles-gap)
igap = i + gap
If (kgl_t_z(i)<kgl_t_z(igap)) Then
tempz# = kgl_t_z(i)
tempid% = kgl_t_id(i)
kgl_t_z(i) = kgl_t_z(igap)
kgl_t_id(i) = kgl_t_id(igap)
kgl_t_z(igap) = tempz#
kgl_t_id(igap) = tempid%
changes = 1
EndIf
Next i
Until changes = 0 And gap=1
EndFunction

Function filltriangle(x1#, y1#, x2#, y2#, x3#, y3#, r%, g%, b%)
Color r, g, b
If (y1>y2) Then
tmpy = y1
tmpx = x1
y1 = y2
x1 = x2
y2 = tmpy
x2 = tmpx
EndIf
If (y1>y3) Then
tmpy = y1
tmpx = x1
y1 = y3
x1 = x3
y3 = tmpy
x3 = tmpx
EndIf
If (y2>y3) Then
tmpy = y2
tmpx = x2
y2 = y3
x2 = x3
y3 = tmpy
x3 = tmpx
EndIf
If(y2=y1) Then y1-0.001
If(y3=y2) Then y3+0.001
slp1# = (x3-x1)/(y3-y1)
slp2# = (x2-x1)/(y2-y1)
slp3# = (x3-x2)/(y3-y2)
If(Int(y1)<Int(y2)) Then
For i = y1 To y2
Line x1+slp1*(i-y1), i, x2+slp2*(i-y2), i
Next i
EndIf
If(Int(y2)<Int(y3)) Then
For i = y2 To y3
Line x1+slp1*(i-y1), i, x3+slp3*(i-y3), i
Next i
EndIf
EndFunction

Function tri3D(x1#, y1#, z1#, x2#, y2#, z2#, x3#, y3#, z3#, r%, g%, b%, cull = 1)

m.kgl_matrix = ConvertToType(kgl_curmatrix)

nx1# = x1*m\a+y1*m\e+z1*m\i+m\m
ny1# = x1*m\b+y1*m\f+z1*m\j+m\n
nz1# = x1*m\c+y1*m\g+z1*m\k+m\o
x1 = nx1: y1 = ny1: z1 = nz1

nx2# = x2*m\a+y2*m\e+z2*m\i+m\m
ny2# = x2*m\b+y2*m\f+z2*m\j+m\n
nz2# = x2*m\c+y2*m\g+z2*m\k+m\o
x2 = nx2: y2 = ny2: z2 = nz2

nx3# = x3*m\a+y3*m\e+z3*m\i+m\m
ny3# = x3*m\b+y3*m\f+z3*m\j+m\n
nz3# = x3*m\c+y3*m\g+z3*m\k+m\o
x3 = nx3: y3 = ny3: z3 = nz3

If(z1<=1)Or(z2<=1)Or(z3<=1) Then Return 0
s1# = (1.0/z1#)*cop
s2# = (1.0/z2#)*cop
s3# = (1.0/z3#)*cop
t.kgl_tris = New(kgl_tris)
t\x1 = Int(s1*x1+w)
t\y1 = Int((-s1)*y1+h)
t\x2 = Int(s2*x2+w)
t\y2 = Int((-s2)*y2+h)
t\x3 = Int(s3*x3+w)
t\y3 = Int((-s3)*y3+h)
If (((t\x2-t\x1)*(t\y3-t\y1))-((t\x3-t\x1)*(t\y2-t\y1))<=0.0)And cull Then Delete t:Return 0
If (t\x1<0 And t\x2<0 And t\x3<0) Or (t\x1>2*w And t\x2>2*w And t\x3>2*w) Then Delete t:Return 0
t\r = r
t\g = g
t\b = b
kgl_t_id(kgl_used_triangles) = ConvertToInteger(t.kgl_tris)
kgl_t_z(kgl_used_triangles) = (z1# + z2# + z3#)/3.0
kgl_used_triangles = kgl_used_triangles + 1
EndFunction

Function drawcube(r, g, b)
tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, r, g, b)
tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, r, g, b)
tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, r, g, b)
tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, r, g, b)
tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, r, g, b)
tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, r, g, b)
tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction

Repeat

ang# = ang# - 1.0
For j = 0 To 3
kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(40*Cos(ang), 1.0, 0.0, 0.0), kgl_getrotation(j*90+ang, 0.0, 1.0, 0.0)), kgl_gettranslation(0, 0, 20) ))
For i = 0 To 4
kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(20*Sin(ang+90), 0, 1, 0), kgl_gettranslation(0, 0, 1.5+.5*Sin(ang*2))), kgl_curmatrix))
col = 50+i*20
drawcube(col, col, col)
Next i
Next j

render()

Color 255, 255, 255
Text 10, 10, Str(FPS())

DrawScreen

Forever
``````

Mahtavaa työtä! Uskomattoman hieno, ja pyörii hyvällä FPS:llä(n. 30-40)

Kuutioihin voisi varmaan lisätä vähän enemmän kolmiulotteisuuden tuntua värjäämällä eri sivut hiukan eri värisiksi? Tähän tyyliin:

Code: Select all

``````Function drawcube(r, g, b)
tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5,Min(r+10, 255), Min(g+10, 255),  Min(b+10, 255))
tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, Min(r+10, 255), Min(g+10, 255),  Min(b+10, 255))
tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, Min(r+20, 255), Min(g+20, 255),  Min(b+20, 255))
tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, Min(r+20, 255), Min(g+20, 255),  Min(b+20, 255))
tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, Min(r+10, 255), Min(g+10, 255),  Min(b+10, 255))
tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, Min(r+10, 255), Min(g+10, 255),  Min(b+10, 255))
tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, Max(r-10, 0), Max(g-10, 0),  Max(b-10, 0))
tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, Max(r-10, 0), Max(g-10, 0),  Max(b-10, 0))
tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction``````
Täysi feikkihän tuo olisi, mutta näin kuutiot eivät näytä pyöreäkulmaisilta.
CoolBasic henkilökuntaa
Graafikko

MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

### Re: Efektit

Ei muutakuin teksturoimaan Aavesoturin GL:ä, niin ei veisi CB:n piirtokomennot tehoja koneelta.
Solar Eclipse
We're in a simulation, and God is trying to debug us.

koodaaja
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

### Re: Efektit

@Jatothrim: Juu, optimointia on vielä tehtävissä paljonkin, mikäli haluaa rutistaa ne viimeiset FPS:t irti. Olennaisinta olisi tallennella matriisien välivaiheita vähän enemmän kuin nyt teen, laskemisosuus pienenisi huomattavasti. Kolmioiden uudelleenluonti joka framella on siinä mielessä kiva ettei niistä tarvitse funktioita käytettäessä pitää mitään lukua, toimii samaan tapaan kuin piirtokomennot. Ja pullonkaula ei todellakaan ole sorttaus tai tyypin jäsenten luonti ja poistelu, kyllä se trifill vie ehdottomasti eniten aikaa vaikka lukittuna piirtääkin.

@Pate5, kyllä vaan, tuo näyttää jo huomattavasti paremmalta (: tietysti ne voisi laskea ihan pintojen normaaleista kuten olin aiemmassa kartiosysteemissä tehnyt, voisin kohta väsäillä sellaisen version.

EDIT:tässäpä tätä.

Code: Select all

``````Const w = 400
Const h = 300
Const cop = 800 // w*2

SCREEN w*2, h*2

Global ldirx As Float
Global ldiry As Float
Global ldirz As Float

ldirx=-1.0
ldiry=2.0
ldirz=-4.0

ldirL# = Sqrt(ldirx*ldirx+ldiry*ldiry+ldirz*ldirz)

ldirx = ldirx/ldirL#
ldiry = ldiry/ldirL#
ldirz = ldirz/ldirL#

Type kgl_tris
Field x1
Field y1
Field x2
Field y2
Field x3
Field y3
Field r
Field g
Field b
EndType

Type kgl_matrix
Field a#
Field b#
Field c#
Field d#

Field e#
Field f#
Field g#
Field h#

Field i#
Field j#
Field k#
Field l#

Field m#
Field n#
Field o#
Field p#
EndType

Dim kgl_t_id(999)
Dim kgl_t_z(999) As Float
Global kgl_used_triangles%
Global kgl_curmatrix%
Global kgl_identity
kgl_used_triangles = 0

kgl_tmp_identity.kgl_matrix = New(kgl_matrix)
kgl_tmp_identity\a = 1:kgl_tmp_identity\b = 0:kgl_tmp_identity\c = 0:kgl_tmp_identity\d = 0
kgl_tmp_identity\e = 0:kgl_tmp_identity\f = 1:kgl_tmp_identity\g = 0:kgl_tmp_identity\h = 0
kgl_tmp_identity\i = 0:kgl_tmp_identity\j = 0:kgl_tmp_identity\k = 1:kgl_tmp_identity\l = 0
kgl_tmp_identity\m = 0:kgl_tmp_identity\n = 0:kgl_tmp_identity\o = 0:kgl_tmp_identity\p = 1

kgl_identity = ConvertToInteger(kgl_tmp_identity.kgl_matrix)

kgl_curmatrix = kgl_identity

Function kgl_setworldmatrix(newmatrix)
kgl_curmatrix = newmatrix
EndFunction

Function kgl_getrotation(ang#, axx#, axy#, axz#)

sina# = Sin(ang*.5)
qx# = axx#*sina#
qy# = axy#*sina#
qz# = axz#*sina#
qw# = Cos(ang*.5)

L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L

m.kgl_matrix = New(kgl_matrix)

m\a = 1-2*(qy*qy+z*z)
m\b = 2*(qx*qy-qz*qw)
m\c = 2*(qx*qz+qy*qw)
m\d = 0

m\e = 2*(qx*qy+qz*qw)
m\f = 1-2*(qx*qx+qz*qz)
m\g = 2*(qy*qz-qx*qw)
m\h = 0

m\i = 2*(qx*qz-qy*qw)
m\j = 2*(qy*qz+qx*qw)
m\k = 1-2*(qx*qx+qy*qy)
m\l = 0

m\m = 0
m\n = 0
m\o = 0
m\p = 1

Return ConvertToInteger(m)

EndFunction

Function kgl_gettranslation(x#, y#, z#)
m.kgl_matrix = New(kgl_matrix)
m\a=1:m\b=0:m\c=0:m\d=0
m\e=0:m\f=1:m\g=0:m\h=0
m\i=0:m\j=0:m\k=1:m\l=0
m\m=x:m\n=y:m\o=z:m\p=1
Return ConvertToInteger(m)
EndFunction

Function kgl_multiply_matrix(m1_id, m2_id)

m.kgl_matrix = New(kgl_matrix)
m1.kgl_matrix = ConvertToType(m1_id)
m2.kgl_matrix = ConvertToType(m2_id)

m\a = m1\a*m2\a + m1\b*m2\e + m1\c*m2\i + m1\d*m2\m
m\b = m1\a*m2\b + m1\b*m2\f + m1\c*m2\j + m1\d*m2\n
m\c = m1\a*m2\c + m1\b*m2\g + m1\c*m2\k + m1\d*m2\o
m\d = m1\a*m2\d + m1\b*m2\h + m1\c*m2\l + m1\d*m2\p

m\e = m1\e*m2\a + m1\f*m2\e + m1\g*m2\i + m1\h*m2\m
m\f = m1\e*m2\b + m1\f*m2\f + m1\g*m2\j + m1\h*m2\n
m\g = m1\e*m2\c + m1\f*m2\g + m1\g*m2\k + m1\h*m2\o
m\h = m1\e*m2\d + m1\f*m2\h + m1\g*m2\l + m1\h*m2\p

m\i = m1\i*m2\a + m1\j*m2\e + m1\k*m2\i + m1\l*m2\m
m\j = m1\i*m2\b + m1\j*m2\f + m1\k*m2\j + m1\l*m2\n
m\k = m1\i*m2\c + m1\j*m2\g + m1\k*m2\k + m1\l*m2\o
m\l = m1\i*m2\d + m1\j*m2\h + m1\k*m2\l + m1\l*m2\p

m\m = m1\m*m2\a + m1\n*m2\e + m1\o*m2\i + m1\p*m2\m
m\n = m1\m*m2\b + m1\n*m2\f + m1\o*m2\j + m1\p*m2\n
m\o = m1\m*m2\c + m1\n*m2\g + m1\o*m2\k + m1\p*m2\o
m\p = m1\m*m2\d + m1\n*m2\h + m1\o*m2\l + m1\p*m2\p

Return ConvertToInteger(m)
EndFunction

Function render()
kgl_used_triangles = kgl_used_triangles - 1
If(kgl_used_triangles >1) Then sort()
Lock
For i = 0 To kgl_used_triangles
t.kgl_tris = ConvertToType(kgl_t_id(i))
filltriangle(t\x1, t\y1, t\x2, t\y2, t\x3, t\y3, t\r, t\g, t\b)
Delete t
Next i
Unlock
kgl_used_triangles = 0
EndFunction

Function sort()
changes = 1
gap# = kgl_used_triangles
Repeat
gap = gap/1.247330950103979
If gap = 10 Or gap = 9
gap = 11
EndIf
If gap<=1 Then gap = 1
changes = 0
For i = 0 To (kgl_used_triangles-gap)
igap = i + gap
If (kgl_t_z(i)<kgl_t_z(igap)) Then
tempz# = kgl_t_z(i)
tempid% = kgl_t_id(i)
kgl_t_z(i) = kgl_t_z(igap)
kgl_t_id(i) = kgl_t_id(igap)
kgl_t_z(igap) = tempz#
kgl_t_id(igap) = tempid%
changes = 1
EndIf
Next i
Until changes = 0 And gap=1
EndFunction

Function filltriangle(x1#, y1#, x2#, y2#, x3#, y3#, r%, g%, b%)
Color r, g, b
If (y1>y2) Then
tmpy = y1
tmpx = x1
y1 = y2
x1 = x2
y2 = tmpy
x2 = tmpx
EndIf
If (y1>y3) Then
tmpy = y1
tmpx = x1
y1 = y3
x1 = x3
y3 = tmpy
x3 = tmpx
EndIf
If (y2>y3) Then
tmpy = y2
tmpx = x2
y2 = y3
x2 = x3
y3 = tmpy
x3 = tmpx
EndIf
If(y2=y1) Then y1-0.001
If(y3=y2) Then y3+0.001
slp1# = (x3-x1)/(y3-y1)
slp2# = (x2-x1)/(y2-y1)
slp3# = (x3-x2)/(y3-y2)
If(Int(y1)<Int(y2)) Then
For i = y1 To y2
Line x1+slp1*(i-y1), i, x2+slp2*(i-y2), i
Next i
EndIf
If(Int(y2)<Int(y3)) Then
For i = y2 To y3
Line x1+slp1*(i-y1), i, x3+slp3*(i-y3), i
Next i
EndIf
EndFunction

Function tri3D(x1#, y1#, z1#, x2#, y2#, z2#, x3#, y3#, z3#, r%, g%, b%, cull = 1)

m.kgl_matrix = ConvertToType(kgl_curmatrix)

nx1# = x1*m\a+y1*m\e+z1*m\i+m\m
ny1# = x1*m\b+y1*m\f+z1*m\j+m\n
nz1# = x1*m\c+y1*m\g+z1*m\k+m\o
x1 = nx1: y1 = ny1: z1 = nz1

nx2# = x2*m\a+y2*m\e+z2*m\i+m\m
ny2# = x2*m\b+y2*m\f+z2*m\j+m\n
nz2# = x2*m\c+y2*m\g+z2*m\k+m\o
x2 = nx2: y2 = ny2: z2 = nz2

nx3# = x3*m\a+y3*m\e+z3*m\i+m\m
ny3# = x3*m\b+y3*m\f+z3*m\j+m\n
nz3# = x3*m\c+y3*m\g+z3*m\k+m\o
x3 = nx3: y3 = ny3: z3 = nz3

If(z1<=1)Or(z2<=1)Or(z3<=1) Then Return 0
s1# = (1.0/z1#)*cop
s2# = (1.0/z2#)*cop
s3# = (1.0/z3#)*cop

t.kgl_tris = New(kgl_tris)

t\x1 = Int(s1*x1+w)
t\y1 = Int((-s1)*y1+h)
t\x2 = Int(s2*x2+w)
t\y2 = Int((-s2)*y2+h)
t\x3 = Int(s3*x3+w)
t\y3 = Int((-s3)*y3+h)
If (((t\x2-t\x1)*(t\y3-t\y1))-((t\x3-t\x1)*(t\y2-t\y1))<=0.0)And cull Then Delete t:Return 0
If (t\x1<0 And t\x2<0 And t\x3<0) Or (t\x1>2*w And t\x2>2*w And t\x3>2*w) Then Delete t:Return 0

nx1# = x2-x1
nx2# = x3-x1
ny1# = y2-y1
ny2# = y3-y1
nz1# = z2-z1
nz2# = z3-z1

normx# = ny1*nz2-nz1*ny2
normy# = nz1*nx2-nx1*nz2
normz# = nx1*ny2-ny1*nx2

normL# = Sqrt(normx*normx+normy*normy+normz*normz)

normx = normx / normL
normy = normy / normL
normz = normz / normL

light# = Max(0, normx*ldirx+normy*ldiry+normz*ldirz)

t\r = light*Float(r)
t\g = light*Float(g)
t\b = light*Float(b)

kgl_t_id(kgl_used_triangles) = ConvertToInteger(t.kgl_tris)
kgl_t_z(kgl_used_triangles) = (z1# + z2# + z3#)/3.0
kgl_used_triangles = kgl_used_triangles + 1
EndFunction

Function drawcube(r, g, b)
tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, r, g, b)
tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, r, g, b)
tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, r, g, b)
tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, r, g, b)
tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, r, g, b)
tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, r, g, b)
tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction

Repeat

ang# = ang# - 1.0
For j = 0 To 3
kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(40*Cos(ang), 1.0, 0.0, 0.0), kgl_getrotation(j*90+ang, 0.0, 1.0, 0.0)), kgl_gettranslation(0, 0, 20) ))
For i = 0 To 4
kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(20*Sin(ang+90), 0, 1, 0), kgl_gettranslation(0, 0, 1.5+.5*Sin(ang*2))), kgl_curmatrix))
col = 50+i*20
drawcube(col, col, col)
Next i
Next j

render()

Color 255, 255, 255
Text 10, 10, Str(FPS())

DrawScreen

Forever``````
@MaGetzUb, tässä on pointtina juurikin CB:n omien tehojen mittailu, ulkoisella DLL:llähän saisi aikaan vaikka mitä graafisia hulppeuksia.

Tein muuten yksinkertaista lentelysysteemiä (nuolet+w/s+x), jos tästä vaikka jonkun shmupin vääntäisi.

WOW......

### Re: Efektit

Mitä helvettiä, toi on sairaan makee. Voisitko tehdä pienen tollasen esimerkin, niin voisin koittaa tehdä jotain 3d juttuja.

koodaaja
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

### Re: Efektit

WOW...... wrote:Mitä helvettiä, toi on sairaan makee. Voisitko tehdä pienen tollasen esimerkin, niin voisin koittaa tehdä jotain 3d juttuja.
Kirjoittelin aikanaan tuton, joka löytyypi edelleen täältä.

Tässäpä näppäimin (nuolet, w/s) liikkuva kuutio, näitä funktioita käyttämällä tämä ei mitään salatiedettä ole vaikka niitä kirjoitellessa parit harmaat hiukset tulikin kasvatettua.

Code: Select all

``````Const w = 400
Const h = 300
Const cop = 800 // w*2

SCREEN w*2, h*2

Global ldirx As Float
Global ldiry As Float
Global ldirz As Float

ldirx=-1.0
ldiry=2.0
ldirz=-4.0

ldirL# = Sqrt(ldirx*ldirx+ldiry*ldiry+ldirz*ldirz)

ldirx = ldirx/ldirL#
ldiry = ldiry/ldirL#
ldirz = ldirz/ldirL#

Type kgl_tris
Field x1
Field y1
Field x2
Field y2
Field x3
Field y3
Field r
Field g
Field b
EndType

Type kgl_matrix
Field a#
Field b#
Field c#
Field d#

Field e#
Field f#
Field g#
Field h#

Field i#
Field j#
Field k#
Field l#

Field m#
Field n#
Field o#
Field p#
EndType

Dim kgl_t_id(999)
Dim kgl_t_z(999) As Float
Global kgl_used_triangles%
Global kgl_curmatrix%
Global kgl_identity
kgl_used_triangles = 0

kgl_tmp_identity.kgl_matrix = New(kgl_matrix)
kgl_tmp_identity\a = 1:kgl_tmp_identity\b = 0:kgl_tmp_identity\c = 0:kgl_tmp_identity\d = 0
kgl_tmp_identity\e = 0:kgl_tmp_identity\f = 1:kgl_tmp_identity\g = 0:kgl_tmp_identity\h = 0
kgl_tmp_identity\i = 0:kgl_tmp_identity\j = 0:kgl_tmp_identity\k = 1:kgl_tmp_identity\l = 0
kgl_tmp_identity\m = 0:kgl_tmp_identity\n = 0:kgl_tmp_identity\o = 0:kgl_tmp_identity\p = 1

kgl_identity = ConvertToInteger(kgl_tmp_identity.kgl_matrix)

kgl_curmatrix = kgl_identity

Function kgl_setworldmatrix(newmatrix)
kgl_curmatrix = newmatrix
EndFunction

Function kgl_getrotation(ang#, axx#, axy#, axz#)

sina# = Sin(ang*.5)
qx# = axx#*sina#
qy# = axy#*sina#
qz# = axz#*sina#
qw# = Cos(ang*.5)

L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L

m.kgl_matrix = New(kgl_matrix)

m\a = 1-2*(qy*qy+z*z)
m\b = 2*(qx*qy-qz*qw)
m\c = 2*(qx*qz+qy*qw)
m\d = 0

m\e = 2*(qx*qy+qz*qw)
m\f = 1-2*(qx*qx+qz*qz)
m\g = 2*(qy*qz-qx*qw)
m\h = 0

m\i = 2*(qx*qz-qy*qw)
m\j = 2*(qy*qz+qx*qw)
m\k = 1-2*(qx*qx+qy*qy)
m\l = 0

m\m = 0
m\n = 0
m\o = 0
m\p = 1

Return ConvertToInteger(m)

EndFunction

Function kgl_gettranslation(x#, y#, z#)
m.kgl_matrix = New(kgl_matrix)
m\a=1:m\b=0:m\c=0:m\d=0
m\e=0:m\f=1:m\g=0:m\h=0
m\i=0:m\j=0:m\k=1:m\l=0
m\m=x:m\n=y:m\o=z:m\p=1
Return ConvertToInteger(m)
EndFunction

Function kgl_multiply_matrix(m1_id, m2_id)

m.kgl_matrix = New(kgl_matrix)
m1.kgl_matrix = ConvertToType(m1_id)
m2.kgl_matrix = ConvertToType(m2_id)

m\a = m1\a*m2\a + m1\b*m2\e + m1\c*m2\i + m1\d*m2\m
m\b = m1\a*m2\b + m1\b*m2\f + m1\c*m2\j + m1\d*m2\n
m\c = m1\a*m2\c + m1\b*m2\g + m1\c*m2\k + m1\d*m2\o
m\d = m1\a*m2\d + m1\b*m2\h + m1\c*m2\l + m1\d*m2\p

m\e = m1\e*m2\a + m1\f*m2\e + m1\g*m2\i + m1\h*m2\m
m\f = m1\e*m2\b + m1\f*m2\f + m1\g*m2\j + m1\h*m2\n
m\g = m1\e*m2\c + m1\f*m2\g + m1\g*m2\k + m1\h*m2\o
m\h = m1\e*m2\d + m1\f*m2\h + m1\g*m2\l + m1\h*m2\p

m\i = m1\i*m2\a + m1\j*m2\e + m1\k*m2\i + m1\l*m2\m
m\j = m1\i*m2\b + m1\j*m2\f + m1\k*m2\j + m1\l*m2\n
m\k = m1\i*m2\c + m1\j*m2\g + m1\k*m2\k + m1\l*m2\o
m\l = m1\i*m2\d + m1\j*m2\h + m1\k*m2\l + m1\l*m2\p

m\m = m1\m*m2\a + m1\n*m2\e + m1\o*m2\i + m1\p*m2\m
m\n = m1\m*m2\b + m1\n*m2\f + m1\o*m2\j + m1\p*m2\n
m\o = m1\m*m2\c + m1\n*m2\g + m1\o*m2\k + m1\p*m2\o
m\p = m1\m*m2\d + m1\n*m2\h + m1\o*m2\l + m1\p*m2\p

Return ConvertToInteger(m)
EndFunction

Function render()
kgl_used_triangles = kgl_used_triangles - 1
If(kgl_used_triangles >1) Then sort()
Lock
For i = 0 To kgl_used_triangles
t.kgl_tris = ConvertToType(kgl_t_id(i))
filltriangle(t\x1, t\y1, t\x2, t\y2, t\x3, t\y3, t\r, t\g, t\b)
Delete t
Next i
Unlock
kgl_used_triangles = 0
EndFunction

Function sort()
changes = 1
gap# = kgl_used_triangles
Repeat
gap = gap/1.247330950103979
If gap = 10 Or gap = 9
gap = 11
EndIf
If gap<=1 Then gap = 1
changes = 0
For i = 0 To (kgl_used_triangles-gap)
igap = i + gap
If (kgl_t_z(i)<kgl_t_z(igap)) Then
tempz# = kgl_t_z(i)
tempid% = kgl_t_id(i)
kgl_t_z(i) = kgl_t_z(igap)
kgl_t_id(i) = kgl_t_id(igap)
kgl_t_z(igap) = tempz#
kgl_t_id(igap) = tempid%
changes = 1
EndIf
Next i
Until changes = 0 And gap=1
EndFunction

Function filltriangle(x1#, y1#, x2#, y2#, x3#, y3#, r%, g%, b%)
Color r, g, b
If (y1>y2) Then
tmpy = y1
tmpx = x1
y1 = y2
x1 = x2
y2 = tmpy
x2 = tmpx
EndIf
If (y1>y3) Then
tmpy = y1
tmpx = x1
y1 = y3
x1 = x3
y3 = tmpy
x3 = tmpx
EndIf
If (y2>y3) Then
tmpy = y2
tmpx = x2
y2 = y3
x2 = x3
y3 = tmpy
x3 = tmpx
EndIf
If(y2=y1) Then y1-0.001
If(y3=y2) Then y3+0.001
slp1# = (x3-x1)/(y3-y1)
slp2# = (x2-x1)/(y2-y1)
slp3# = (x3-x2)/(y3-y2)
If(Int(y1)<Int(y2)) Then
For i = y1 To y2
Line x1+slp1*(i-y1), i, x2+slp2*(i-y2), i
Next i
EndIf
If(Int(y2)<Int(y3)) Then
For i = y2 To y3
Line x1+slp1*(i-y1), i, x3+slp3*(i-y3), i
Next i
EndIf
EndFunction

Function tri3D(x1#, y1#, z1#, x2#, y2#, z2#, x3#, y3#, z3#, r%, g%, b%, cull = 1)

m.kgl_matrix = ConvertToType(kgl_curmatrix)

nx1# = x1*m\a+y1*m\e+z1*m\i+m\m
ny1# = x1*m\b+y1*m\f+z1*m\j+m\n
nz1# = x1*m\c+y1*m\g+z1*m\k+m\o
x1 = nx1: y1 = ny1: z1 = nz1

nx2# = x2*m\a+y2*m\e+z2*m\i+m\m
ny2# = x2*m\b+y2*m\f+z2*m\j+m\n
nz2# = x2*m\c+y2*m\g+z2*m\k+m\o
x2 = nx2: y2 = ny2: z2 = nz2

nx3# = x3*m\a+y3*m\e+z3*m\i+m\m
ny3# = x3*m\b+y3*m\f+z3*m\j+m\n
nz3# = x3*m\c+y3*m\g+z3*m\k+m\o
x3 = nx3: y3 = ny3: z3 = nz3

If(z1<=1)Or(z2<=1)Or(z3<=1) Then Return 0
s1# = (1.0/z1#)*cop
s2# = (1.0/z2#)*cop
s3# = (1.0/z3#)*cop

t.kgl_tris = New(kgl_tris)

t\x1 = Int(s1*x1+w)
t\y1 = Int((-s1)*y1+h)
t\x2 = Int(s2*x2+w)
t\y2 = Int((-s2)*y2+h)
t\x3 = Int(s3*x3+w)
t\y3 = Int((-s3)*y3+h)
If (((t\x2-t\x1)*(t\y3-t\y1))-((t\x3-t\x1)*(t\y2-t\y1))<=0.0)And cull Then Delete t:Return 0
If (t\x1<0 And t\x2<0 And t\x3<0) Or (t\x1>2*w And t\x2>2*w And t\x3>2*w) Then Delete t:Return 0

nx1# = x2-x1
nx2# = x3-x1
ny1# = y2-y1
ny2# = y3-y1
nz1# = z2-z1
nz2# = z3-z1

normx# = ny1*nz2-nz1*ny2
normy# = nz1*nx2-nx1*nz2
normz# = nx1*ny2-ny1*nx2

normL# = Sqrt(normx*normx+normy*normy+normz*normz)

normx = normx / normL
normy = normy / normL
normz = normz / normL

light# = .2+.8*Max(0, normx*ldirx+normy*ldiry+normz*ldirz)

t\r = light*Float(r)
t\g = light*Float(g)
t\b = light*Float(b)

kgl_t_id(kgl_used_triangles) = ConvertToInteger(t.kgl_tris)
kgl_t_z(kgl_used_triangles) = (z1# + z2# + z3#)/3.0
kgl_used_triangles = kgl_used_triangles + 1
EndFunction

Function drawcube(r, g, b)
tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, r, g, b)
tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, r, g, b)
tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, r, g, b)
tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, r, g, b)
tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, r, g, b)
tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, r, g, b)
tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction

pz# = 8.0

Repeat

px# = px# + (RightKey()-LeftKey())*0.1
py# = py# + (UpKey()-DownKey())*0.1
pz# = pz# + (KeyDown(17)-KeyDown(31))*0.1

kgl_setworldmatrix(kgl_gettranslation(px, py, pz))

drawcube(255, 100, 100)

render()

Color 255, 255, 255
Text 10, 10, Str(FPS())

DrawScreen

Forever``````

Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

### Re: Efektit

pistäppä tuohon lentely.exeen vielä Ilmurin vanhahko ilotikku-dll niin että tota ohjataan joystickillä, ois mahtavaa

EDIT: muokkailimpas koodiasi, sain tikun liitettyä, mutta onkos tossa kuutiossa joku kääntö vaikka z-akselin ympäri?

koodaaja
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

### Re: Efektit

Itse olen demonstraatiotarkoituksessa kääntänyt yleensä esineitä y-akselin ympäri, mutta kgl_getrotation( kulma, x, y, z ) kääntää matriisia kulman verran vektorin x, y, z ympäri eli jotain tyyliin kgl_getrotation( ang, 0, 0, 1 ) kääntäisi z-akselin ympäri. Se pitää tosin kertoa jo olemassa olevan matriisin kanssa, joten kgl_setworldmatrix(kgl_gettranslation(px, py, pz)) muuttuu muotoon kgl_setworldmatrix(kgl_multiply_matrix(kgl_getrotation(ang, 0, 0, 1), kgl_gettranslation(px, py, pz))). Tämän lisättyäsi huomaat pienen bugin, joka minulta oli jäänyt kgl_getrotation()iin. Kyseinen bugi vääristää kaiken z-akselin ympäri tapahtuvan pyörityksen, toimiva versio onpi tässä (qz sijaan oli pelkkä z, pitänee ruveta tuota force variable declarationia käyttämään)

Code: Select all

``````Function kgl_getrotation(ang#, axx#, axy#, axz#)

sina# = Sin(ang*.5)
qx# = axx#*sina#
qy# = axy#*sina#
qz# = axz#*sina#
qw# = Cos(ang*.5)

L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L

m.kgl_matrix = New(kgl_matrix)

m\a = 1-2*(qy*qy+qz*qz)
m\b = 2*(qx*qy-qz*qw)
m\c = 2*(qx*qz+qy*qw)
m\d = 0

m\e = 2*(qx*qy+qz*qw)
m\f = 1-2*(qx*qx+qz*qz)
m\g = 2*(qy*qz-qx*qw)
m\h = 0

m\i = 2*(qx*qz-qy*qw)
m\j = 2*(qy*qz+qx*qw)
m\k = 1-2*(qx*qx+qy*qy)
m\l = 0

m\m = 0
m\n = 0
m\o = 0
m\p = 1

Return ConvertToInteger(m)

EndFunction``````
Sinänsä siis hienoa että kysyit juuri z-akselia, olisi voinut muuten jäädä huomaamatta.

SPuntte
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

### Re: Efektit

Anteeksi offtopic, mutta miksi ihmeessä muutat tuossa funktiossa kulma+akselivektori -parin ensin kvaternioksi ja sitten sen edelleen matriisiksi? On nimittäin helppoa luoda kiertomatriisi pyörittämiseen mielivaltaisen akselin (=yksikkövektorin) ympäri, mutta onko tuo tosiaan nopeampi tehdä noin?
EDIT:

Noniin, tietysti se itse asia jäi sitten kommentoimatta. Todella hieno ja toimivan tuntuinen kirjasto. Itsekin joskus kehittelin matriisikirjastoa toisaalta ihan mielenkiinnosta ja toisaalta jotain 3D-juttuja varten, mutten loppujenlopuksi oikein saanut mitään kunnolla aikaan, kun kaikki mahdolliset eri koordinaatistojärjestelmät ja matriisien vektorijärjestykset sekoitti asioita aika pahasti. Netistä oli paha katsoa mitään mallia, kun kaikki oli tehty keskenään eri tavalla.

CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX

koodaaja
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

### Re: Efektit

Matrix and Quaternion FAQ:sta aikanaan lueskelin tuon tavan tehdä se, enpä ole koskaan edes miettinyt että nopeampi/helpompi tapa voisi olla olemassa :D Kerro toki miten tekisit tuon muunnoksen, nopeammin toimivasta koodista ei koskaan ole haittaa. Tuohon matrix_multiplyhyn pitäisi muutenkin lisätä valinnainen parametri jolla voisi säilyttää jommankumman tai vaikka molemmat matriisit että ei tarvitsisi kaikkea lennosta laskea, melko monet matriisit kun voisi laskea valmiiksikin.

Mutta kiitosta vaan, kyllähän tätä on tullut hetki kirjoiteltua ja sitäkin ennen aiheeseen perehdyttyä :>

Tein muuten uuden version eeppisestä lentokonetestistä, linxlinx.

SPuntte
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

### Re: Efektit

No periaatteessahan tuo kvaternion kautta kiertävä kaavasi palautuu tähän (anteeksi huono kuvanlaatu), joka ulkoasunsa perusteella voisi olla hieman nopeampi. Kannattaa varmaan laskea valmiiksi sini, kosini ja kosinin ykkösen komplementti (1 - cos θ).

Kaava on kotoisin kirjasta "3D Math Primer for Graphics and Game Developement" sivulta 109. Huomaa, että kyseinen kirja käyttää (muuten niin loistava ja sitten sortuu tällaiseen :E) vasenkätistä koordinaatistoa ja rivivektoreita.

Eli olettaen, että käytät oikeakätistä koordinaatistoa ja sarakevektoreita, joudut ensin transponoimaan matriisin (rivivektorit sarakkeiksi) ja sitten vielä muuttamaan vektorin z-komponentin etumerkin (vektorin koordinaatistokorjaus) sekä kulman etumerkin (kulman koordinaatistokorjaus). Tosin en ole tuostakaan ihan satavarma. Kokeile :D

Niin ja tietenkin n_x, n_y ja n_z ovat pyöritysakselina toimivan yksikkövektorin komponentteja.

Ja viimeinen mieleen tuleva mahdollinen ongelma tässä on se, etten ole varma onko kirjassa annettu kaava kordinaatiston itsensä, vai siinä sijaitsevan pisteen pyörittäimstä varten. Tämä on kuitenkin helppo todeta ja korjata vain kulman etumerkkiä muuttamalla.

En tiedä, oliko tästä loppujen lopuksi apua, mutta nyt taas muistan, miksi omasta matriisikirjastostani ei tullut mitään :D

ÄRR! En saa toimimaan kumpaakaan noista "lentelyistä" winellä >:€
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX

koodaaja
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

### Re: Efektit

Kas, pitänee huomenna hieman pirteämpänä tutustua ja tehdä nopeustestejä, se vaikuttaisi olevan suunnilleen ellei peräti täsmälleen sama kaava kuin tämänhetkinen vähemmillä väliarvoilla.

Nuo nyt eivät ole mitään kovin kummoista, lentokoneella voi liikkua 2D-tasossa joka liikkuu vakionopeudella eteenpäin. Eiköhän tuosta joku väistely/ammuskelupeli tule.

Pistetään nyt skriiniä kaikille, joilla ei toimi (nyyh, img-tagi ei osannut käyttää widthiä ja heightiä, tulee nyt sitten kokonaisuudessansa) :

Maisema on vielä vähän autio mutta lisäilen sinne kiviä, puita, pilviä tai jotain muuta hauskaa myöhemmin (:

kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 3:40 pm
Location: Lempäälä

### Re: Efektit

Koodaaja, joset tuosta tee peliä niin olet jotenkin häiriintynyt. Tuo on hieno.
I see the rainbow rising

Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

### Re: Efektit

koodaaja wrote:Tein muuten uuden version eeppisestä lentokonetestistä, linxlinx.
Eeppinen lentokonetesti FTW!! ihan sairaan hieno, tähtiä vielä taivaalle

EDIT: pistetäämpäs vielä ilotikulle muokkaamani "esimerkki", vähintään X-,Y- ja Z-akseliselle joystickille, jossa olisi vähintään 4 nappia
CbIlo.rar
Koodaajan 3d-kuutio esimerkki modattuna joystickille käyttäen Ilmurin CbIlo-kirjastoa.