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.
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.
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.
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.
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 :).
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.
Kiitos kaunis, toi skaalaus oli just se mitä hain.
Mulla toimii toi moitteetta!
Aihe on jo aika vanha, joten et voi enää vastata siihen.