» Utilizator
LAMP
» Parteneri» De citit» Recomandari» Taskuri securitate » Statistici
  • 65571 de mesaje.
  • 7753 de topicuri.
  • 1305 de utilizatori.
  •  
  • allerhoofNole e ultimul utilizator inregistrat.
[Detalii]

 

| |
Pagini: [1]
Print

[FreeBASIC/QBasic]Functii desenare [763 afisari]

zapakitul
*


Mesaje: 1930
OfflineOffline

WWW

Ieri ma apucat o dorinta nebuna de a face urmatorul pas in lumea 3D, si anume sa inteleg tot ce sta in spatele ei, si sa "modelez" si sa afisez obiecte in 3D fara a folosi Directx sau openGl, ci practic sa creez totu pornind de la lini si puncte. Asa c-a m-am apucat de treaba si jucandu-ma putin am scos cateva "perle". Practic prima mea dorinta a fost sa creez o linie 3D daca pot sa spun asa. Ideea a fost simpla, o linie dintr-un spatiu 3D sa o proiectez intr-unul 2D. Pe baza acestei lini am trecut mai departe si am facut cateva functii de desenare a unor tri-unghiuri si patrulatere "3D". Nu e cine stie ce, dar as vrea totusi sa postez rezultate pe masura ce aprofundez.
Sursa ar fi urmatoarea:
Code:
/'
Brawn Engine: 2D-3D Proof of concept
Use it in any way you want... Be sure just to use #include once "brawn.bi" in you projects'/

