3D mit 2D Befehlen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Flush

Betreff: 3D mit 2D Befehlen

BeitragSa, Feb 20, 2016 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Very Happy ,

ich habe bis jetzt alle 3D Routinen mit den B3D internen 3D Befehlen gecodet. Mich interessiert nun die Darstellung von 3D Objekten (Primitives) mittels der 2D Befehle von B3D. Ich weiß dass ich Projektions-, Transformations-, Rotationsmatrizen oder Quaternionen dazu verwenden muss. Ich habe mir die Finger fast schon wund gesucht Sad nach einfachen Tutorials und/ oder CodeSnippets. Auch in DotNet Sprachen mittels GDI+ derm Grahics Objekt oder sogar VB6 Codes mit GDI+, natürlich auch in den verschiedenen BB Dialekten wären willkommen.

Kennt Ihr da was vernünftiges? Question


Viele Grüße,
Flusher

DAK

BeitragSo, Feb 21, 2016 10:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Öhm, was willst du da machen?
Wenn du 3D machen willst, dann mach doch mit den dafür vorgesehenen 3D-Befehlen.
Wenn du 3D und 2D kombinieren willst (z.B. 3D für die Spielwelt, 2D für das Userinterface), dann mach zuerst RenderWorld() und danach die 2D-Befehle.
Gewinner der 6. und der 68. BlitzCodeCompo

Xeres

Moderator

BeitragSo, Feb 21, 2016 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht willst du eher Raytracing machen? Glaube nicht das Blitz3D so gut geeignet ist um selber 3D zu implementieren. Das fehlen von richtigen Klassen und Arrays fällt schon bei normalen Spielen störend auf.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Eingeproggt

BeitragSo, Feb 21, 2016 13:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube auch, du willst "selbst rendern"... Aber das ist tatsächlich mit B3D ziemlich aussichtslos.
Noobody hat sowas mal gemacht: https://www.blitzforum.de/gallery/1502/
Zitat:
Die Renderzeit für dieses Fraktal betrug ca. 3.5 Minuten


EDIT: Da ein noch schöneres Projekt: https://www.blitzforum.de/showcase/228/
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Chester

BeitragSo, Feb 21, 2016 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube, er will einfach einen Software Renderer basteln. Natürlich ist das mit BB relativ umständlich, die Matrixfunktionen muss man erstmal selber schreiben und die 2D-Befehle von BB sind relativ lahm.

Aber eigentlich ist der Rest nur Mathe und auch in BB umsetzbar. Zum Verständnis ist so ein Projekt sehr interessant. Vor Jahren hab ich mich damit auch mal beschäftigt. Vllt finde ich noch was in meinen Archiven.

Tankbuster

BeitragSo, Feb 21, 2016 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ist auchnoch etwas Schönes von Noo:
https://www.blitzforum.de/foru...hp?t=27624

Es macht allerdings nicht viel Sinn. Wenn man die Blitz3D Engine für 3D benutzen kann, sollte man es auch tun, weil es einfach viel schneller ist. Man kann ja durchaus "Retro"-Style Ergebnisse erzielen und trotzdem die effizientere Technik nutzen.
Real Time fähig ist diese Raycaster Sache nur bedingt und je höher die Auflösung, desto langsamer wird es.
Twitter
Download Jewel Snake!
Windows|Android

Chester

BeitragMo, Feb 22, 2016 1:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube der Großteil meiner Codes ging in den letzten Jahren flöten...

Aber um das Prinzip zu zeigen, hab ich mal schnell was gebastelt:

BlitzBasic: [AUSKLAPPEN]
Graphics 1024,768,32,2
SetBuffer BackBuffer()


Type TVertex
;coordinates
Field x#,y#,z#
; projected coordinates
Field xp#, yp#, zp#, wp#
; viewport coordinates
Field xw#, yw#
End Type


Type TTriAngle
Field v1.TVertex
Field v2.TVertex
Field v3.TVertex
End Type

; Viewport
Global viewWidth# = 1024
Global viewHeight# = 768

Global centerX# = viewWidth*0.5
Global centerY# = viewHeight*0.5

