Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: 3D Piirto

Sivun loppuun

Jäynis [28.09.2005 11:25:22]

#

En tiedä onko tämä ongelma oikealla keskustelualueella mutta kieli on vb joten...
Elikkä aloin testaileemaan jotain 3D juttuja ja koska en ole mikään matikkanero(tahi nero muutenkaan) niin en vaan saa kallooni et missä mättää. Ongelma on se että kun liikuttelen kameraa niin se stoppaa johonki kohtaan(miksi ja miten korjaan) ja kun liikutan kameraa eteen/taaksepäin niin askel on paljon suurempi kun esim. liikkuessa ylöspäin.
Soodi:

Private Type T3DPisteet
    x As Integer
    y As Integer
    z As Integer
    lx As Integer
    ly As Integer
End Type

Private Type TCamera
    x As Integer
    y As Integer
    z As Integer
End Type


Const MaxPisteita = 10000
Dim Pisteet(MaxPisteita) As T3DPisteet

Const Askel = 10
Dim Pisteita As Integer
Dim Camera As TCamera


Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim i As Integer
With Camera
Select Case KeyCode
    Case vbKeyUp
        .y = .y + Askel
    Case vbKeyDown
        .y = .y - Askel
    Case vbKeyLeft
        .x = .x - Askel
    Case vbKeyRight
        .x = .x + Askel
    Case Asc("1")
        .z = .z + Askel
    Case Asc("2")
        .z = .z - Askel
End Select
End With

For i = 0 To Pisteita - 1
    With Pisteet(i)
    If .z - Camera.z = 0 Then Camera.z = Camera.z + 1
        .lx = ((.x - Camera.x) / (.z - Camera.z)) + Me.Width / 2
        .ly = ((.y - Camera.y) / (.z - Camera.z)) + Me.Width / 2
    End With
Next
Piirra
End Sub

Private Sub Form_Load()
Dim i As Integer
Dim j As Integer
For i = 0 To 200
    For j = 0 To 360 Step 10
        LPiste Sin(j) * 5000, Cos(j) * 5000, i
    Next j
Next i

End Sub
Sub LPiste(x As Integer, y As Integer, z As Integer)
Pisteet(Pisteita).x = x
Pisteet(Pisteita).y = y
Pisteet(Pisteita).z = z
Pisteita = Pisteita + 1
End Sub

Sub Piirra()
Dim i As Integer
Cls
For i = 0 To Pisteita
    PSet (Pisteet(i).lx, Pisteet(i).ly)
Next
End Sub

Ja jos tiedät jotain hyviä tutoriaaleja niin saa kertoa.

keinoihminen [28.09.2005 16:47:12]

#

Hmmm... Millä tavoin ohjelma pysähtyy? Antaa jonkun virheilmoituksen?

Tietysti, jos integerit muuttaisi doubleiksi, niin overflowwia ei ihan heti tulisi.

Illemmalla koitan ehtiä kokeilla koodia, tarkemmin.

hunajavohveli [28.09.2005 17:10:07]

#

Mitään ei tule näkyviin, kun ohjelman ajaa tuollaisenaan. Voisitko muokata koodia, niin että jotain näkyisi jo valmiina? Kerro myös, millaiset asetukset formissa on. Esim. Onko käytössä Twipit vai Pixelit vai mitkä ja onko AutoReDraw päällä yms.

Jäynis [28.09.2005 18:14:41]

#

Liikkuminen pysähtyy liikkuessa eteenpäin , taakseppäin pääsee
senkin jälkeen.

AutoReDraw on päällä ja käytössä Twipit.
Näkyviin tulee tavaraa kun painasee jotain näppäintä.
Liikuttelu tapahtuu: Nuolinäppäimillä nuolensuuntasesti,
näppäimillä '1' ja '2' liikutaan eteen ja taakseppäin.

remontti-reiska [28.09.2005 18:18:18]

#

Suosittelisin käyttämään OpenGL:ää 3D:tä tehdessä. Tuossa rajapinnassa on valmiita matriiseja, ja varsinkin kameran siirtelyyn tarkoitetut funktiot ovat helppoja. Google tietää enemmän :).

hunajavohveli [28.09.2005 18:31:20]

#

Vaihdapa kaikki Integerit Longeiksi. Long on muutenkin VB:ssä nopeammin käsiteltävä tyyppi kuin Integer. Lisäksi huomasin, että sinulla ei näy olevan tuossa ollenkaan skaalausta. Itse olen havainnut, että skaalana toimii parhaiten formin leveys (pikseleinä). Eli esim.

skaala = 640

        .lx = ((.x - Camera.x) / (.z - Camera.z)) * skaala + Me.Width / 2
        .ly = ((.y - Camera.y) / (.z - Camera.z)) * skaala + Me.Width / 2

Edit: Nuo pisteiden koordinaatitkin ovat tuossa aikamoisia. Askel-muuttujaa saa tosiaan kasvattaa, jos haluaa kunnolla liikkua.

Jäynis [28.09.2005 19:05:09]

#

Kiitos kaunis, toi skaalaus oli just se mitä hain.

Nitros [22.10.2005 22:56:10]

#

Mulla toimii toi moitteetta!


Sivun alkuun

Vastaus

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

Tietoa sivustosta