3d flächen im Hintergrund

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Ebola33

Betreff: 3d flächen im Hintergrund

BeitragFr, Nov 12, 2004 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute. Ich habe folgenden Code geschrieben.

Code:

Dim ss$(10)
ss$(1)="Y,X = drehung um die X-Achse"
ss$(2)="A,S = drehung um die Y-Achse"
ss$(3)="Q,W = drehung um die Z-Achse"
ss$(4)="M,N = Skalieren"
ss$(5)="P   = Projektionsart wählen"
ss$(6)="Cursorblock = Objekt verschieben"
ss$(7)="ESC = Programm beenden"
ss$(8)="rechte Maustaste = Objekt rotieren."
Global ende
Const  maxatoms=400       ; Maximale Anzahl Ecken
Const  maxbonds=200       ; Maximale Anzahl Kanten
Const  dist=4             ; verzerrung für perspektivtransformation
Global transformflag = 1  ; 1 = parallel, 2 = perspektiv-transformation
Global xw#=0
Global yw#=0
Global zw#=0
Global faktor#=1.0
Global xcenter=400
Global ycenter=300
Global noa,nob
Dim koo# (maxatoms,3)  ;     1=x,    2=y,    3=z
Dim neu# (maxatoms,3)  ;     1=x,    2=y,    3=z
Dim lines# (maxatoms,2);     1=a,    2=b
Dim Ploot# (maxatoms,2);     1=x,    2=y

SeedRnd MilliSecs ()                   ; Zufallsgenerator zurücksetzen
Graphics 1024, 768, 16, 1              ; grafik Modus setzen
SetBuffer BackBuffer ()                ; Doublebuffering vorbereiten
readdata                               ; einlesen der 3d Daten
 

; Hauptschleife
While Ende = 0                   
Cls
Tastaturabfrage
drehung xw#,yw#,zw#
transform
zeichnen


yi=10
For i=1 To 8
Text 700,yi,ss$(i)
yi=yi+17
Next

Flip
Wend
; Hauptschleife



