3D-mal auf die harte Tour

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

gigi

Betreff: 3D-mal auf die harte Tour

BeitragFr, Feb 01, 2008 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe mir mal gedacht wie wohl so ein 3D-Modus funktioniert. Ein paar denkerische Anstöße später hab ich mich entschlossen es einfach mal auszuprobieren.Herausgekommen ist das hier:Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()
x=100
y=100
xf=100
yf=100
x2=300
y2=100
While Not KeyHit(1)
   Cls
   Line x,y,x-xf,y-yf
   Line x,y,x+200,y
   Line x,y,x,y+200
   Line x+200,y,x+200,y+200
   Line x,y+200,x+200,y+200
   Line x-xf,y-yf+200,x-xf+200,y-yf+200
   Line x-xf,y-yf+200,x,y+200
   Line x-xf+200,y-yf+200,x+200,y+200
   Line x2,y2,x2-xf,y2-yf
   Line x2-xf,y2-yf,x2-xf-200,y2-yf
   Line x2-xf,y2-yf,x2-xf,y2-yf+200
   Line x-xf,y-yf,x-xf,y-yf+200
   If KeyDown(203) Then
      xf=xf+1
   EndIf
   If KeyDown(205) Then
      xf=xf-1
   EndIf
   If KeyDown(208) Then
      yf=yf+1
   EndIf
   If KeyDown(200) Then
      yf=yf-1
   EndIf
Flip
Wend
End

Nun meine Fragen:
-Wie wäre eine Textur umzusetzen?
-Habt ihr weitere Ergänzuhngen?
-Was hat es mit der z-achse auf sich?(Was sie sein soll weiß ich ja, bloß wie kann man sie hier umsetzen?)


Mfg Gigi


P.S.:Was nicht ob das hier eventuell woanders hingehört, ist ja eventuell B3D?Naja...
Anfänger Tut von mir:
http://www.blitzforum.de/forum...hp?t=26185

ToeB

BeitragFr, Feb 01, 2008 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das Sieht schonmal gut aus aber wenn man z.b. zu lange nach rechts oder links drückt, dann wird der Würfel nur in die länge gezogen, aber nicht gedreht Wink

mfg Crack93
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

gigi

BeitragFr, Feb 01, 2008 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstma danke für die Antwort,und du hast recht,keine idee fürs drehen...Hab jetzt eine Funktion für die Box geschriebenCode: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()
Global xf=100
Global yf=100
Type Thing
Field x
Field y
End Type
box.thing=New thing
box\x=400
box\y=300
Function Draw(x,y,x2,y2,c1,c2,c3)
Color c1,c2,c3
   Line x,y,x-xf,y-yf
   Line x,y,x+200,y
   Line x,y,x,y+200
   Line x+200,y,x+200,y+200
   Line x,y+200,x+200,y+200
   Line x-xf,y-yf+200,x-xf+200,y-yf+200
   Line x-xf,y-yf+200,x,y+200
   Line x-xf+200,y-yf+200,x+200,y+200
   Color c1-50,c2-50,c3-50
   Line x2,y2,x2-xf,y2-yf
   Line x2-xf,y2-yf,x2-xf-200,y2-yf
   Line x2-xf,y2-yf,x2-xf,y2-yf+200
   Line x-xf,y-yf,x-xf,y-yf+200
End Function
While Not KeyHit(1)
   Cls
   draw box\x,box\y,box\x+200,box\y,155,155,155

   If KeyDown(203) Then
      xf=xf+1
   EndIf
   If KeyDown(205) Then
      xf=xf-1
   EndIf
   If KeyDown(208) Then
      yf=yf+1
   EndIf
   If KeyDown(200) Then
      yf=yf-1
   EndIf
Flip
Wend
End
Anfänger Tut von mir:
http://www.blitzforum.de/forum...hp?t=26185

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Feb 01, 2008 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ein kleine 3D-Starfield-Simulation. Es soll lediglich das berechnen der Z-Tiefe zeigen. Ich habe damals echt lange an dieser Formel rumgetüfftelt. Wichtig ist hier nur, dass ich die Tiefe gleichgesetzt habe mit der Dim-Position. Die Dim-Position ist also die Tiefe, und die X/Y-Position eines jeden Sternes wird dann bis zum Ende des Dims rauf kopiert, was eventuell etwas schwiriger zu verstehen sein könnte.

Code: [AUSKLAPPEN]
;002-08-05-2002;
Graphics 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(50)
Local st#=500 ; Anzahl der Sterne
Local zk#=200 ; Verzerungsfaktor

