Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB, VB6: "kamera"-3d engine

Sivun loppuun

hunajavohveli [25.12.2003 20:21:59]

#

Onko kukaan tehnyt sellaista 3d-engineä missä määrätään ensin kappaleiden koordinaatit ja sitten "kameran" koordinaatit ja kulma. Kamerahan on siis se, mikä "kuvaa" esineitä ja sen kulman perusteella piirrettäisiin esineet näytölle. Olen kyllä nähnyt (ja itsekin tehnyt) sellaisia 3d-moottoreitta, kuten 3d-kuutio ja tekemäni 3d-pallo, joita voi pyörittää akselin ympäri ja katsella eri kulmista, mutta nyt pitäisi saada peli aikaiseksi ja kamera on niinkuin ohjattava ukko, jonka silmistä maailmaa katsotaan. Olen yrittänyt itsekin ja onnistunut jotenkuten, mutta ei toimi vielä aivan täysin. Jos jollain on kokemusta, niin voisitteko kertoa, millä laskukaavoilla sen saa tehtyä. Rautalanka riittää. Jos joku olisi tehnyt vaikka funktioita, jotka pisteen 3d-koordinaattien, kameran 3d-koordinaattien ja kameran kulmien mukaan palauttaisivat pisteen 2d-koordinaatit, joiden mukaan piste piirretään näytölle. Loppu on selvää, täytyy vain vetää viivat pisteestä pisteeseen jne...

rndprogy [25.12.2003 21:09:15]

#

Minä olen joskus tälläistä yrittänyt mutta jätin kesken.
Tässä on oma heikko käsitykseni QB:n kolme deestä

SCREEN 13
Q = -160: W = -100: E = 160: R = 100
T = -140: Y = 80: U = 140: I = 80: O = 1: P = 1
A = 140: S = -80: D = -140: F = -80: G = -370: H = 200: J = 1: K = 1
DO: WINDOW (Q, W)-(E, R)
LINE (T, Y)-(U, I), 7: LINE (U, I)-(A, S), 7: LINE (T, Y)-(D, F), 7: LINE (D, F)-(A, S), 7
LINE (T, Y)-(G, H), 2
LINE (-80, -80)-(-80, 40), 6: LINE (20, 40)-(-80, 40), 6: LINE (20, 40)-(20, -80), 6
LINE (0, 0)-(2, 2), 138, BF: LINE (3, 0)-(5, 2), 66, BF
A$ = INKEY$
J = INT(RND * 1) + 15
IF A$ = "D" THEN G = G - J: D = D - J: H = H + O: F = F - P: A = A - J: S = S + O * 2: T = T - J: U = U - J: Y = Y + P: I = I - O * 2: O = O - .05: P = P + .06: CLS 2
IF A$ = "A" THEN G = G + J: D = D + J: H = H - O: F = F + P: A = A + J: S = S - O * 2: T = T + J: U = U + J: Y = Y - P: I = I + O * 2: O = O + .05: P = P - .06: CLS 2
IF A$ = "W" THEN Q = Q + J * 1.6: W = W + J: E = E - J * 1.6: R = R - J: CLS 2
IF A$ = "S" THEN Q = Q - J * 1.6: W = W - J: E = E + J * 1.6: R = R + J: CLS 2
IF A$ = " " THEN END
LOOP

Kätin tossa WINDOW käskyä

ez [25.12.2003 21:13:13]

#

Itsekkin painin saman ongelman kanssa ainakin VIIKON! Kameran liikuttelu on simppeliä, mutta katselukulma tuotti mulle ongelmia. Toteutinkin sen hyvin omaperäisesti :=)

Eli mulla on kaksi taulukkoa joihin olen laskenut valmiiksi paljon katselukulmia ja kun käyttäjä liikuttaa hiirtä taulukoidenindexi muuttujat muuttuvat...

Toimii kuten Quakessa ja ilman laskutoimituksia!!

hunajavohveli [25.12.2003 21:23:44]

#

lainaus:

Tässä on oma heikko käsitykseni QB:n kolme deestä

Ja ymmärrän erittäin hyvin miksi käytit sanaa "heikko" :P
Hienosti pelaa - muuten - mutta tuokin on selvästi vain tavallaan kappaleen ympäri pyörivä kamera. Huoneesta ei pääse mitenkään ulos tarkastelevaan seinää toiselta puolelta.

hunajavohveli [25.12.2003 21:26:46]

#

lainaus:

Eli mulla on kaksi taulukkoa joihin olen laskenut valmiiksi paljon katselukulmia ja kun käyttäjä liikuttaa hiirtä taulukoidenindexi muuttujat muuttuvat...

Kiva systeemi sinänsä, vaikkei sitä ehkä voi aivan moottoriksi sanoa, mutta sekin kelpaisi näin aluksi. Mutta jotenkinhan ne muuttujatkin pitää siihen taulukkoon lasketa. Ja jos tietäisin miten, funktioista voisi tehdä saman tien moottorinkin. Vai oletko kopioinut taulukon tekstitiedostona jostain muualta? Jos olet, niin pistäisitkö mailina. (osoite löytyy profiilista)

rndprogy [25.12.2003 21:29:14]

#

ei mutta kattokaas tätä
http://www.angelfire.com/id2/qbkaboom/