; clipping planes
Global near# = -1
Global far# = -10

Global width# = 1
Global height# =viewHeight/viewWidth

; Create 3 triangles
Local tri.TTriAngle = New TTriAngle
tri\v1 = New TVertex:tri\v2 = New TVertex:tri\v3 = New TVertex

tri\v1\x = -0.1 :tri\v1\y = -0.2 :tri\v1\z = -2
tri\v2\x = -0.1 :tri\v2\y = 0.2 :tri\v2\z = -2
tri\v3\x = -0.3 :tri\v3\y = 0 :tri\v3\z = -2

tri.TTriAngle = New TTriAngle
tri\v1 = New TVertex:tri\v2 = New TVertex:tri\v3 = New TVertex

tri\v1\x = -0.1 :tri\v1\y = -0.2 :tri\v1\z = -4
tri\v2\x = -0.1 :tri\v2\y = 0.2 :tri\v2\z = -4
tri\v3\x = -0.3 :tri\v3\y = 0 :tri\v3\z = -4

tri.TTriAngle = New TTriAngle

tri\v1 = New TVertex: tri\v2 = New TVertex: tri\v3 = New TVertex
tri\v1\x = -0.1 :tri\v1\y = -0.2 :tri\v1\z = -7
tri\v2\x = -0.1 :tri\v2\y = 0.2 :tri\v2\z = -7
tri\v3\x = -0.3 :tri\v3\y = 0 :tri\v3\z = -7

Repeat
For tri.TTriAngle = Each TTriAngle
;calculate projection
Projection(tri\v1)
Projection(tri\v2)
Projection(tri\v3)

; check if triangle is within clipping planes
If (tri\v1\z < near ) And (tri\v1\z > far ) Then
If (tri\v2\z < near ) And (tri\v2\z > far ) Then
If (tri\v3\z < near ) And (tri\v3\z > far ) Then


; Draw triangle wireframe
Line tri\v1\xw, tri\v1\yw, tri\v2\xw, tri\v2\yw
Line tri\v2\xw, tri\v2\yw, tri\v3\xw, tri\v3\yw
Line tri\v3\xw, tri\v3\yw, tri\v1\xw, tri\v1\yw

Text tri\v1\xw, tri\v1\yw, "1"
Text tri\v2\xw, tri\v2\yw, "2"
Text tri\v3\xw, tri\v3\yw, "3"
EndIf
EndIf
EndIf
Next


; some little movement to see clipping behaviour
tri = Last TTriAngle
tri\v1\z = -5.5+Cos(a)*5.0
tri\v2\z = -5.5+Cos(a)*5.0
tri\v3\z = -5.5+Cos(a)*5.0
a=a+3


; key left/right
If KeyDown(205) Then near=near+.1
If KeyDown(203) Then near=near-.1

; key up/down
If KeyDown(200) Then far=far+.1
If KeyDown(208) Then far=far-.1

Text 0,0, "near clipping plane: "+near
Text 0,15, "far clipping plane: "+far
Flip
Cls
Until KeyHit(1)

Function Projection(vec.TVertex)

; newVector = Projection Matrix * oldVector
vec\xp = 2*near/width * vec\x + 0 * vec\y + 0 * vec\z + 0*1
vec\yp = 0 * vec\x + 2*near/height * vec\y + 0 * vec\z + 0*1
vec\zp# = 0 * vec\x + 0 * vec\y + (far+near)/(near-far) * vec\z + -1*1
vec\wp = 0 * vec\x + 0 * vec\y + (2*far*near)/(near-far) * vec\z + 0*1

; normalize
vec\xp = vec\xp/vec\wp
vec\yp = vec\yp/vec\wp

; calculate viewport coordinates
vec\xw# = centerX+vec\xp*viewWidth
vec\yw# = centerY+vec\yp*viewHeight
End Function
Ist natürlich alles andere als brauchbar, aber vielleicht hilft es dir weiter.