Local ft#=st/256
Local qq,zom#,x1,y1

Dim xx#(st)
Dim yy#(st)

For qq=0 To st
   xx(qq)=Rnd(-400,400)
   yy(qq)=Rnd(-300,300)
Next




While Not KeyHit(1)
   xx(0)=Rnd(-400,400)
   yy(0)=Rnd(-300,300)
   
   For qq=0 To st-1
      xx(st-qq)=xx(st-1-qq)
      yy(st-qq)=yy(st-1-qq)
      
      ;DREHEN>>
      xx(st-qq)=xx(st-qq)-yy(st-qq)/100
      yy(st-qq)=yy(st-qq)+xx(st-qq)/100
      ;<<DREHEN

      zom#=(st-qq)/zk
      x1=400+(xx(qq)/zom)
      y1=300+(yy(qq)/zom)
      
      Color qq/ft,qq/ft,qq/ft
      Rect x1,y1,4/zom,4/zom
   Next
   
   WaitTimer(Timer)
   Flip 0
   Cls
Wend
End


Eben noch ein Timer und Locals eingebaut...

edit1:Noch eben schnell mal eine Kameradrehung eingebaut...
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
  • Zuletzt bearbeitet von hectic am Fr, Feb 01, 2008 22:18, insgesamt einmal bearbeitet
 

gigi

BeitragFr, Feb 01, 2008 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Schick, schick. Gut zu verstehen und weniger Code.
Anfänger Tut von mir:
http://www.blitzforum.de/forum...hp?t=26185

das wurgel

BeitragSa, Feb 02, 2008 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab hier ne Function, damit lässt sich das ganz einfach berechnen, auch mit dem Drehen und so.
Code: [AUSKLAPPEN]
Const lines=12
Global x2d, y2d
Dim lineX(lines, 1)                  
Dim lineY(lines, 1)   
Dim lineZ(lines, 1)   
distanz# = 400   
vx#=0
vy#=0
vz#=0

Gosub linien

Graphics 640,480

SetBuffer BackBuffer()