Declare Sub Draw3Dline(x1 As integer,y1 As integer,z1 As integer,x2 As integer,y2 As integer,z2 As integer)
Declare Sub Draw3Dtriangle(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer)
Declare Sub Draw2DTriangle(a As integer, b As integer, y1 As integer, y2 As integer, y3 As integer )
Declare Sub Draw3DQuadrilater(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
Declare Sub Draw3DQuadrilater_Mouse(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
 
Sub Draw3Dline(x1 As integer,y1 As integer,z1 As integer,x2 As integer,y2 As integer,z2 As integer)
dim x1_point As integer, y1_point As integer, x2_point As integer, y2_point As integer
x1_point = x1/z1
y1_point = y1/z1
x2_point = x2/z2
y2_point = y2/z2
line (x1_point,y1_point)-(x2_point,y2_point),4
End Sub

Sub Draw3DlineGreen(x1 As integer,y1 As integer,z1 As integer,x2 As integer,y2 As integer,z2 As integer)
dim x1_point As integer, y1_point As integer, x2_point As integer, y2_point As integer
x1_point = x1/z1
y1_point = y1/z1
x2_point = x2/z2
y2_point = y2/z2
line (x1_point,y1_point)-(x2_point,y2_point),2
End Sub 

Sub Draw3Dtriangle(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer)
Draw3DlineGreen(x1,y1,z1,x2,y2,z2)
Draw3DlineGreen(x2,y2,z2,x3,y3,z3)
Draw3DlineGreen(x3,y3,z3,x1,y1,z1)
End Sub

Sub Draw3DQuadrilater(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
Draw3Dline(x1,y1,z1,x2,y2,z2)
Draw3Dline(x2,y2,z2,x3,y3,z3)
Draw3Dline(x3,y3,z3,x4,y4,z4)
Draw3Dline(x4,y4,z4,x1,y1,z1)

End Sub

Sub Draw3DQuadrilater_Mouse(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
dim msx As Integer, msy As Integer, buttons As Integer
dim mouse As Integer
mouse = getmouse (msx, msy, buttons)
Draw3Dline(x1,y1,z1,x2,y2,z2)
Draw3Dline(x2,y2,z2,msx,msy,z3)
Draw3Dline(msx,msy,z3,x4,y4,z4)
Draw3Dline(x4,y4,z4,x1,y1,z1)
End Sub

Sub Draw2DTriangle(a As integer, b As integer, y1 As integer, y2 As integer, y3 As integer )
dim c As integer
c = sqr(a*a + b*b)
line(a, y1)-(b,y2)
line(b, y2)-(c,y3)
line(c, y3)-(a,y1)
End Sub

Si un mic exemplu de folosire:
Code:
#include once "functii_desenare.bi"
Screen 13
Do
cls
Draw3DQuadrilater_Mouse(70,10,1,150,10,1,100,60,1,180,60,1)
Draw3Dtriangle(60,20,1,27,20,1,67,103,1)
Draw2DTriangle(10,17,0,90,30) 
Draw3DQuadrilater(50,50,1,100,100,1,50,150,1,300,200,1)
ScreenSync
loop
Screenshot + Executabil:

Logged

13-12-2008, 10:51 Twitt ::
DarkByte



Mesaje:

Apropos de proiectari forme 3D intr-un spatiu 2D, incearca sa faci un program care sa simuleze screensaver-ul "Starfield" din Windows. Ai niste puncte ("stele") la distante variabile si se apropie de monitor.

Bafta
Logged
13-12-2008, 11:51 Twitt ::
zapakitul
*


Mesaje: 1930
OfflineOffline

WWW

Am mai lucrat in seara asta ce am mai lucrat si am mai adaugat vreo 2 functii si anume: Draw3DPoint (amplaseaza un punct dupa cele 3 coordonate spatiale) si Fill3D (umple o zona delimitata de 4 coordonate: x1-x2 si y1-y2). De asemenea cu aceast mic update am facut si cateva demo-uri, si pe langa asta am adaugat si mica mea incercare de a Studia Rotatile folosindu-ma de functiile matematice Sin si Cos. Proiectul meu de studiu momentan nu este foarte interesant dar sper sa devina din ce in ce mai atractiv atat pentru mine, cat si pentru voi... Asa, noua sursa:
Code:
/'
Brawn Engine: 2D-3D Proof of concept
Use it in any way you want... Be sure just to use #include once "brawn.bi" in you projects'/

Declare Sub Draw3Dline(x1 As integer,y1 As integer,z1 As integer,x2 As integer,y2 As integer,z2 As integer)
Declare Sub Draw3Dtriangle(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer)
Declare Sub Draw2DTriangle(a As integer, b As integer, y1 As integer, y2 As integer, y3 As integer )
Declare Sub Draw3DQuadrilater(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
Declare Sub Draw3DQuadrilater_Mouse(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
Declare Sub Draw3DPoint(x As integer, y As integer, z As integer)
Declare Sub Draw3DPointCLR(x As integer, y As integer, z As integer, clr As integer)
Declare Sub Fill3D(x1 As integer, x2 As integer, y1 As integer, y2 As integer,za As integer, clr As integer)

Sub Fill3D(x1 As integer, x2 As integer, y1 As integer, y2 As integer, z As integer, clr As integer)
dim x As integer, y As integer
For x = x1 to x2
For y = y1 to y2 
Draw3dPointCLR(x,y,z,clr)
Next y
Next x

End Sub
 
Sub Draw3Dline(x1 As integer,y1 As integer,z1 As integer,x2 As integer,y2 As integer,z2 As integer)
dim x1_point As integer, y1_point As integer, x2_point As integer, y2_point As integer
x1_point = x1/z1
y1_point = y1/z1
x2_point = x2/z2
y2_point = y2/z2
line (x1_point,y1_point)-(x2_point,y2_point),4
End Sub

Sub Draw3DPoint(x As integer, y As integer, z As integer)
dim x3d As integer, y3d As integer
x3d = x/z
y3d = y/z
pset (x3d,y3d),3
End Sub

Sub Draw3DPointCLR(x As integer, y As integer, z As integer, clr As integer)
dim x3d As integer, y3d As integer
x3d = x/z
y3d = y/z
pset (x3d,y3d),clr
End Sub

Sub Draw3DlineGreen(x1 As integer,y1 As integer,z1 As integer,x2 As integer,y2 As integer,z2 As integer)
dim x1_point As integer, y1_point As integer, x2_point As integer, y2_point As integer
x1_point = x1/z1
y1_point = y1/z1
x2_point = x2/z2
y2_point = y2/z2
line (x1_point,y1_point)-(x2_point,y2_point),2
End Sub 

Sub Draw3Dtriangle(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer)
Draw3DlineGreen(x1,y1,z1,x2,y2,z2)
Draw3DlineGreen(x2,y2,z2,x3,y3,z3)
Draw3DlineGreen(x3,y3,z3,x1,y1,z1)
End Sub

Sub Draw3DQuadrilater(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
Draw3Dline(x1,y1,z1,x2,y2,z2)
Draw3Dline(x2,y2,z2,x3,y3,z3)
Draw3Dline(x3,y3,z3,x4,y4,z4)
Draw3Dline(x4,y4,z4,x1,y1,z1)

End Sub

Sub Draw3DQuadrilater_Mouse(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
dim msx As Integer, msy As Integer, buttons As Integer
dim mouse As Integer
mouse = getmouse (msx, msy, buttons)
Draw3Dline(msx,msy,z1,x2,y2,z2)
Draw3Dline(x2,y2,z2,x3,y3,z3)
Draw3Dline(x3,y3,z3,x4,y4,z4)
Draw3Dline(x4,y4,z4,msx,msy,z1)
End Sub

Sub Draw2DTriangle(a As integer, b As integer, y1 As integer, y2 As integer, y3 As integer )
dim c As integer
c = sqr(a*a + b*b)
line(a, y1)-(b,y2)
line(b, y2)-(c,y3)
line(c, y3)-(a,y1)
End Sub

Si acuma, demo-urile:
Draw3DPoint Demo:

Code:
#include once "brawn.bi"

dim x As integer, y As integer, z As integer
Screen 16

Do
cls
For x = 1 to 600 step 10
For y = 1 to 400 step 10
For z = 1 to 10
Draw3DPointCLR(x,y,z,2)
Next z
Next y
Next x

For x = 400 to 600 step 5
For y = 200 to 400 step 3
For z = 1 to 32
Draw3DPointCLR(x,y,z,5)
Next z
Next y
Next x

ScreenSync
loop

Incercarea de a crea un triunghi 3D care se roteste folosind Stanga si Dreapta:

Code:
#include once "brawn.bi"
#include "fbgfx.bi"
Using FB


'Punctele de origine
dim x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer
x1 = 200
x2 = 200
x3 = 400
y1 = 150
y2 = 250
y3 = 150
z1 = 1
z2 = 1
z3 = 1
'Noile Puncte
dim old_x1 As integer, old_y1 As integer, old_z1 As integer, old_x2 As integer, old_y2 As integer, old_z2 As integer, old_x3 As integer, old_y3 As integer, old_z3 As integer
old_x1 = x1
old_x2 = x2
old_x3 = x3
old_y1 = y1
old_y2 = y2
old_y3 = y3
old_z1 = z1
old_z2 = z2
old_z3 = z3

Screen 16

Do
cls

If multikey(SC_RIGHT) Then
x1  = x1*Cos(45) - y1*sin(45)
y1  = y1*Cos(45) - x1*sin(45)
old_x1 = x1
old_y1 = y1
EndIf

If multikey(SC_Left) Then
x1  = -(x1*Cos(45) - y1*sin(45))
y1  = -(y1*Cos(45) - x1*sin(45))
old_x1 = x1
old_y1 = y1
EndIf
Draw3DTriangle(old_x1,old_y1,old_z1,old_x2,old_y2,old_z2,old_x3,old_y3,old_z3)

ScreenSync
loop

Desen facut folosind: Draw3DQuadrilater, Draw3DTriangle si Fill3D:


Code:
#include once "brawn.bi"

dim xm As integer, ym As integer, buttons As integer
dim react As integer
dim res As Integer


Screen 16
Do
cls
res = getmouse (xm, ym, , buttons)
Locate 1, 1
If res <> 0 Then
Print "Mouse not available or not on window"
Else
Print Using "Mouse position: ###:### "; xm; ym;
EndIf
 
Draw3DQuadrilater(100,80,1,200,80,1,200,180,1,600,100,3)
Fill3D(101,199,81,179,1,3)

ScreenSync
loop&nbsp;

Download: Demo-uri + Surse atasate!


Apropos de proiectari forme 3D intr-un spatiu 2D, incearca sa faci un program care sa simuleze screensaver-ul "Starfield" din Windows. Ai niste puncte ("stele") la distante variabile si se apropie de monitor.

Bafta

O idee buna, o sa ma ocup si de ea Big grin
Logged

13-12-2008, 23:33 Twitt ::
Pagini: [1]
Print
SkullBox Forum  |  Development  |  Basic si Fox  |  Topic: [FreeBASIC/QBasic]Functii desenare