Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Ulotteisuus asiaa

sooda [08.11.2003 22:18:00]

#

määä aattelin olla hassu lammas (:D) ja säädin hienon 3D moottori roottorin joka ei osaa näyttää ku ääriviivat. Osaaks joku auttaa että se näyttäis vaan ne tahkokset mitkä on edessä eikä niitä takana näkyviä viivoja ja että täyttäis vaikka jollain värillä ne? antti ainakin on säätänyt sen yhen coodivinkin missä on tätäki upeempaa rotaatiota varmaa osaa. en tykkää käytellä sitä ku siitä ei tajuu mitää ja ite tehty on aina paras :P ohessa esimerkki soodi 3dstä vähän riisuttu versio. helppo soveltaa... juu mää voisin säätää tästä joskus koodivinkin... tää o nii hieno :P

'Joo, kolmedeetä...
Private Type Crdnt
    X As Long
    Y As Long
    Z As Long
End Type
Private Type CrdLine
    StartP As Crdnt
    EndP As Crdnt
End Type
Const pi = 3.14159265368979
Private c(100) As CrdLine, crds As Integer
Private rx, ry, rz
Private Sub Rot(RotX, RotY, RotZ, d, vx, vy, vz)

    Caption = "ROT X" & RotX & " Y" & RotY & " Z" & RotZ
    Cls
    For i = 0 To crds - 1
        s1x = Calc(c(i).StartP, RotX, RotY, RotZ, vx, vy, vz, d, 0)
        s1y = Calc(c(i).StartP, RotX, RotY, RotZ, vx, vy, vz, d, 1)
        s2x = Calc(c(i).EndP, RotX, RotY, RotZ, vx, vy, vz, d, 0)
        s2y = Calc(c(i).EndP, RotX, RotY, RotZ, vx, vy, vz, d, 1)
        If i < 0 Then clr = RGB(0, 255, 0) Else clr = 255
        Line (s1x, s1y)-(s2x, s2y), clr
        DoEvents
    Next

End Sub
Private Function Calc(pt As Crdnt, rtx, rty, rtz, vx, vy, vz, d, xvaiy)

    k = 10
    WA = rtx * pi / 180
    CA = Cos(WA): SA = Sin(WA)
    WB = rtz * pi / 180
    CB = Cos(WB): SB = Sin(WB)
    WC = rty * pi / 180
    CC = Cos(WC): SC = Sin(WC)

    ' x-akseli rotaatio
    X1 = pt.X
    Y1 = CA * pt.Y - SA * pt.Z
    Z1 = SA * pt.Y + CA * pt.Z

    ' y-akseli rotaatio
    X2 = CB * X1 - SB * Z1
    Y2 = Y1
    Z2 = SB * X1 + CB * Z1

    ' z-akseli rotaatio
    X3 = CC * X2 - SC * Y2
    Y3 = SC * X2 + CC * Y2
    Z3 = Z2

    ' shiftit
    X4 = X3 + vx
    Y4 = Y3 + vz
    Z4 = Z3 + vy

    ' ihme lasku jutska
    U = -X4 / (Y4 + 1) * d
    V = -Z4 / (Y4 + 1) * d

    ' screeni coordeiks
    xap = k * U + ScaleWidth / 2
    yap = k * V + ScaleHeight / 2
    If xvaiy Then Calc = yap Else Calc = xap

End Function

Private Sub AddLn(sx, sy, sz, ex, ey, ez)

    c(crds).StartP.X = sx
    c(crds).StartP.Y = sy
    c(crds).StartP.Z = sz
    c(crds).EndP.X = ex
    c(crds).EndP.Y = ey
    c(crds).EndP.Z = ez
    crds = crds + 1

End Sub

Private Sub AddCube(sx, sy, sz, ex, ey, ez)

    AddLn sx, sy, sz, sx, sy, ez
    AddLn sx, sy, sz, sx, ey, sz
    AddLn sx, sy, sz, ex, sy, sz
    AddLn ex, ey, ez, ex, ey, sz
    AddLn ex, ey, ez, ex, sy, ez
    AddLn ex, ey, ez, sx, ey, ez
    AddLn sx, ey, sz, ex, ey, sz
    AddLn ex, ey, sz, ex, sy, sz
    AddLn ex, sy, sz, ex, sy, ez
    AddLn sx, sy, ez, ex, sy, ez
    AddLn sx, ey, sz, sz, ey, ez
    AddLn sx, sy, ez, sx, ey, ez

End Sub

Private Sub Form_activate()

    AddCube -250, -250, -250, 250, 250, 250

End Sub

Private Sub Timer1_Timer()

    rx = rx + 1
    ry = ry + 2
    rz = rz + 3
    Rot rx, ry, rz, 1000, 0, 0, -1500

End Sub

thefox [09.11.2003 01:28:25]

#

Mjaah, jos fillattua systeemiä meinaa värkätä niin kannattanee ainakin tallennella objektit mieluummin läjänä polygoneja. Takana näkyvät viivatkin taitavat sitten poistua samalla kun joko sorttaa ne polyt tai pistää backface-cullingia.

sooda [09.11.2003 08:08:49]

#

njääh, liian monimutkaista mulle...

Vastaus

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

Tietoa sivustosta