Flächen wollen nicht

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Matthias

Betreff: Flächen wollen nicht

BeitragSo, März 25, 2007 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay.
Also ich habe da ein komiches problem. Also ich möchte einen Würfel in 3DAnsicht auf dem Bildschirm darstellen. Und so weit ist auch alles gut. Die 8Eckpunkte sind gesetzt und auch 4Flächen(Quads).
Das Wireframe system zeigt auch alles vernünftig an. Selbst ein ZBuffer ist enthalt. Nur leider werden die Flächen nicht so dargestellt wie das WireFrame-Netz es anzeigt.
Ich hoffe mir kann jemand helfen.

Also hir der Code.

Code: [AUSKLAPPEN]

Global ScrX=800,ScrY=600
Graphics ScrX,ScrY,32,2

Dim Sinn#(360),Coss#(360)


Dim Obj3DPunkt(50,2000,2),ObjQuad(50,2000,4)
Dim Bereich(105,105,105)
Global Wx,Wy,Wz=-90,K#=.45

Global U0=400,V0=400
Global U2D,V2D,W2D
For I=0 To 359:Sinn(I)=Sin(I):Coss(I)=Cos(I):Next
;"-------Sin/Cos Vorberechnen-----------------"


;             E----------------F
;           / :               /!
;         /   :             /  !
;       /     :           /    !
;     /       :         /      !
;    A----------------B        !
;    !        :       !        !
;    !        :       !        !
;    !        :       !        !
;    !        :       !        !
;    !       .G.......!........H
;    !     .          !      / 
;    !   .            !    /   
;    ! .              !  /   
;    C----------------D/
;                 



Set3DPkt(0,"A",-50,-50,-50)
Set3DPkt(0,"B", 50,-50,-50)
Set3DPkt(0,"C",-50, 50,-50)
Set3DPkt(0,"D", 50, 50,-50)
Set3DPkt(0,"E",-50,-50, 50)
Set3DPkt(0,"F", 50,-50, 50)
Set3DPkt(0,"G",-50, 50, 50)
Set3DPkt(0,"H", 50, 50, 50)

                     ;Farbe
SetQuad(0,0,"ABDC",-1)
SetQuad(0,1,"BFHD",-65536)
SetQuad(0,2,"FEGH",-1000)
SetQuad(0,3,"AEGC",-20000)





SetBuffer BackBuffer()
Repeat:
;"----------Drehwinkel ändern"
Cls
Select KeyDown(203):Case 1:WY=WY-1:End Select
Select KeyDown(205):Case 1:WY=WY+1:End Select
Select KeyDown(200):Case 1:WX=WX-1:End Select
Select KeyDown(208):Case 1:WX=WX+1:End Select
Select KeyDown(201):Case 1:Wz=Wz-1:End Select
Select KeyDown(209):Case 1:Wz=Wz+1:End Select



Select WX>359:Case 1:WX=WX-360:End Select
Select WY>359:Case 1:WY=WY-360:End Select
Select WZ>359:Case 1:WZ=WZ-360:End Select

Select WX<0:Case 1:WX=360+WX:End Select
Select WY<0:Case 1:WY=360+WY:End Select
Select WZ<0:Case 1:WZ=360+WZ:End Select

Anzeigen()
WireFramme()



;--------------Flaps Zäler----------------"
FPSZa=FPSZa+1:Select MilliSecs()>FPSTimer+999:Case 1:FPSTimer=MilliSecs()
FPS=FPSZa:FPSZa=0:End Select

Color 255,0,0:Text 10,10,FPS
Flip




Until KeyDown(1)=1
End


;"Zeigt das Object auf dem Bildschirm an------"
Function Anzeigen()
LockBuffer
For ZZ=0 To 100
For ZX=0 To 100:For ZY=0 To 100
Farbe=Bereich(ZX,ZY,ZZ)
Select Farbe<0:Case 1

Calk3Dto2D(ZX-50,ZY-50,ZZ-50)
Select (W2D+50)>ZZ:Case 1
WritePixelFast U2D,V2D,Farbe
End Select
End Select
Next:Next:Next
UnlockBuffer
End Function



;"------------Zeigt das Gitternetz an-----------------"
Function WireFramme()
Repeat
V1=ObjQuad(0,Quad,0):V2=ObjQuad(0,Quad,1)
V3=ObjQuad(0,Quad,2):V4=ObjQuad(0,Quad,3)
Color 0,0,ObjQuad(0,Quad,4)
Select V1+V2:Case 0:Return:End Select

X=Obj3DPunkt(0,V1,0):Y=Obj3DPunkt(0,V1,1):Z=Obj3DPunkt(0,V1,2)
Calk3Dto2D(X,Y,Z):X1=U2D:Y1=V2D


X=Obj3DPunkt(0,V2,0):Y=Obj3DPunkt(0,V2,1):Z=Obj3DPunkt(0,V2,2)
Calk3Dto2D(X,Y,Z):X2=U2D:Y2=V2D

X=Obj3DPunkt(0,V3,0):Y=Obj3DPunkt(0,V3,1):Z=Obj3DPunkt(0,V3,2)
Calk3Dto2D(X,Y,Z):X3=U2D:Y3=V2D

X=Obj3DPunkt(0,V4,0):Y=Obj3DPunkt(0,V4,1):Z=Obj3DPunkt(0,V4,2)
Calk3Dto2D(X,Y,Z):X4=U2D:Y4=V2D


