Kirjautuminen

Haku

Tehtävät

Koodit: QB: 3D Pyöritystä

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

Kommentit

Antti Laaksonen [25.12.2002 02:01:00]

#

Hienoa grafiikkaa ja mukavat konfigurointimahdollisuudet.

KimmoKM [25.12.2002 10:37:39]

#

Hieno!

T.M. [25.12.2002 12:38:53]

#

todella hienoa työtä!

snakari [25.12.2002 12:47:18]

#

hienoa

Tumpi [25.12.2002 15:04:18]

#

hieno ja nopee

thefox [26.12.2002 22:06:41]

#

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.

HtH [27.12.2002 19:32:39]

#

Tosiaankin, en itse jostain syystä huomannut tuota pahaa häröä

Gwaur [28.12.2002 19:48:45]

#

matrix = matriisi? jos ei niin mikä sitten? olen saanut lähiaikoina tällaisen käsityksen...

HtH [29.12.2002 12:40:34]

#

niin ainakin minä luulisin

odys [23.05.2003 12:12:05]

#

Hmm mistäs saisi hyvän Kääntäjän QBasicille?
Pääsisi testailemaan näitäkin vinkkejä :)

blixt [24.06.2003 00:10:08]

#

hieno...

mamaze [26.02.2004 13:56:41]

#

iha hieno, tietäisinpä kuinka tollanen tehään

darkest [27.03.2005 19:55:58]

#

ihQ ;P

eraggo [14.04.2005 12:41:49]

#

tosi uppeee....

temu92 [23.05.2005 15:17:14]

#

WOW

Dude [29.07.2007 15:45:29]

#

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.

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta