Kamera, vektorigrafiikka, 3d yms

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 2:18 pm

Kamera, vektorigrafiikka, 3d yms

Post by DJ-Filbe »

Yksinkertainen kameraongelma:
Minulla on pisteitä, joilla x,y ja z -koordinaatit. Piirrän niitä näytölle 3d :nä. Pisteet ovat 3d-maailmassa kiinteitä, mutta kamera liikkuu vapaasti. Kameralla on x, y ja z -koordinaatit, joita käytetään myös pisteiden paikan laskemiseen.

Tyyppimäärittelyt:

Code: Select all

Type piste
	Field x#
	Field y#
	Field z#
	Field r // red
	Field g // green
	Field b // blue
EndType
3d-projektio:

Code: Select all

	For p.piste = Each piste
		dX = (cX - p\x) * (p\z / cZ) + ScreenWidth()/2
		dY = (cY - p\y) * (p\z / cZ) + ScreenHeight()/2
		dX = Cos(cKX)*dX
		Color p\r, p\g, p\b
		Dot dX, dY
	Next p
1. Miten lisään kameran pyörityskulmat kaavaan?
2. Miten muutan systeemin vektorigrafiikaksi pikseleiden sijaan?
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Kamera, vektorigrafiikka, 3d yms

Post by koodaaja »

Kovasti kummastuttaa, kuinka kamerasi z-suuntainen liike toimii, näyttää enemmän zoomilta kuin liikkeeltä :u

1) Määrittele "pyörityskulmat". Eulerin kulmia et halua käyttää jos käännyt kaikkien kolmen akselin ympäri, mutta yhden akselin (tässä esimerkissä y-akselin) ympäri kääntyessä lasket pisteen koordinaatit kameran avaruudessa (p\x-cX, p\y-cY, p\z-cZ) ja sen jälkeen pyörität niitä seuraavasti: x' = cos(a)*x+sin(a)*z, z' = -sin(a)*x+cos(a)*z. (xz pyörittää y:n ympäri, xy z:n ympäri ja zy x:n ympäri, vaihdat vain muuttujia ja akseli vaihtuu) Tämä on tavallinen 2D-rotaatiomatriisi auki kirjoitettuna, halutessasi voit tehdä tuon myös kahdelle akselille (muista käyttää eri välimuuttujia, x:n ja z:n tulee olla samat samaa matriisia laskettaessa). Jos taas haluat kääntyä kaikkien akselien ympäri, törmäät tässä toteutustavassa gimbal lockiin, johon ainoa ratkaisu on kvaternioiden käyttö, niistä löytää hyvää lisäinfoa interwebistä.
2) Riippuu, mitä tällä tarkoitat. Meshin generointi pisteiden pohjalta onnistuu monellakin eri tavalla, esimerkiksi muodostamalla pisteistä jonkinlaisen etäisyysfunktion ja käyttämällä marching cubes -algoritmiä tai vaikka Delaunayn kolmiointialgoritmiä käyttäen, jolloin pisteistä tulee suoraan verteksejä. Jos taas hait sitä, että sinulla on jo tarvittava data meshin luomiseen mallinnustyökalusta tai generoituna, sen kun vain lisäät tyyppiisi tuen useammalle pisteelle ja piirrät niiden väliin vaikka kolmioita. Ne kannattaa tosin jollain tapaa järjestää syvyysjärjestykseen, jotta takana olevat kolmiot piirtyvät taakse.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Kamera, vektorigrafiikka, 3d yms

Post by MaGetzUb »

Tässä:

Code: Select all

SCREEN 800, 600
Dim points(1024, 2) As Float 

For i = 0 To 1024
    points(i, 0) = Rnd(-1000, 1000)
    points(i, 1) = Rnd(-20, 20)
    points(i, 2) = Rnd(-1000, 1000)
Next i


y = 100
Repeat 
    
    a# = a# + 1

    For i = 0 To 1024
        nx# = Cos(a#) * points(i, 0) + Sin(a#) * points(i, 2)
        nz# = -Sin(a#) * points(i, 0) + Cos(a#) * points(i, 2)
        Dot3D(nx+x, points(i, 1)+y, nz)
    Next i

    x = x + (RightKey() - LeftKey())
    y = y + (UpKey() - DownKey())
 
    DrawScreen
Forever 


Function Dot3D(x#, y#, z#)
    If z# = 0 Then z# = -1
    If z# > 0 Then Return False
    s_z# = (1 / z#)
    s_x# = ScreenWidth()/2 + x# * s_z# * 500 
    s_y# = ScreenHeight()/2 + y# * s_z# * 500
    Dot s_x, s_y
EndFunction 
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
mikeful
Moderator
Moderator
Posts: 523
Joined: Mon Aug 27, 2007 8:36 pm
Location: Vaasa, Finalnd
Contact:

Re: Kamera, vektorigrafiikka, 3d yms

Post by mikeful »

Koittakaanhan nyt pitää se asialinja vaikka ääliömäisyyksille tarjoutuukin tilaisuus.
Pelejä: Pelasta puhe, Grinder
Muuta: Blogi, Twitter
Post Reply