While Not KeyDown(1)
   distanz = distanz + KeyDown(201)-KeyDown(209)
   vx# = vx# + KeyDown(208)-KeyDown(200)   
   vy# = vy# + KeyDown(203)-KeyDown(205)                              
   vz# = 0                                 
   For i = 1To lines
      rechne_3D_zu_2D(lineX(i,0), lineY(i,0), lineZ(i,0), vx#, vy#, vz#, distanz)
      altX=x2d
      altY=y2d
      rechne_3D_zu_2D(lineX(i,1), lineY(i,1), lineZ(i,1), vx#, vy#, vz#, distanz)
      
      Color 255,255,255
      
      Line altx,alty,x2d,y2d

      Color 0,0,255
      Rect altx-2,alty-2,4,4
      Rect x2d-2,y2d-2,4,4
   Next                  
   Flip                                    
   Cls                                    
Wend

Function rechne_3D_zu_2D(x,y,z, vx#, vy#, vz#, distanz)
   ty# = ((y * Cos(vx#)) - (z * Sin(vx#)))
   tz# = ((y * Sin(vx#)) + (z * Cos(vx#)))
   tx# = ((x * Cos(vy#)) - (tz# * Sin(vy#)))
   tz# = ((x * Sin(vy#)) + (tz# * Cos(vy#)))
      
   ox# = tx#
   tx# = ((tx# * Cos(vz#)) - (ty# * Sin(vz#)))
   ty# = ((ox# * Sin(vz#)) + (ty# * Cos(vz#)))
      
   x2d  = Int(512 * (tx#) / (distanz - (tz#))) + 320
   y2d  = Int(240 - (512 * ty#) / (distanz - (tz#)))
End Function

.linien
LineX(1, 0) = 80
LineY(1, 0) = 80
LineZ(1, 0) = 80
LineX(1, 1) = -80
LineY(1, 1) = 80
LineZ(1, 1) = 80

LineX(2, 0) = -80
LineY(2, 0) = 80
LineZ(2, 0) = 80
LineX(2, 1) = -80
LineY(2, 1) = -80
LineZ(2, 1) = 80

LineX(3, 0) = -80
LineY(3, 0) = -80
LineZ(3, 0) = 80
LineX(3, 1) = 80
LineY(3, 1) = -80
LineZ(3, 1) = 80

LineX(4, 0) = 80
LineY(4, 0) = -80
LineZ(4, 0) = 80
LineX(4, 1) = 80
LineY(4, 1) = 80
LineZ(4, 1) = 80

LineX(5, 0) = 80
LineY(5, 0) = 80
LineZ(5, 0) = 80
LineX(5, 1) = 80
LineY(5, 1) = 80
LineZ(5, 1) = -80

LineX(6, 0) = -80
LineY(6, 0) = 80
LineZ(6, 0) = 80
LineX(6, 1) = -80
LineY(6, 1) = 80
LineZ(6, 1) = -80

LineX(7, 0) = -80
LineY(7, 0) = -80
LineZ(7, 0) = 80
LineX(7, 1) = -80
LineY(7, 1) = -80
LineZ(7, 1) = -80

LineX(8, 0) = 80
LineY(8, 0) = -80
LineZ(8, 0) = 80
LineX(8, 1) = 80
LineY(8, 1) = -80
LineZ(8, 1) = -80


LineX(9, 0) = 80
LineY(9, 0) = 80
LineZ(9, 0) = -80
LineX(9, 1) = -80
LineY(9, 1) = 80
LineZ(9, 1) = -80

LineX(10, 0) = -80
LineY(10, 0) = 80
LineZ(10, 0) = -80
LineX(10, 1) = -80
LineY(10, 1) = -80
LineZ(10, 1) = -80

LineX(11, 0) = -80
LineY(11, 0) = -80
LineZ(11, 0) = -80
LineX(11, 1) = 80
LineY(11, 1) = -80
LineZ(11, 1) = -80

LineX(12, 0) = 80
LineY(12, 0) = -80
LineZ(12, 0) = -80
LineX(12, 1) = 80
LineY(12, 1) = 80
LineZ(12, 1) = -80
Return

Was hält ihr davon?
1 ist ungefähr 3
 

Gast

BeitragSa, Feb 02, 2008 20:09
Antworten mit Zitat
Super wurgel, Wow...
Das ist perfekt, (ich glaub) perspektivisch sogar korrekt... Shocked
Das ist schon fast B3D Very Happy
 

gigi

BeitragSa, Feb 02, 2008 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Verwirrend.Sieht aber gut aus!!! Mit Sin() und Cos() hab ich aberso garnichts am Hut...
Anfänger Tut von mir:
http://www.blitzforum.de/forum...hp?t=26185

peacemaker

BeitragSa, Feb 02, 2008 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht könnte mans so machen, wies die Graka macht...?

Berechnen wie die Vertizes stehen, und dann einfach eine Art rasterizern. Gibt ja genug Funktionen dafür (z.B. auf Sillizium-net oder so)

mfG
~Tehadon~
www.tehadon.de
http://www.blitzforum.de/worklogs/14/

Eingeproggt

BeitragSa, Feb 02, 2008 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Ansätze für solche Vorhaben haben mich auch mal beschäftigt.. noch in der guten alten Zeit, wo ich mit Flash das Programmieren gelernt hatte Smile
Wen es interessiert, hier die swf-Datei inklusive Anleitung (Verwendbar auf FlashPlayer 7 oder höher)

http://www.bbbemil.serveftp.or...erator.rar

Achja, ich weiß, dass es nix mit BB zu tun hat und dass es eig ziemlich bescheiden ist.. man kann eben nichtmal drehen.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

NightPhoenix

BeitragSo, Feb 03, 2008 11:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Die berechnung ist fast korrekt. Obwohl der 2D Würfel genau die selben Ausmaße hat wie der in 3D ist eine Kantenlänge in einer Perspektive immer länger.

Siehe diesen Code...
Sofort nach Programmstart erkennt man dass am 3D Würfel die untere kante länger ist als die beim 2D, aber die Höhen beider Würfel sind gleich, obwohl sie an allen Seiten gleiche kantenlängen haben.
-> Da gibts ne ungenauigkeit Wink bzw. mehr oder weniger ein z-buffer problem ^^

Code: [AUSKLAPPEN]
Const lines=12
Global x2d, y2d
Dim lineX(lines, 1)                 
Dim lineY(lines, 1)   
Dim lineZ(lines, 1)   
distanz# = 600   
vx#=0
vy#=0
vz#=0

Gosub linien

Graphics3D 640,480,32,2

SetBuffer BackBuffer()

licht=CreateLight(1)
kamera=CreateCamera()
   PositionEntity kamera,2,0,-5
Cube=CreateCube()
WireFrame(1)








While Not KeyDown(1)

   distanz = distanz + KeyDown(201)-KeyDown(209)
   vx# = vx# + KeyDown(208)-KeyDown(200)   
   vy# = vy# + KeyDown(203)-KeyDown(205)
   vz# = 0

   RotateEntity cube,-vx#,-vy#,0


RenderWorld
UpdateWorld               


                                                             
   For i = 1To lines
      rechne_3D_zu_2D(lineX(i,0), lineY(i,0), lineZ(i,0), vx#, vy#, vz#, distanz)
      altX=x2d
      altY=y2d
      rechne_3D_zu_2D(lineX(i,1), lineY(i,1), lineZ(i,1), vx#, vy#, vz#, distanz)
     
      Color 255,255,255
     
      Line altx,alty,x2d,y2d

      Color 0,0,255
      Rect altx-2,alty-2,4,4
      Rect x2d-2,y2d-2,4,4
   Next
   Flip
   Cls                                                                   
Wend

Function rechne_3D_zu_2D(x,y,z, vx#, vy#, vz#, distanz)
   ty# = ((y * Cos(vx#)) - (z * Sin(vx#)))
   tz# = ((y * Sin(vx#)) + (z * Cos(vx#)))
   tx# = ((x * Cos(vy#)) - (tz# * Sin(vy#)))
   tz# = ((x * Sin(vy#)) + (tz# * Cos(vy#)))
     
   ox# = tx#
   tx# = ((tx# * Cos(vz#)) - (ty# * Sin(vz#)))
   ty# = ((ox# * Sin(vz#)) + (ty# * Cos(vz#)))
     
   x2d  = Int(512 * (tx#) / (distanz - (tz#))) + 320
   y2d  = Int(240 - (512 * ty#) / (distanz - (tz#)))
End Function

.linien
LineX(1, 0) = 80
LineY(1, 0) = 80
LineZ(1, 0) = 80
LineX(1, 1) = -80
LineY(1, 1) = 80
LineZ(1, 1) = 80

LineX(2, 0) = -80
LineY(2, 0) = 80
LineZ(2, 0) = 80
LineX(2, 1) = -80
LineY(2, 1) = -80
LineZ(2, 1) = 80

LineX(3, 0) = -80
LineY(3, 0) = -80
LineZ(3, 0) = 80
LineX(3, 1) = 80
LineY(3, 1) = -80
LineZ(3, 1) = 80

LineX(4, 0) = 80
LineY(4, 0) = -80
LineZ(4, 0) = 80
LineX(4, 1) = 80
LineY(4, 1) = 80
LineZ(4, 1) = 80

LineX(5, 0) = 80
LineY(5, 0) = 80
LineZ(5, 0) = 80
LineX(5, 1) = 80
LineY(5, 1) = 80
LineZ(5, 1) = -80

LineX(6, 0) = -80
LineY(6, 0) = 80
LineZ(6, 0) = 80
LineX(6, 1) = -80
LineY(6, 1) = 80
LineZ(6, 1) = -80

LineX(7, 0) = -80
LineY(7, 0) = -80
LineZ(7, 0) = 80
LineX(7, 1) = -80
LineY(7, 1) = -80
LineZ(7, 1) = -80

LineX(8, 0) = 80
LineY(8, 0) = -80
LineZ(8, 0) = 80
LineX(8, 1) = 80
LineY(8, 1) = -80
LineZ(8, 1) = -80


LineX(9, 0) = 80
LineY(9, 0) = 80
LineZ(9, 0) = -80
LineX(9, 1) = -80
LineY(9, 1) = 80
LineZ(9, 1) = -80

LineX(10, 0) = -80
LineY(10, 0) = 80
LineZ(10, 0) = -80
LineX(10, 1) = -80
LineY(10, 1) = -80
LineZ(10, 1) = -80

LineX(11, 0) = -80
LineY(11, 0) = -80
LineZ(11, 0) = -80
LineX(11, 1) = 80
LineY(11, 1) = -80
LineZ(11, 1) = -80

LineX(12, 0) = 80
LineY(12, 0) = -80
LineZ(12, 0) = -80
LineX(12, 1) = 80
LineY(12, 1) = 80
LineZ(12, 1) = -80
Return

das wurgel

BeitragSo, Feb 03, 2008 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber wenn man den Zoom bei der Kamera auf 1.5 stellt stimmts wieder. Der Zoom ist ja was relatives, es gibt keinen "normalen" zoom, das hängt ja von dem Betrachter ab.
Code: [AUSKLAPPEN]
Const lines=12
Global x2d, y2d
Dim lineX(lines, 1)                 
Dim lineY(lines, 1)   
Dim lineZ(lines, 1)   
distanz# = 425 
vx#=0
vy#=0
vz#=0

Gosub linien

Graphics3D 640,480,32,2

SetBuffer BackBuffer()

licht=CreateLight(1)
kamera=CreateCamera()

CameraZoom kamera, 1.5

PositionEntity kamera,2,0,-5
Cube=CreateCube()
WireFrame(1)

While Not KeyDown(1)

   distanz = distanz + KeyDown(201)-KeyDown(209)
   vx# = vx# + KeyDown(208)-KeyDown(200)   
   vy# = vy# + KeyDown(203)-KeyDown(205)
   vz# = 0

   RotateEntity cube,-vx#,-vy#,0


RenderWorld
UpdateWorld               


                                                             
   For i = 1To lines
      rechne_3D_zu_2D(lineX(i,0), lineY(i,0), lineZ(i,0), vx#, vy#, vz#, distanz)
      altX=x2d
      altY=y2d
      rechne_3D_zu_2D(lineX(i,1), lineY(i,1), lineZ(i,1), vx#, vy#, vz#, distanz)
     
      Color 255,255,255
     
      Line altx,alty,x2d,y2d

      Color 0,0,255
      Rect altx-2,alty-2,4,4
      Rect x2d-2,y2d-2,4,4
   Next
   Flip
   Cls                                                                   
Wend

Function rechne_3D_zu_2D(x,y,z, vx#, vy#, vz#, distanz)
   ty# = ((y * Cos(vx#)) - (z * Sin(vx#)))
   tz# = ((y * Sin(vx#)) + (z * Cos(vx#)))
   tx# = ((x * Cos(vy#)) - (tz# * Sin(vy#)))
   tz# = ((x * Sin(vy#)) + (tz# * Cos(vy#)))
     
   ox# = tx#
   tx# = ((tx# * Cos(vz#)) - (ty# * Sin(vz#)))
   ty# = ((ox# * Sin(vz#)) + (ty# * Cos(vz#)))
     
   x2d  = Int(512 * (tx#) / (distanz - (tz#))) + 320
   y2d  = Int(240 - (512 * ty#) / (distanz - (tz#)))
End Function

.linien
LineX(1, 0) = 80
LineY(1, 0) = 80
LineZ(1, 0) = 80
LineX(1, 1) = -80
LineY(1, 1) = 80
LineZ(1, 1) = 80

LineX(2, 0) = -80
LineY(2, 0) = 80
LineZ(2, 0) = 80
LineX(2, 1) = -80
LineY(2, 1) = -80
LineZ(2, 1) = 80

LineX(3, 0) = -80
LineY(3, 0) = -80
LineZ(3, 0) = 80
LineX(3, 1) = 80
LineY(3, 1) = -80
LineZ(3, 1) = 80

LineX(4, 0) = 80
LineY(4, 0) = -80
LineZ(4, 0) = 80
LineX(4, 1) = 80
LineY(4, 1) = 80
LineZ(4, 1) = 80

LineX(5, 0) = 80
LineY(5, 0) = 80
LineZ(5, 0) = 80
LineX(5, 1) = 80
LineY(5, 1) = 80
LineZ(5, 1) = -80

LineX(6, 0) = -80
LineY(6, 0) = 80
LineZ(6, 0) = 80
LineX(6, 1) = -80
LineY(6, 1) = 80
LineZ(6, 1) = -80

LineX(7, 0) = -80
LineY(7, 0) = -80
LineZ(7, 0) = 80
LineX(7, 1) = -80
LineY(7, 1) = -80
LineZ(7, 1) = -80

LineX(8, 0) = 80
LineY(8, 0) = -80
LineZ(8, 0) = 80
LineX(8, 1) = 80
LineY(8, 1) = -80
LineZ(8, 1) = -80


LineX(9, 0) = 80
LineY(9, 0) = 80
LineZ(9, 0) = -80
LineX(9, 1) = -80
LineY(9, 1) = 80
LineZ(9, 1) = -80

LineX(10, 0) = -80
LineY(10, 0) = 80
LineZ(10, 0) = -80
LineX(10, 1) = -80
LineY(10, 1) = -80
LineZ(10, 1) = -80

LineX(11, 0) = -80
LineY(11, 0) = -80
LineZ(11, 0) = -80
LineX(11, 1) = 80
LineY(11, 1) = -80
LineZ(11, 1) = -80

LineX(12, 0) = 80
LineY(12, 0) = -80
LineZ(12, 0) = -80
LineX(12, 1) = 80
LineY(12, 1) = 80
LineZ(12, 1) = -80
Return
1 ist ungefähr 3

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group