Function drehung(xw#,yw#,zw#)
For i=0 To noa-1
neu#(i,1)=koo#(i,1)
neu#(i,2)=koo#(i,2)*Cos(xw#)-koo#(i,3)*Sin(xw#)
neu#(i,3)=koo#(i,2)*Sin(xw#)+koo#(i,3)*Cos(xw#)
altx#=neu#(i,1)
alty#=neu#(i,2)
altz#=neu#(i,3)
neu#(i,1)=altx#*Cos(yw#)+altz#*Sin(yw#)
neu#(i,3)=-altx#*Sin(yw#)+altz#*Cos(yw#)
altx#=neu#(i,1)
alty#=neu#(i,2)
neu#(i,1)=altx#*Cos(zw#)-alty#*Sin(zw#)
neu#(i,2)=altx#*Sin(zw#)+alty#*Cos(zw#)
Next
End Function


Function perspektivtransform()
For i=0 To noa-1
If dist+neu#(i,3)<>0 Then
Ploot#(i,1)=50*faktor*(neu#(i,1)*dist/(neu#(i,3)+dist))+xcenter
ploot#(i,2)=50*faktor*(neu#(i,2)*dist/(neu#(i,3)+dist))+ycenter
EndIf
Next
End Function



Function paralleltransform()
For i=0 To noa-1
ploot#(i,1)=neu#(i,1)*50*faktor+xcenter
ploot#(i,2)=neu#(i,2)*50*faktor+ycenter
Next
End Function


Function transform()
If transformflag=0 Then paralleltransform
If transformflag=1 Then perspektivtransform
End Function


Function readdata()
Read noa ;anzahl der ecken einlesen
Read nob ; anzahl der kanten einlesen
For i=0 To noa-1
Read Char
koo#(i,1)=char
Read char
koo#(i,2)=char
Read char
koo#(i,3)=char
Next
For i=0 To nob-1
Read char
lines#(i,1)=char
Read char
lines#(i,2)=char
Next
End Function


Function zeichnen()
For i=0 To nob-1
Color 255,255,255
Line ploot#(lines#(i,1),1),ploot#(lines#(i,1),2),ploot#(lines#(i,2),1),ploot#(lines#(i,2),2)
Color 255,0,0
Text ploot#(i,1),ploot#(i,2),Str$(i)
Color 255,255,255
Next
End Function



;********************************************** Tastaturabfrage ***********************************************
Function Tastaturabfrage()
lastrichtung=0
If KeyDown(1) Then Ende = 1                           ; Beenden wenn Esc Taste gedrückt
If KeyDown(200)  Then ycenter=ycenter-5  :xw#=xw#+0.05
If KeyDown(208) Then  ycenter=ycenter+5  :xw#=xw#-0.05
If KeyDown(203) Then  xcenter=xcenter-5  :yw#=yw#+0.05
If KeyDown(205) Then  xcenter=xcenter+5  :yw#=yw#-0.05
If KeyDown(45) Then xw#=xw#+1 ;x
If KeyDown(44) Then xw#=xw#-1 ;y
If KeyDown(31) Then yw#=yw#+1 ;s
If KeyDown(30) Then yw#=yw#-1 ;a
If KeyDown(17) Then zw#=zw#+1 ;w
If KeyDown(16) Then zw#=zw#-1 ;q
If KeyDown(49) Then faktor=faktor+0.01 ;n
If KeyDown(50) Then faktor=faktor-0.01 ;m
If KeyHit(25) Then transformflag=1-transformflag ;p

mxs=(MouseYSpeed())

mys=(MouseXSpeed())

If MouseDown(2) Then
yw#=yw#-mys
xw#=xw#-mxs
;zw#=zw#-mzs
EndIf
;negativ=links positiv=rechts MouseXSpeed


End Function
;********************************************** Tastaturabfrage ***********************************************
;
;
;
;
;
;
   
Data 8,12 ;anzahl ecken, anzahl kanten

Data -1.0,1.0,1.0  ;x,y,z koordinaten im raum
Data 1.0,1.0,1.0
Data 1.0,-1.0,1.0
Data -1.0,-1.0,1.0
Data 1.0,1.0,-1.0
Data 1.0,-1.0,-1.0
Data -1.0,-1.0,-1.0
Data -1.0,1.0,-1.0

Data 0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,7,1,4,3,6,2,5 ;miteinander verbundene ecken


Das ist eine einfache 3d drahtgitter engine für kleinere 3d objekte.
Jetzt zu meinem Problem. Wie kann ich herrausfinden welche Flächen des
3d Modells im Hintergrund bzw. von anderen Flächen verdeckt sind ?
Vielleicht hat jemand von euch schonmal ein änliches Programm geschrieben ? Bitte helft mir. Ich komm nicht weiter. Denkfehler

Mfg Ebola
ansteckend... Wink
verstaubtes Projekt : http://www.mitglied.lycos.de/ebola33/

BladeRunner

Moderator

BeitragFr, Nov 12, 2004 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Theorie dazu: Zu jeder Fläche die Normale berechnen. Wenn sie zu Dir zeigt (bin nimmer ganz sicher: positiv ist ?) ist auch die Fläche sichtbar.

EDIT: damit das klappt müssen alle Punkte einer Fläche gegen den Uhrzeigersinn erstellt werden (schlagt mich wenns nicht stimmt, ist etwas länger her).
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Splinner

BeitragFr, Nov 12, 2004 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich hab mir dienen code jetzt nicht durchgelesen aber ich habe auch schon mal so etwas ähnliches gemacht...

ich habe alles in linien unterteilt und dann die lieneien hintereinander weggemalt..der trick dabei ist das du die bilder,rects oder was auch immer
nach ganz unten "handlest" .... wenn man dann z.b. mit einem "player" o.ä. davor oder dahinter läufst steht er dahinter oder davor :p...ich habe das ganze mal bei einem strategiespiel gemacht.... so das die bäume über die häuser geragt haben.... das ist eigendlich ganz leicht...

Ebola33

BeitragFr, Nov 12, 2004 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist mir schon klar probiere hier gerade mit Flächenlisten rum.
Nur wenn sich das objekt um 180grad dreht sind diese nicht mehr gültig
und alles negiert sich.....beim würfel hier kein problem, aber bei größeren objekten ? Hmmmmm......verdammt Wink
ansteckend... Wink
verstaubtes Projekt : http://www.mitglied.lycos.de/ebola33/

Mattis_the_brain

BeitragSo, Nov 14, 2004 1:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ganze nennt sich Backfaceculling^^ du teilst einfch deine Seitenflächen deines Würfels in einzelne Dreiecke und prüfst mit dieser Function ob sie gesehn werden:

Code:

Function Culling(x1,y1,x2,y2,x3,y3)
   If((x2-x1) * (y3-y1) - (y2-y1) * (x3-x1) > 0) Return(True)
   Return(False)
End Function


Mathematisch nennt sich das ganze das Vektorprodukt^^

Die Koordinaten die du der Function übergeben musst sind die erechneten 2dKoordinaten auf dem Bildschirm.

Ebola33

BeitragSo, Nov 14, 2004 1:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke@Mattis, das hört sich recht gut an. Nur wenn es sich nicht um rechteckige Flächen handelt wird es problematisch...Dann muss ich ja alles in dreiecke aufteilen........das wird 'ne function...
ansteckend... Wink
verstaubtes Projekt : http://www.mitglied.lycos.de/ebola33/

Vertex

BeitragSo, Nov 14, 2004 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist, ein Polygon muss nicht immer eben sein. Wenn du jedoch davon ausgehst, kannst du dennoch dieses Verfahren darauf anwenden. Nimmst halt nur die ersten 3 projektzierten Eckpunkte dieses Polygons dafür. Müsst sogar für konkave Polygone auch gehen.
mfg olli
vertex.dreamfall.at | GitHub

Mattis_the_brain

BeitragSo, Nov 14, 2004 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Also unter Polygon Stell ich mir ne Fläche aus drei Punkten und drei kanten vor. Das was du meinst nennt sich galube ich Quand 4 Ecken 4 Kanten was natürlich einen "Knick" haben kann^^ aber an sonsten müsst das mit den ersten drei Punkten deiner Seitenfläche gehen. Aber denk an die Reihenfolge der Punkte!

BladeRunner

Moderator

BeitragSo, Nov 14, 2004 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Polygon ist eine Fläche aus "vielen" (=poly) Punkten. (Mindestzahl und auch das was meist darunter gesehen wird sind 3 Punkte da man sonst ja keine eindeutige Fläche hat).
Aber dennoch hat Vertex recht: Ein Polygon kann beliebig viele Punkte haben und muss nicht zwingend auf einer Ebene liegen.

Und was Du meintest war ein Quad.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Ebola33

BeitragMo, Nov 15, 2004 7:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Mann, ein Quad hat vier Räder und macht 'n Höllenspass wenn man drauf rumfährt;-)
aber ich glaub' mattis hat recht.....
ist aber auch egal. Ich habe es aufgegeben. In den letzten drei Tagen habe ich mehr Mathematik durchgenommen als in 10 Jahren zuvor.
Schnauze voll. Rendere vor. Trotzdem danke.Find' ich schön daß es ein Forum wie dieses gibt.
Werde euch über mein Projekt informieren.Sobald es fertig ist. versprochen.

MFG Ebola.
ansteckend... Wink
verstaubtes Projekt : http://www.mitglied.lycos.de/ebola33/

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group