Tässäpä on keskeneräinen 3d-moottori Visual Basicilla, jota oli alunperin tarkoitus aluksi käyttää Oppia ikä kaikki -pelin alkudemoon. Ohjelma on VB-sovitus eräästä Internetistä löytämästäni QBasic-pohjaisesta 3d-kuutio-ohjelmasta, ja se näkyy koodin sekavuutena. Muutenkin ohjelma on varsin keskeneräinen ja jo koodin ymmärtäminen käy työstä. Vaan todistaahan se, että pelkällä WinApillakin voi kyhäillä jonkunlaisen 3d-moottorin.
Ohjelman pitäisi toimia suoraan ilman mitään kontrolleja, kunhan luodaan Formi ja Moduuli, ja niihin sijoitetaan allaolevat koodit.
Formille
Private Sub Form_Activate() Form_Click End Sub Private Sub Form_Click() Static paikat(3) As POINTAPI PI = 4 * Atn(1) For i = 0 To 359 s!(i) = Sin(i * (PI / 180)) c!(i) = Cos(i * (PI / 180)) Next LisaaSK -31.35, -23.15, 0, 31.35, 23.15, 0, RGB(128, 128, 128) LisaaSK 14.95, -23.15, 0, 31.35, 6.85, 0, RGB(0, 128, 0) LisaaSS -31.35, -23.15, 0, -16.95, 21.85, -20, RGB(192, 192, 192) LisaaSS -16.95, -23.15, 0, -1.95, -8.15, -20, RGB(192, 192, 192) LisaaSS -1.95, -23.15, 0, 13.05, 6.85, -20, RGB(192, 192, 192) LisaaSK -31.35 + 19.6, -23.15 + 14.9, 0, -31.35 + 19.6 + 5.6, -23.15 + 14.9, -5, RGB(33, 97, 161) LisaaSS -31.35 + 15.5, -23.15 + 40.2, 0, -31.35 + 15.5 + 1.08, -23.15 + 40.2 + 3.8, -1, RGB(161, 161, 161) LisaaSS -31.35 + 15.4, -23.15 + 15.5, 0, -31.35 + 15.4 + 0.7, -23.15 + 15.5 + 0.9, -2, RGB(64, 128, 0) LisaaSS -31.35 + 28.9, -23.15 + 15.5, 0, -31.35 + 28.9 + 0.7, -23.15 + 15.5 + 0.9, -2, RGB(64, 128, 0) LisaaSS -31.35 + 15.3, -23.15 + 19.3, 0, -31.35 + 15.3 + 0.75, -23.15 + 19.3 + 3, -1, RGB(128, 64, 0) LisaaSS -31.35 + 15.3, -23.15 + 19.3 + 3.4, 0, -31.35 + 15.3 + 0.75, -23.15 + 19.3 + 3 + 3.4, -1, RGB(128, 64, 0) LisaaSS -31.35 + 15.3, -23.15 + 19.3 + 6.8, 0, -31.35 + 15.3 + 0.75, -23.15 + 19.3 + 3 + 6.8, -1, RGB(128, 64, 0) LisaaSS -31.35 + 15.3 + 13.6, -23.15 + 19.3, 0, -31.35 + 15.3 + 0.75 + 13.6, -23.15 + 19.3 + 3, -1, RGB(128, 64, 0) LisaaSS -31.35 + 15.3 + 13.6, -23.15 + 19.3 + 3.4, 0, -31.35 + 15.3 + 0.75 + 13.6, -23.15 + 19.3 + 3 + 3.4, -1, RGB(128, 64, 0) LisaaSS -31.35 + 15.3 + 13.6, -23.15 + 19.3 + 6.8, 0, -31.35 + 15.3 + 0.75 + 13.6, -23.15 + 19.3 + 3 + 6.8, -1, RGB(128, 64, 0) LisaaSK -31.35 + 30.6, -23.15 + 30.05, -2, -31.35 + 30.6 + 0.8, -23.15 + 30.05 + 0.8, -2, RGB(194, 194, 0) LisaaSK -31.35 + 30.6 + 8.8, -23.15 + 30.05, -2, -31.35 + 30.6 + 0.8 + 8.8, -23.15 + 30.05 + 0.8, -2, RGB(194, 194, 0) lisaasku -31.5 + 14.75, -23.15 + 35.55, -2, -31.5 + 14.75, -23.15 + 35.55 + 2.7, -4, RGB(33, 97, 161) xcenter = 180: ycenter = 180: zcenter = 80 theta = 90: phi = 125 thetarot = 2: phirot = 0 xmuutos = 0: ymuutos = 0: zmuutos = 0 Do If pois Then GoTo loppu GoSub Piirrakuva Loop Piirrakuva: theta = (theta + thetarot) Mod 360 phi = (phi + phirot) Mod 360 xcenter = xcenter + xmuutos ycenter = ycenter + ymuutos zcenter = zcenter + zmuutos For i = 0 To numlines oldX(i, 0) = scrx(i, 0): oldY(i, 0) = scrY(i, 0) oldX(i, 1) = scrx(i, 1): oldY(i, 1) = scrY(i, 1) lr(i, 0).x = -lO(i, 0).x * s!(theta) + lO(i, 0).y * c!(theta) lr(i, 0).y = -lO(i, 0).x * c!(theta) * s!(phi) - lO(i, 0).y * s!(theta) * s!(phi) - lO(i, 0).z * c!(phi) + lO(i, 0).p lr(i, 0).z = -lO(i, 0).x * c!(theta) * c!(phi) - lO(i, 0).y * s!(theta) * c!(phi) + lO(i, 0).z * s!(phi) lr(i, 1).x = -lO(i, 1).x * s!(theta) + lO(i, 1).y * c!(theta) lr(i, 1).y = -lO(i, 1).x * c!(theta) * s!(phi) - lO(i, 1).y * s!(theta) * s!(phi) - lO(i, 1).z * c!(phi) + lO(i, 1).p lr(i, 1).z = -lO(i, 1).x * c!(theta) * c!(phi) - lO(i, 1).y * s!(theta) * c!(phi) + lO(i, 1).z * s!(phi) If (lr(i, 0).z + zcenter) <> 0 Then scrx(i, 0) = 256 * (lr(i, 0).x / (lr(i, 0).z + zcenter)) + xcenter scrY(i, 0) = 256 * (lr(i, 0).y / (lr(i, 0).z + zcenter)) + ycenter End If If (lr(i, 1).z + zcenter) <> 0 Then scrx(i, 1) = 256 * (lr(i, 1).x / (lr(i, 1).z + zcenter)) + xcenter scrY(i, 1) = 256 * (lr(i, 1).y / (lr(i, 1).z + zcenter)) + ycenter End If Next a = Timer DoEvents Cls ReDim upaikat(numlines / 4) As Integer upi% = 0 For i = 1 To numlines Step 4 upi% = upi% + 1 upaikat(upi%) = i Next For i = 1 To numlines / 4 For j = 1 To numlines / 4 - 1 If IsoinZ(upaikat(j)) <= IsoinZ(upaikat(j + 1)) Then upaikat(0) = upaikat(j + 1) upaikat(j + 1) = upaikat(j) upaikat(j) = upaikat(0) End If Next Next For j = 1 To numlines / 4 i = upaikat(j) paikat(0).x = scrx(i, 0) paikat(0).y = scrY(i, 0) paikat(1).x = scrx(i + 1, 0) paikat(1).y = scrY(i + 1, 0) paikat(2).x = scrx(i + 2, 0) paikat(2).y = scrY(i + 2, 0) paikat(3).x = scrx(i + 3, 0) paikat(3).y = scrY(i + 3, 0) hBrush = CreateSolidBrush(lO(i, 0).c) hObj = SelectObject(Me.hdc, hBrush) d = Polygon(hdc, paikat(0), 4) d = DeleteObject(hObj) Next Return loppu: Unload Me End Sub
Moduuliin
Public Type POINTAPI x As Long y As Long End Type Public Declare Function Polygon Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long Public Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Type pnt x As Single y As Single z As Single p As Integer c As Long End Type Public numlines As Integer Public lO(1000, 1) As pnt Public lr(1000, 1) As pnt Public scrx(1000, 1) Public scrY(1000, 1) Public oldX(1000, 1) Public oldY(1000, 1) Public s!(359) Public c!(359) Function IsoinZ(u As Integer) iso = lr(u, 0).z If lr(u + 1, 0).z > iso Then iso = lr(u + 1, 0).z If lr(u + 2, 0).z > iso Then iso = lr(u + 2, 0).z If lr(u + 3, 0).z > iso Then iso = lr(u + 3, 0).z IsoinZ = iso End Function Sub LisaaPyramidi(ax, ay, az, lx, ly, lz, yx, yy, yz, c) LisaaSK ax, ay, az, lx, ly, lz, c lisaaviiva ax, ay, az, yx, yy, yz, c lisaaviiva ax, ly, lz, yx, yy, yz, c lisaaviiva lx, ly, lz, yx, yy, yz, c lisaaviiva lx, ax, az, yx, yy, yz, c End Sub Sub LisaaSK(ax, ay, az, lx, ly, lz, c) lisaaviiva ax, ay, az, lx, ay, az, c lisaaviiva lx, ay, az, lx, ly, lz, c lisaaviiva lx, ly, lz, ax, ly, lz, c lisaaviiva ax, ly, lz, ax, ay, az, c End Sub Sub lisaasku(ax, ay, az, lx, ly, lz, c) lisaaviiva ax, ay, az, ax, ly, az, c lisaaviiva ax, ly, az, ax, ly, lz, c lisaaviiva ax, ly, lz, ax, ay, lz, c lisaaviiva ax, ay, lz, ax, ay, az, c End Sub Sub LisaaSS(ax, ay, az, lx, ly, lz, c) LisaaSK ax, ay, az, lx, ay, lz, c LisaaSK ax, ly, lz, lx, ly, az, c LisaaSK ax, ay, lz, lx, ly, lz, c LisaaSK ax, ay, az, lx, ly, az, c lisaasku ax, ay, az, ax, ly, lz, c lisaasku lx, ay, lz, lx, ly, az, c End Sub Sub lisaaviiva(ax, ay, az, lx, ly, lz, c) numlines = numlines + 1 lO(numlines, 0).x = ax lO(numlines, 0).y = ay lO(numlines, 0).z = az lO(numlines, 0).p = 1 lO(numlines, 0).c = c lO(numlines, 1).x = lx lO(numlines, 1).y = ly lO(numlines, 1).z = lz lO(numlines, 1).p = 1 End Sub
Sää oot hyvä! Ite en tajua 3Dtä ollenkaan...
Sääli vain että WinApi on hias!
jos toi välkkyy teillä helvetisti niinku mulla, niin kannattaa vaihtaa formin AutoRedraw = True ja DoEvents kohdan jälkeen: me.redraw
Hyvä koodinpätkä =) täytyypäs kokeilla tohon texturemappausta =D
Mulla tää valittaa että joka rivissä olis virhe, siis ihan jokasessa. Onkohan versionumerolla vaikutusta tähän kun mulla on 3.0 PRO?
laadukasta työtä. ei voi muuta sanoo jos tommosta laatuu vetää vb:llä
Hmm taidan virittää tohon hiirellä ohjattavan kameran...
ihan hirveää paskaa
Mulla riitti että laitoin formin autoredrawin trueksi ja lakkasi välkkymästä.
Jos laitoin tuon me.redraw:in niin tuli erroria.
Ei sitä me.redraw:ia enää tarvi, kun on pistetty autoredraw. Nopeutta ja kulmaa pystyy ainakin osittain säätämään muuttamalla "PI = 4 * Atn(1)" kertointa. Nelonen muutetaan halutuksi luvuksi.
Ei härregyyd! Kyllä mainiolta näyttää!
hyvä alku moottorille mutta kannattaisi tehdä loppuun asti se
alku? tuohan on tosihyvä kuva!
kaunista jälkeä tosiaan. kateellinen olen
edit: ja jos redraw ei toimi niin laittakaa refresh, se on versionumerosta kiinni kumpi niistä kelpaa
Nyt kun mulla on VB6 niin hyvin toimii =)
tosi upea
Aihe on jo aika vanha, joten et voi enää vastata siihen.