3D-mal auf die harte Tour
Übersicht

gigiBetreff: 3D-mal auf die harte Tour |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Schick, schick. Gut zu verstehen und weniger Code. | ||
Anfänger Tut von mir:
http://www.blitzforum.de/forum...hp?t=26185 |
![]() |
das wurgel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat |
|
---|---|---|
Super wurgel, Wow...
Das ist perfekt, (ich glaub) perspektivisch sogar korrekt... ![]() Das ist schon fast B3D ![]() |
||
gigi |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group