Kirjoittaja: HtH
Kirjoitettu: 24.12.2002 – 24.12.2002
Tagit: grafiikka, koodi näytille, vinkki
Tässä tekemisen puutteessa päätin harjoitella 3D matematiikkaa. Tässäpä olisi n. puolessa tunnissa(?) koodattu koodinpätkä, joka havainnollistaa 3D pyörityksiä. Blussana hieno sylinterinluomisrutiini :)
Koodi on koodattu dossissa, joten skandinaaviset kirjaimet eivät näy Windossissa oikein. Pitemmittä löpinöittä koodin kimppuun.
' 3D Pyöritysta & Matematiikkaa, sekä sylinterinluomisrutiini. ' Coded by HtH CONST scale = 256 ' Perusvakioita CONST origox = 160 CONST origoy = 100 ' Seuraavia muuttelemalla voit vaikuttaa millainen sylinteri luodaan kerrokset = 20 ' Kuinka monta "kerrosta" sylinterissä on vertperkerros = 10 ' Kuinka monta pistettä on yhdessä kerroksessa kerrosvali = .2 ' Kuinka suuri väli on eri "kerroksilla" ' Seuraavia muuttelemalla voit muutella pyöritystä xa = .02 ' X akselin ympäri pyöritys ya = .06 ' Y akselin ympäri pyöritys za = .05 ' Z akselin ympäri pyöritys TYPE vertex x AS DOUBLE y AS DOUBLE z AS DOUBLE END TYPE DIM cone(kerrokset * vertperkerros) AS vertex DIM objmatrix(3, 3) AS DOUBLE 'Alustetaan DIM rotmatrix(3, 3) AS DOUBLE DIM tmpmatrix(3, 3) AS DOUBLE objmatrix(0, 0) = 1 objmatrix(1, 1) = 1 objmatrix(2, 2) = 1 cone(0).x = 0 ' Tämä kertoo vertexien määrän FOR p = 1 TO kerrokset FOR o = 0 TO 6.28 STEP 6.28 / vertperkerros cone(0).x = cone(0).x + 1 cone(cone(0).x).x = SIN(o) cone(cone(0).x).z = COS(o) cone(cone(0).x).y = (p * kerrosvali) - ((kerrokset * kerrosvali) / 2) NEXT o NEXT p SCREEN 7, , 0, 1 ' Tässä moodissa saadaan kätevästi double bufferointi DO CLS rotmatrix(0, 0) = COS(ya) * COS(za) ' Luodaan rotaatiomatriisi rotmatrix(0, 1) = COS(ya) * SIN(za) rotmatrix(0, 2) = -SIN(ya) rotmatrix(1, 0) = SIN(xa) * SIN(ya) * COS(za) - COS(xa) * SIN(za) rotmatrix(1, 1) = SIN(xa) * SIN(ya) * SIN(za) + COS(xa) * COS(za) rotmatrix(1, 2) = SIN(xa) * COS(ya) rotmatrix(2, 0) = COS(xa) * SIN(ya) * COS(za) + SIN(xa) * SIN(za) rotmatrix(2, 1) = COS(xa) * SIN(ya) * SIN(za) - SIN(xa) * COS(za) rotmatrix(2, 2) = COS(xa) * COS(ya) FOR i = 0 TO 2 ' Kerrotaan objektimatriisi rotaatiomatriisilla. Tulos säilötään ensin väliaikaiseen matriisiin, josta se siirretään objektimatriisiin (kiitos ruuvari!) FOR j = 0 TO 2 tmpmatrix(i, j) = objmatrix(i, 0) * rotmatrix(0, j) + objmatrix(i, 1) * rotmatrix(1, j) + objmatrix(i, 2) * rotmatrix(2, j) NEXT NEXT FOR i = 0 TO 2 FOR j = 0 TO 2 objmatrix(i, j) = tmpmatrix(i, j) NEXT NEXT FOR l = 1 TO cone(0).x ' ihan normaalit 3d laskennat ' Transformoidaan 3d-piste matriisilla ax = cone(l).x * objmatrix(0, 0) + cone(l).y * objmatrix(0, 1) + cone(l).z * objmatrix(0, 2) ay = cone(l).x * objmatrix(1, 0) + cone(l).y * objmatrix(1, 1) + cone(l).z * objmatrix(1, 2) az = cone(l).x * objmatrix(2, 0) + cone(l).y * objmatrix(2, 1) + cone(l).z * objmatrix(2, 2) IF az + 10 = 0 THEN az = 10.1 ' Ettei vaan vahingossakaan jaeta nollalla... screenx = ax * scale / (az + 10) + origox ' Lasketaan 3d koordinaateista 2d koordinaatti. screeny = ay * scale / (az + 10) + origoy PSET (screenx, screeny), 15 ' Arvaa NEXT l PCOPY 0, 1 ' Page flipflap LOOP UNTIL INKEY$ <> "" END
Hienoa grafiikkaa ja mukavat konfigurointimahdollisuudet.
Hieno!
todella hienoa työtä!
hienoa
hieno ja nopee
Koska kulmia ei muuteta ohjelman ajon aikana, voidaan matriisi luoda silmukasta erillisenä -> tuota rotaatiomatriisin luontia ei olisi kannattanut laittaa silmukan sisälle, (hidastaa mukavasti).
Ihan OK esimerkki.
Tosiaankin, en itse jostain syystä huomannut tuota pahaa häröä
matrix = matriisi? jos ei niin mikä sitten? olen saanut lähiaikoina tällaisen käsityksen...
niin ainakin minä luulisin
Hmm mistäs saisi hyvän Kääntäjän QBasicille?
Pääsisi testailemaan näitäkin vinkkejä :)
hieno...
iha hieno, tietäisinpä kuinka tollanen tehään
ihQ ;P
tosi uppeee....
WOW
odys kirjoitti:
Hmm mistäs saisi hyvän Kääntäjän QBasicille?
Pääsisi testailemaan näitäkin vinkkejä :)
http://personal.inet.fi/peli/samuli/qbasic71.zip
lataa 7.1 tuosta
HtH kirjoitti:
Koodi on koodattu dossissa, joten skandinaaviset kirjaimet eivät näy Windossissa oikein.
mite niin? mulla ainaki näkyy niinku kaikki muuki(eli firefoxsis oikein ja qbees väärin)
niin ja se on hieno.