Der Schlüssel zur Umrechnung eines 3D Punktes auf 2D Bildschirmkoordinaten liegt in der Projektionsmatrix. Die habe ich mal von hier geklaut. Das Prinzip ist einfach: du multiplizierst die Projektionsmatrix mit dem Vektor im Raum, und gewinnst dadurch den Punkt auf einer Projektionsfläche, die in einem bestimmten Abstand von der Kamera entfernt ist. So ähnlich wie Lochkamera, nur eben mit der Projektion VOR der Öffnung.

Die Berechnung von der auf [-1,1] normierten Projektionsfläche auf Bildschirmkoordinaten ist hier ein wenig vereinfacht. Da gibt es auch allgemeinere und elegantere Möglichkeiten mit Viewportmatrizen.

Das ist jetzt beliebig erweiterbar, man könnte Objekte einführen und damit lokale/globale Koordinaten. Translationen/Rotationen etc. sind dann auch einfache Matrizenmultiplikationen. Die Translation/Rotation der Kamera selbst muss eigentlich auch gesondert berücksicht werden. Der Z-Buffer ist natürlich noch wichtig. Wobei mit BB wird das eigentliche Problem dann etwas anderes als Wireframe zu kriegen, da Bildermanipulationen einfach viel zu langsam sind.

Also wie schon zuvor erwähnt, das sind eher mathematische Fragestellungen. Das zu verstehen und als Code zu organisieren ist die eigentliche Herausforderung Wink
  • Zuletzt bearbeitet von Chester am Mo, Feb 22, 2016 1:30, insgesamt einmal bearbeitet
 

Kruemelator