hunajavohveli [25.12.2003 21:38:32]

#

Jep olen jo kerran ladannut tuon netistä, enkä vieläkään tajua miten se on voitu tehdä QBasicilla.

Edit:
Mainitsinkin jo asiasta eräässä varhaisemmassa keskustelussa:
https://www.ohjelmointiputka.net/keskustelu/2241-3d

ez [25.12.2003 22:09:30]

#

Lataan taulukot tekstitiedostoista, jotka olen luonut apuohjelmalla joka pyörittää matriisia ja tallentaa arvot tiedostoon.

Moottoria yritin ensin tehdä samoista funktioista mutta se bugitti.

Ja käyttämäni tekniikka on nopeampi kuin se, että laskettas uudet arvot aina matriiseilla.

hunajavohveli [25.12.2003 22:23:06]

#

Niin tietystihän se on nopeampi kun ei tarvitse laskea uudestaan vai kaikki on valmiina muistissa. Apuohjelma ei siis ole itse tekemäsi? Minkä niminen ja saako sen netistä?

ez [25.12.2003 23:37:51]

#

Apuohjelma on tekemäni. Pari riviä koodia...

Sulla on lookAt matriisi, niin pyörittelet sitä ympäri ensin X-akselin suunnassa, teet arvoista tiedoston ja sit sama y-akselille.

Yritätkö koodata sitä QB:lla vai VB:lla? Käytä d3d:tä. Siellä on valmiina Rotation matriisit.

hunajavohveli [26.12.2003 11:03:17]

#

QB:llä teen... Siis meinaatko nyt Sini- ja Kosiniarvoja, jotka täytyy ottaa ylös? En tunne d3d:tä, eikä minulla siis taida sitä ollakaan. Ja mitä meinaat LookAt-matriisilla, onko se justiin niitä ympäri-kiertävä-kamera juttuja vai onko se jokin VB:n funktio?

hunajavohveli [26.12.2003 11:07:57]

#

Perusideahan minulla on selvä: Täytyy laskea kameran ja kappaleen välinen kulma, sekä kappaleen ja kameran etäisyys toisistaan. Etäisyydenhän saa helposti pythagoraan hypotenuusan laskukaavalla:
a^2 + b^2 = c^2
Eli etäisyys = SQR(ABS(kamerax-esinex)^2 + ABS(kameray-esiney)^2)
Ja jotenkin pitää laskea kameran katselukulman ja kameran ja esineen välisen kulman erotus...
Näillä periaatteilla sain ainakin oman moottorini jotenkuten toimimaan, mutta kun katsoo alaspäin, kaikki vääristyy hämärästi.

ez [26.12.2003 16:54:52]

#

Meinaan vektoreita. LookAt on yksi d3d:n kamera matriiseista joka siis kertoo mihinpäin kamera on suunnattu. LookAt matriisi koostuu kolmesta vektorista, jotka sisältävät katselukohteen X,Y,Z koordinaatit. Latailen sieltä tiedostoista noita vektoreidenarvoja, en sini- ja kosiniarvoja.

hunajavohveli [27.12.2003 18:06:26]

#

Just... oon kuullut noista vektoreista ennenkin. Mutta onhan silläkin merkitystä, missä kamera on? (X,Y,Z) Kaikkien desimaalien kanssa mahdollisia katselukulmia on kuitenkin äärettömästi, vai pyöristyykö se aina lähimpään muistissa olevaan?

hunajavohveli [29.12.2003 18:24:08]

#

Ja mitkä INPUT-arvot sille matriisille pitää antaa, että se antaa OUTPUT-arvoina 2d-koordinaatit x ja y?

ez [30.12.2003 13:34:17]

#

Homma toimii siten, että lisään "katselusuunta" matriisiin "kameranpaikka" matriisiin... Älä ymmärrä, että kamera osoittaa johonkin kohteeseen, vaan se osoittaa johonkin suuntaan. Katsekulmia on äärettömästi, mutta minun kamerassa:

Kamera pyörii vaaka-akselilla 180 erikohtaan ja pysty-akselilla 300 kohtaan. Tästä voit sitten laskea moneenko eri kulmaan minun kamera taittuu...

Kannattaa lukea, opetella ja ymmärtää matikankirjasta vektorit ja matriisit. Niiden osaamisesta on paljon hyötyä.

hunajavohveli [30.12.2003 16:01:16]

#

Voi olla tosiaan vähän vaikea ymmärtää kun ei ole matikassa ollut vielä noita vektoreita. Itse asiassa ei ole ollut vielä edes trigonometriaa, mutta sen olen opetellut ihan itse, kun ei jaksanut odottaa. Voisihan niistä vektoreistakin vakoilla matikankirjasta jo ennalta. Tai jaa, onko sulla Kolmio-sarjan kirja, että onkohan se sama?

ez [31.12.2003 11:50:30]

#

Mulla on "Tekniikan Matematiikka 1" Olen AMK:ssa. Itse opettelin perusteet netistä, ennen koulun alkua...

hunajavohveli [31.12.2003 12:21:18]

#

No ne voi olla sitten sellaisia asioita, joita ei yläasteen kirjoista löydy. Pitää katsoa netistä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta