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$ <> ""
ENDHienoa 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.