Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB6: Helppo 3D rautalanka

Sivun loppuun

sooda [17.11.2003 17:16:16]

#

Helposti ymmärrettävä(ja yksinkertainen ja tehoton) 3D palikka rotaatio moottori rautalankagrafiikoilla. Formille tarvitsee yhden timerin(timer1). Helppo: pistät vain addln systeemejä tarpeeksi ja sitten kutsut Rot subia.

Private Type KoordPiste '3D coord piste
    X As Long
    Y As Long
    Z As Long
End Type
Private Type Viiva3D 'viiva
    StartP As KoordPiste
    EndP As KoordPiste
End Type
Private Const pi = 3.14159265368979
Private Const MaksKoord = 100 'maksimi määrä koordinaatteja, muuta jos tarviit
Private c(MaksKoord) As Viiva3D 'coordipisteet
Private Koordit As Integer  'montako coordii
Private rx, ry, rz 'rotaatti coordinaatit

Private Sub Rot(RotX, RotY, RotZ, d, vx, vy, vz) 'rotaattaa

    'rotx,roty,rotz:montako astetta rotataan joka akselilla
    'd=distance (etäisyys)
    'vx,vy,vz: shiftit paljonko palikkaa siirretään joka akselilla
    Cls 'tyhjäks
    For i = 0 To Koordit - 1 'piirretään joka viiva
        n1x = Laske(c(i).StartP, RotX, RotY, RotZ, vx, vy, vz, d, 0) 'lasketaan koordinaatit
        n1y = Laske(c(i).StartP, RotX, RotY, RotZ, vx, vy, vz, d, 1)
        n2x = Laske(c(i).EndP, RotX, RotY, RotZ, vx, vy, vz, d, 0)
        n2y = Laske(c(i).EndP, RotX, RotY, RotZ, vx, vy, vz, d, 1)
        Line (n1x, n1y)-(n2x, n2y), 0
        DoEvents
    Next

End Sub
Private Function Laske(pt As KoordPiste, rtx, rty, rtz, vx, vy, vz, d, xvaiy)  'lasku 3D:stä näytölle

    k = 10
    WA = rtx * pi / 180       'trigonometriaa
    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

    ' zoom
    U = -X4 / (Y4 + 1) * d
    V = -Z4 / (Y4 + 1) * d

    ' screenicoordeiks
    eks = k * U + ScaleWidth / 2
    yks = k * V + ScaleHeight / 2
    If xvaiy Then Laske = yks Else Laske = eks

End Function

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

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

End Sub

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

    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_Load()

    AddCube -10, -10, -10, 10, 10, 10
    Timer1.Interval = 10
    Timer1.Enabled = True

End Sub

Private Sub Timer1_Timer() 'rotaatti timeri

    Rot rx, ry, rz, 1000, 0, 0, -100
    rx = rx + 1 'pyöritetään
    ry = ry + 2
    rz = rz + 3

End Sub

Gwaur [20.11.2003 15:53:48]

#

Binarya?

ZcMander [08.12.2003 20:10:14]

#

Miks toi vilkkuu aika pahasti?

sooda [16.12.2003 10:55:04]

#

laita autoredraw siihen mitä se ei ole niin eipäs enää vilku...

izecolt [31.03.2004 10:07:37]

#

Tämä on ihan mielenkiintoinen justka. Varmasti hyvä lähtökohta aloittelevalle ohjelmoijalle, joka haluaa opetella 3D:tä :)

SirDayBat [23.06.2004 19:03:06]

#

öök justhyvä.

Lumi-ukkeli [11.02.2005 15:51:36]

#

Hauska yksityiskohta on se, että ton nopeus riippuu piistä, eli jos muutat tuota piin arvoa (Public COnst pi = 3,14159...)
niin nopeuskin muuttuu.

eraggo [10.03.2005 20:09:01]

#

tosi... jotenkin ihmeellistähän se on... :DD

Vesis [16.03.2005 17:57:52]

#

Run-time error '424':
Object reguired

että tollasta pukkaa.. sit siit voipainaa debug, ja se näyttää että tos: Timer1.interval = 10, on virhe. Niin mistä mahtaa olla kyse?

Vesis [16.03.2005 17:58:31]

#

aha oho eiku joo..

TemeX [21.03.2005 18:51:45]

#

Tosi hienoo!:-)D

moptim [03.11.2006 19:34:04]

#

piihän on 3.14159265358979323846

vehkis91 [02.02.2008 20:22:33]

#

no piihän on loputon jaksoton desimaali.... ;)

jo123 [18.01.2009 20:09:59]

#

Eiku:

3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912

:)

siika [24.06.2009 13:13:10]

#

"Run-time error '424':
Object reguired

että tollasta pukkaa.. sit siit voipainaa debug, ja se näyttää että tos: Timer1.interval = 10, on virhe. Niin mistä mahtaa olla kyse?"

Joku No0b on tainnut unohtaa timerin sielt.


Sivun alkuun

Vastaus

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

Tietoa sivustosta