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 SubJa 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 / 2Edit: 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.