BeitragMo, Feb 22, 2016 3:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du einen Software-Rasterisator (heißen die so? Very Happy ) selber schreiben willst wird das eine umfangreiche Sache. Das Matrixzeug ist das selbe wie bei DirectX oder OpenGl (hier mal ein Link zur DX9 Dokumentation https://msdn.microsoft.com/en-...p/bb173466 , der Link beschreibt ein paar der Dinge (Kameraprojektion und sowas, sogar einfache Matrix und Vektorrechnung)). Blitz3D nimmt einem da sehr sehr viel ab.

Flush

Betreff: High,

BeitragMo, Feb 22, 2016 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen Dank für Eure schnellen Antworten Very Happy .
Also ein Raycaster oder ein eigener vollständiger Renderer soll es nicht werden soweit bin ich mit meinen Prog.Kenntnissen noch nicht.
Ich glaube der Source (ich habe erst heute Abend genug Zeit ihn mir genau anzusehen) von Chester kmmt der Sche am nächsten.

Ich möchte einfach mit hlife selbst programmierter Matrizen (Projektion, Transformation, Rotation) 3D Primitive (Würfel, Pyramiden, Kugeln etc.) als Drahtgittermodell darstellen. Später möchte ich dann gefüllte Vektoren darstellen. Das ich das ganze mit B3D eigenen 3D Befehlen realisieren kann ist mir schon klar aber. Allerdings lerne ich dabei nicht wirklich viel über 3D Grafik. Das ganze Projekt hat also eigentlich nur learning purposes. Wenn ich alles zusammen habe werde ich ein Tutorial daraus machen. Ich habe schon sehr viele Fragen bezüglich Matrizen, allgemeiner 3D Darstellung von Körpern, und auch Quaternionen gelesen die damit beantwortet werden könnten.


Transformation:
http://www-lehre.informatik.un...ation.html

Projektion:
http://www-lehre.informatik.un...0000000000

3D-Rotation:
https://www.siggraph.org/educa...3drota.htm

Das müsste doch in B3D mit den schnellen 2D Befehlen sehr einfach umsetzbar sein Question !? Nur "WIE"!? Rolling Eyes
Ich hab da leider echte Startschwierigkeiten! Exclamation Embarassed Crying or Very sad


Viele Grüße,
Flusher
 

Kruemelator

BeitragMo, Feb 22, 2016 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Du brauchst dafür mehrere Vektoren und Matrizen. Die Vektoren müssen 4 Elemente haben und die Matrizen 4x4. Dann brauchst du Funktionen wie z.B. das Multiplizieren von Matrix mit Matrix oder Vektor mit Matrix und Ähnliches.
Ich möchte dir nochmal die DirectX Dokumentation empfehlen. Du musst kein DirectX lernen, hier wird aber beschrieben wie die Matrizen aufgebaut sind. Z.B. hier und hier

Hier mal ein kleines Beispiel zum Aufbau, ist auch anders lösbar:
BlitzBasic: [AUSKLAPPEN]
Global matrixzahl = 99
Dim matrix#(3,3,matrixzahl)
;0-3 Zellen
;0-3 Spalten

Global vektorzahl = 99
Dim vektor#(3,vektorzahl)
;0-3 Elemente

Function VektorErstellen( vnum, x#,y#,z#,w# )
vektor(0,vnum) = x
vektor(1,vnum) = y
vektor(2,vnum) = z
vektor(3,vnum) = w
End Function


Function VektorMulMatrix( ausgabevnum, vnum, mnum )
vektor(0,ausgabevnum) = vektor(0,vnum)*matrix(0,mnum)
;hier nur angedeutet
End Function


Beim reinen Rechnen ist Blitz recht schnell, langsam wird es beim Darstellen (einzelne Pixel malen).

Flush

BeitragMo, Feb 22, 2016 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Kruemelator,

hier noch eine sehr gute (alte) Website.
Leider krieg ich die Appletts ums verrecken nicht zum laufen Embarassed , mein Braowser Chrome Water-/ Firefox blockt immer Evil or Very Mad Question Mad .
Die Seiten sind aber jedem wärmstens ans Herz zu legen der 3D besser verstehen möchte.
Ich halte euch über den Forgang des Tutorials auf dem Laufenden.


http://olli.informatik.uni-old...page1.html


Grüße,
Flusher
  • Zuletzt bearbeitet von Flush am Mo, Feb 22, 2016 18:27, insgesamt einmal bearbeitet

DAK

BeitragMo, Feb 22, 2016 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Die 2D-Befehle sind leider alles Andere als schnell, da sie keine Hardware verwenden. Eventuell kommst du weiter, wenn du dir BMax holst, und dort direkt in OpenGL machst. Dort kannst du nämlich die Hardware direkt verwenden für das was du machen willst, so das es auch wirklich einen Sinn macht.

Da kannst du dann sogar auf so coole Sachen wie Shader weiter gehen, das macht dann echt Spaß.
Gewinner der 6. und der 68. BlitzCodeCompo

Flush

BeitragMo, Feb 22, 2016 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt, aber dann habe ich wieder 3D Objekte!!!!
Ich fang mal ganz klein mit der Darstellung und der Rotation eines Würfels an. Ich den Beitrag aktualisieren.
Hier und s.o. die Seite von der ich gesprochen habe.

http://olli.informatik.uni-old...page1.html

Auch ohne Applettdarstellung sehr nützlich.


Viele Grüße,
Flusher

DAK

BeitragMo, Feb 22, 2016 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Nö, hast du nicht. Alles, was es dir von vornhinein gibt, sind die Datenstrukturen für Vertices und Surfaces. Die gesamte Mathematik dahinter kannst du selbst machen. Zumindest, wenn man halbwegs neue OpenGL-Befehle benutzt und nicht die ewig alte fixed function pipeline.
Gewinner der 6. und der 68. BlitzCodeCompo

Flush

BeitragDi, Feb 23, 2016 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm, das wußte ich nicht, dann ist OpenGl vllt. auch eine Alternative!

Im Bezug auf das Tutorial poste ich den Fortgang, vll. interessiert es den Einen oder Anderen. Question Exclamation Smile


Viele Grüße,
Flusher

DAK

BeitragMi, Feb 24, 2016 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
So wie es mir klingt willst du eine eigene Renderengine schreiben. Das ist eben genau wofür OpenGL gedacht ist, zumindest seit den neueren Versionen. Man hat bei OpenGL die alte Fixed Function Pipeline, die Objekte und Shading und so hat. Und dann gibt es die neuere Pipeline, bei der man alles selber macht, und damit hald deutlich mehr Spielraum und Freiheit hat. Das wäre, was du brauchst.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group