Line X1,Y1,X2,Y2
Line X2,Y2,X3,Y3
Line X3,Y3,X4,Y4
Line X4,Y4,X1,Y1

Quad=Quad+1
Forever
End Function





;"Berechnet aus die 3DKoordinaten die 2DCoordinaten
Function Calk3Dto2D(X,Y,Z)
DY#=Coss(Wx)*Y-Sinn(Wx)*Z:Z=Sinn(WX)*Y+Coss(WX)*Z:Y=DY
DX#=Coss(Wy)*X-Sinn(Wy)*Z:Z=Sinn(WY)*X+Coss(Wy)*Z:X=DX
DX#=Coss(Wz)*X-Sinn(Wz)*Y:Y=Sinn(Wz)*X+Coss(Wz)*Y:X=DX
U2D=Z*K-Y+U0
V2D=X-Z*K+V0
W2D=Z
End Function 



;"-----Eckpunkte-----------
Function Set3DPkt(O,P$,X,Y,Z)
Pu=Asc(P$)-65
Obj3DPunkt(O,Pu,0)=X
Obj3DPunkt(O,Pu,1)=Y
Obj3DPunkt(O,Pu,2)=Z
End Function





;"--------Fläschen---Erstellen-----------"
Function SetQuad(O,P,Stringg$,Farbe)
N1=Asc(Left(Stringg$,1))-65:N2=Asc(Mid(Stringg$,2,1))-65
N3=Asc(Mid(Stringg$,3,1))-65:N4=Asc(Right(Stringg$,1))-65

ObjQuad(O,P,0)=N1
ObjQuad(O,P,1)=N2
ObjQuad(O,P,2)=N3
ObjQuad(O,P,3)=N4
ObjQuad(O,P,4)=Farbe
;----------------Problemzonne------------------------------
X1=Obj3DPunkt(0,N1,0):Y1=Obj3DPunkt(0,N1,1):Z1=Obj3DPunkt(0,N1,2)
X2=Obj3DPunkt(0,N2,0):Y2=Obj3DPunkt(0,N2,1):Z2=Obj3DPunkt(0,N2,2)
X3=Obj3DPunkt(0,N3,0):Y3=Obj3DPunkt(0,N3,1):Z3=Obj3DPunkt(0,N3,2)
X4=Obj3DPunkt(0,N4,0):Y4=Obj3DPunkt(0,N4,1):Z4=Obj3DPunkt(0,N4,2)
;AppTitle X1+"  "+X2+"  "+Y1+"  "+Y3+"  "+Z1+" "+Z2

For ZX=X1 To X2:For ZY=Y1 To Y4:For ZZ=Z1 To Z2

Bereich(ZX+50,ZY+50,ZZ+50)=Farbe

Next:Next:Next

End Function

Auf Blitz3D ausweichen ist keine Lösung des Problems

Vertex

BeitragSo, März 25, 2007 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum berechnest du den Würfel denn überhaupt so kompliziert?
Vllt. ist das für dich dann interessant:
http://vertex.dreamfall.at/sr.zip

Denn in deiner Lösung einen ZBuffer zu integrieren sehe ich als sehr kompliziert an. Mit dem Code von mir oben, kannst du die ScreenZ Werte einfach mittels Scanlien interpolieren(genauso wie U und V Koordinaten, für einfaches Texturemapping) und in den ZBuffer schreiben / vergleichen.

mfg olli
vertex.dreamfall.at | GitHub
 

Matthias

BeitragSo, März 25, 2007 18:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sehe in deinem Beispiel mur Punkte. Aber keine Flächen. Und mir geht es eigentlich darum Flächen im Raum Pixel für Pixel zu berechnen. Und auch nicht mit lienien zu vebinden.

Vertex

BeitragSo, März 25, 2007 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau, und hier kommt Scanline ins Spiel. Im Groben funktioniert der so:
Du suchst Minimum und Maximum der ScreenY - Koordinaten für das Polygon. Jetzt lässt du eine ScanlineY in einer For-Schleife von Minimum bis Maximum zählen. In einer Liste werden die Schnittpunkte mit dem Poygon gespeichert. Die X Koordinaten der Schnittpunkte sortierst aufsteigend. Nun lässt du eine zweite For-Schleife von 1 bis Anzahl-Schnittpunkte Step 2 zählen und Zeichnest eine Linie(Schnittpunkt[Index - 1]\X, ScanlineY, Schnittpunkt[Index]\X, ScanlineY)

Das füllt ein Polygon einfarbig aus. Willst du die Z Werte, Farben, UV Koordinaten usw. interpolieren, wird es schwieriger. Da musst du erst die Werte für die jeweiligen Schnittpunkte interpolieren und dann beim zeichnen der Linie von Schnittpunkt zu Schnittpunkt die Werte interpolieren. Das sind dann sogenannte Fragmente, die du in den Framebuffer(was auf dem bildschirm angezeigt wird) und ZBuffer(interpolierte ScreenZ Werte) speicherst. Wenn es einmal klappt, dann kannst du simple einfaches Texturemapping berechnen, auch mit Stencilbuffern arbeiten usw. Das ist dann kein Problem mehr.
mfg olli
vertex.dreamfall.at | GitHub

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group