Helposti ymmärrettävä(ja yksinkertainen ja tehoton) 3D palikka rotaatio moottori rautalankagrafiikoilla. Formille tarvitsee yhden timerin(timer1). Helppo: pistät vain addln systeemejä tarpeeksi ja sitten kutsut Rot subia.
Private Type KoordPiste '3D coord piste
X As Long
Y As Long
Z As Long
End Type
Private Type Viiva3D 'viiva
StartP As KoordPiste
EndP As KoordPiste
End Type
Private Const pi = 3.14159265368979
Private Const MaksKoord = 100 'maksimi määrä koordinaatteja, muuta jos tarviit
Private c(MaksKoord) As Viiva3D 'coordipisteet
Private Koordit As Integer 'montako coordii
Private rx, ry, rz 'rotaatti coordinaatit
Private Sub Rot(RotX, RotY, RotZ, d, vx, vy, vz) 'rotaattaa
'rotx,roty,rotz:montako astetta rotataan joka akselilla
'd=distance (etäisyys)
'vx,vy,vz: shiftit paljonko palikkaa siirretään joka akselilla
Cls 'tyhjäks
For i = 0 To Koordit - 1 'piirretään joka viiva
n1x = Laske(c(i).StartP, RotX, RotY, RotZ, vx, vy, vz, d, 0) 'lasketaan koordinaatit
n1y = Laske(c(i).StartP, RotX, RotY, RotZ, vx, vy, vz, d, 1)
n2x = Laske(c(i).EndP, RotX, RotY, RotZ, vx, vy, vz, d, 0)
n2y = Laske(c(i).EndP, RotX, RotY, RotZ, vx, vy, vz, d, 1)
Line (n1x, n1y)-(n2x, n2y), 0
DoEvents
Next
End Sub
Private Function Laske(pt As KoordPiste, rtx, rty, rtz, vx, vy, vz, d, xvaiy) 'lasku 3D:stä näytölle
k = 10
WA = rtx * pi / 180 'trigonometriaa
CA = Cos(WA): SA = Sin(WA)
WB = rtz * pi / 180
CB = Cos(WB): SB = Sin(WB)
WC = rty * pi / 180
CC = Cos(WC): SC = Sin(WC)
' x-akseli rotaatio
X1 = pt.X
Y1 = CA * pt.Y - SA * pt.Z
Z1 = SA * pt.Y + CA * pt.Z
' y-akseli rotaatio
X2 = CB * X1 - SB * Z1
Y2 = Y1
Z2 = SB * X1 + CB * Z1
' z-akseli rotaatio
X3 = CC * X2 - SC * Y2
Y3 = SC * X2 + CC * Y2
Z3 = Z2
' shiftit
X4 = X3 + vx
Y4 = Y3 + vz
Z4 = Z3 + vy
' zoom
U = -X4 / (Y4 + 1) * d
V = -Z4 / (Y4 + 1) * d
' screenicoordeiks
eks = k * U + ScaleWidth / 2
yks = k * V + ScaleHeight / 2
If xvaiy Then Laske = yks Else Laske = eks
End Function
Private Sub AddLn(sx, sy, sz, ex, ey, ez) 'uus viiva
c(Koordit).StartP.X = sx
c(Koordit).StartP.Y = sy
c(Koordit).StartP.Z = sz
c(Koordit).EndP.X = ex
c(Koordit).EndP.Y = ey
c(Koordit).EndP.Z = ez
Koordit = Koordit + 1
End Sub
Private Sub AddCube(sx, sy, sz, ex, ey, ez) 'uus cuutio
AddLn sx, sy, sz, sx, sy, ez
AddLn sx, sy, sz, sx, ey, sz
AddLn sx, sy, sz, ex, sy, sz
AddLn ex, ey, ez, ex, ey, sz
AddLn ex, ey, ez, ex, sy, ez
AddLn ex, ey, ez, sx, ey, ez
AddLn sx, ey, sz, ex, ey, sz
AddLn ex, ey, sz, ex, sy, sz
AddLn ex, sy, sz, ex, sy, ez
AddLn sx, sy, ez, ex, sy, ez
AddLn sx, ey, sz, sz, ey, ez
AddLn sx, sy, ez, sx, ey, ez
End Sub
Private Sub Form_Load()
AddCube -10, -10, -10, 10, 10, 10
Timer1.Interval = 10
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer() 'rotaatti timeri
Rot rx, ry, rz, 1000, 0, 0, -100
rx = rx + 1 'pyöritetään
ry = ry + 2
rz = rz + 3
End SubBinarya?
Miks toi vilkkuu aika pahasti?
laita autoredraw siihen mitä se ei ole niin eipäs enää vilku...
Tämä on ihan mielenkiintoinen justka. Varmasti hyvä lähtökohta aloittelevalle ohjelmoijalle, joka haluaa opetella 3D:tä :)
öök justhyvä.
Hauska yksityiskohta on se, että ton nopeus riippuu piistä, eli jos muutat tuota piin arvoa (Public COnst pi = 3,14159...)
niin nopeuskin muuttuu.
tosi... jotenkin ihmeellistähän se on... :DD
Run-time error '424':
Object reguired
että tollasta pukkaa.. sit siit voipainaa debug, ja se näyttää että tos: Timer1.interval = 10, on virhe. Niin mistä mahtaa olla kyse?
aha oho eiku joo..
Tosi hienoo!:-)D
piihän on 3.14159265358979323846
no piihän on loputon jaksoton desimaali.... ;)
Eiku:
3.
:)
"Run-time error '424':
Object reguired
että tollasta pukkaa.. sit siit voipainaa debug, ja se näyttää että tos: Timer1.interval = 10, on virhe. Niin mistä mahtaa olla kyse?"
Joku No0b on tainnut unohtaa timerin sielt.
Aihe on jo aika vanha, joten et voi enää vastata siihen.