Du bist nicht angemeldet.

yeti2078

Registrierter Benutzer

  • »yeti2078« ist männlich
  • »yeti2078« ist der Autor dieses Themas

Beiträge: 348

Dabei seit: 14. August 2007

Frühere Benutzernamen: gogogigo

Hilfreich-Bewertungen: 17

  • Private Nachricht senden

1

Dienstag, 20. April 2010, 13:30

GDI3D - 3D auch ohne DirectX

Name der DLL:
GDI3D oder auch Graphics3D

Beschreibung:
Da ich mich in der letzten Zeit wieder mal mit DirectX beschäftigt habe, mir aber das seitenlange coden, Errorhandling, OnLostDevicehandling, usw, usw, langsam auf den Senkel ging, habe ich mich nach einer Alternative umgeschaut, konnte aber kaum etwas brauchbares finden. Durch diesen Thread kam mir die Idee von GDI3D.

GDI3D ist eine Klassenbibliothek, mit der man schnell und einfach 3D zeichnen kann - mit GDI.
Dazu können alle möglichen sogenannte Meshes (also Drahtgittermodelle) aus Dateien geladen werden.
Das (zur Zeit einzige) unterstützte Dateiformat ist das *Obj-Format von Wavefront. Nahezu jede Modeller-Software (auch Blender!) kann dieses Format exportieren.

Was mich selbst überrascht hat, ist die relativ hohe Performance von GDI. Erst ab etwa 5000 Polygonen pro Frame, kommt es bei mir zum leichten Ruckeln.

Open Source!

Anwendung:
GDI3D lässt sich leicht integrieren.
Wichtig sind jedoch folgende Schritte:
• Instanziierung der Graphics3D-Klasse und Übergabe der Zeichengröße
• Festlegen der World-, View-, und Projection-Matrizen (wer schon einmal mit DX gearbeitet hat, sollte das kennen)

Und schon kann es losgehen. Hier ein Beispiel-Code zum zeichnen eines Meshes, das aus einer Datei geladen wurde, in die gesamte Form "Form1":

 Hier klicken für weitere Informationen

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Imports GDI3D

Public Class Form1
Private Sample_Graphics As Graphics3D
Private Sample_Mesh As Mesh

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer, True)

    ' Das Mesh wird geladen
    Sample_Mesh = Mesh.FromFile("C:\Dokumente und Einstellungen\Lukas\Desktop\untitled3.obj")

    ' Initialisierung der Graphics3D-Instanz und der Matrizen
    Sample_Graphics = New Graphics3D(Me.ClientSize)
    Sample_Graphics.Transform_World = Matrix.Identity
    Sample_Graphics.Transform_View = Matrix.Translation(0, 0, -5)
    Sample_Graphics.Transform_Projection = Matrix.Projection(Math.PI / 4, Me.ClientSize.Width / Me.ClientSize.Height, 0.1, 1000)
End Sub

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    ' Das Mesh soll sich um die Y-Achse drehen (Wichtig: Die Winkel sind in Radiant anzugeben)
    Sample_Graphics.Transform_World = Matrix.Rotate_Y_Axis(Now.Millisecond * (Math.PI * 2) / 1000)
    ' Das Mesh wird gezeichnet
    Sample_Graphics.Draw_Mesh(e.Graphics, Sample_Mesh, Color.FromArgb(240, 100, 20), GDI3D.Graphics3D.DrawMode.Fill Or GDI3D.Graphics3D.DrawMode.Wireframe)

    Me.Invalidate()
End Sub
	Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
    	' Da sich nun das Sichtfenster verändert hat, muss auch die Zeichenfläche und 
    	' das Seitenverhältnis der Projektion verändert werden
    	If Sample_Graphics IsNot Nothing Then
        	Sample_Graphics.Bounds = Me.ClientSize
        	Sample_Graphics.Transform_Projection = Matrix.Projection(Math.PI / 4, Me.ClientSize.Width / Me.ClientSize.Height, 0.1, 1000)
    	End If
	End Sub
End Class


Screenshot und Video:

Und hier noch ein tolles Video. :D


Verwendete Programmiersprache:
VB.Net

Systemanforderungen:
• .NET Framework 2.0
• Es ist keine DirectX-Runtime nötig.

Lizenz:
LGPL ;-)

Download:
GDI3D Release (10 KB)
GDI3D Source-Code-Projekt (30 KB)

Beispiel OBJ-Mesh (45 KB)



Viel Spaß! :)
Gruß yeti

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »yeti2078« (22. Juni 2010, 21:41)


nicu96

stiller Mitleser

  • »nicu96« ist männlich

Beiträge: 37

Dabei seit: 16. Dezember 2009

Wohnort: Schweiz

Hilfreich-Bewertungen: 3

  • Private Nachricht senden

2

Dienstag, 20. April 2010, 17:17

das video sieht beeindruckend aus, muss ich mal ausprobieren :)
gute arbeit!

OS: Linux Peppermint & Windows 7
Processor: AMD Phenom II X6 1055T @ 3.5 GHz
RAM: 8 GB Kingston ValueRAM
GFX: NVIDIA GeForce 210

vredesbyrD

unregistriert

3

Dienstag, 20. April 2010, 17:26

WTF!

Ich bin beeindruckt...
Kann man stark vereinfacht sagen, dass du quasi einen Algorithmus entwickelt hast, der die Koordinaten der einzelnen Polygonen in X|Y-Koordinaten umwandelt,
und diese dann mit Regions/Paths zeichnet?

Ich kann mir echt nicht vorstellen wie du das gemacht hast.
Auf jeden Fall weiter so!

mfg vredesbyrD

Mono

Registrierter Benutzer

  • »Mono« ist männlich

Beiträge: 1 386

Dabei seit: 20. April 2009

Wohnort: Dresden

Hilfreich-Bewertungen: 60

  • Private Nachricht senden

4

Dienstag, 20. April 2010, 18:18

Impressive.

Echt sehr geil, habs mir aus Interesse mal ganz kurz grade angeschaut. Es sieht echt gut aus..
Wenn ich Zeit habe, werde ich mir den Source auf jedenfall näher anschauen und versuchen nachzuvollziehen, wie du das gemacht hast.
Das Dateiformat .obj und dessen Aufbau ist mir leider komplett unbekannt...

In jedem Fall 5 sterne ;)


Das ist meine Signatur und sie wird wunderbar sein!

Kouki

selbsternannter Nerd

  • »Kouki« ist männlich

Beiträge: 374

Dabei seit: 31. Oktober 2009

Hilfreich-Bewertungen: 15

  • Private Nachricht senden

5

Dienstag, 20. April 2010, 18:36

Das ist ja wahnsinn! Ehrlich gesagt hatte ich auch die Idee, habs aber sein lassen. Ey: Du bist heute schon an einem Tag auf Platz 1 in Libraries/Controls gerutscht :thumbsup:

Natürlich 5 Sterne, auch wenn ich nicht weiß, ob ichs benutzen werde :thumbsup:

Kombrinki

Registrierter Benutzer

  • »Kombrinki« ist männlich

Beiträge: 258

Dabei seit: 14. September 2009

Hilfreich-Bewertungen: 5

  • Private Nachricht senden

6

Dienstag, 20. April 2010, 18:59

:thumbsup: Sehr gut das ist ja wahnsinn :thumbsup:
Meine Programme im Showroom:

[Release] Concentiô

[Beta] Game Manager

Tsuyo

Registrierter Benutzer

Beiträge: 804

Dabei seit: 10. Oktober 2009

Wohnort: k

Frühere Benutzernamen: m0nst3rkill3r

Hilfreich-Bewertungen: 257

  • Private Nachricht senden

7

Dienstag, 20. April 2010, 19:04

Seeehr nice, Werds benutzen.
Vielen Dank.

(Schnell lad in case of serverabsturz)

Zitat von »"http://forums.macrumors.com/showpost.php?s=9e0078570b2b62fd044cc1b13d212b09&p=4777525&postcount=1064"«

When talking about how apple cannot influence the future of computers, you also forgot to mention that the internet was created on a network of macs to start with. Thats why every online PeeCee has a MAC code. Even my PSP needs a MAC code to get online....
~2000€ für nen brauchbaren Mac sind imho 2100€ zu viel. - SamusTyp

developsoftware

Registrierter Benutzer

Beiträge: 275

Dabei seit: 21. März 2009

Hilfreich-Bewertungen: 3

  • Private Nachricht senden

8

Dienstag, 20. April 2010, 19:30

WOW

Also das video ist echt spitze!!

Ich seh in diesem projekt noch viel potential....weiter so!

genial :thumbsup: :thumbsup:


Windows: Windows 7 Professional
Processor: Intel(R) Core(TM)2 Quad CPU 2.50GHz
Memory: 4,00 GB
Visual Studio 2008 installiert

jansteffen

progga in da house äh... forum ^^

  • »jansteffen« ist männlich

Beiträge: 120

Dabei seit: 2. Juni 2009

Wohnort: ERROR 404

Hilfreich-Bewertungen: 6

  • Private Nachricht senden

9

Dienstag, 20. April 2010, 20:15

habs nich probiert aber das video is schonmal sehr beeindruckend!!! eine eigene 3d engine die das 3d in 2d umrechnet... mein größten respekt 8| auf jedenfall weitermachen :thumbup:
Du sagst Justin Bieber, Ich sage John O'Callaghan
Du sagst Miley Cyrus, Ich sage Guru Josh project
Du sagst Kesha, Ich sage Deadmau5
Du sagst Eminem, Ich sage Papa Roach

92% Kinder und Jugendliche hören Pop und Hiphop. Wenn der einer der 8% bist, der noch echte Musik hört, kopier dies in deine Signatur!

Scream

Registrierter Benutzer

  • »Scream« ist männlich
  • »Scream« wurde gesperrt

Beiträge: 665

Dabei seit: 27. September 2009

Hilfreich-Bewertungen: 2

  • Private Nachricht senden

10

Mittwoch, 21. April 2010, 15:10

Zitat

Sample_Mesh = Mesh.FromFile("C:\Dokumente und Einstellungen\Lukas\Desktop\untitled3.obj")

Hab keine obj. files.. vll. kanste eins hochladen?, und echt gute Arbeit!, wusste garnicht das man aus 2d 3d machen kann 8|

timi257

dankeschöön :)*

Beiträge: 606

Hilfreich-Bewertungen: 10

  • Private Nachricht senden

11

Mittwoch, 21. April 2010, 15:19

Womit kann ich den .obj - files modelieren??

Hey, ich wollte Ihnen nur mal Danke sagen :D ;) :love:
Weil ich einfach keinen Hunger hab! : )

jvbsl

Noob

  • »jvbsl« ist männlich

Beiträge: 7 206

Dabei seit: 7. April 2010

Hilfreich-Bewertungen: 397

  • Private Nachricht senden

12

Mittwoch, 21. April 2010, 15:20

Hallo,

ich schätze mal, dass das ganze auf Eulerscher Rotation basiert. Also es gibt schon einen uralten Algorithmus dafür...:P

Mfg jvbsl
Ich wollte auch mal ne total überflüssige Signatur:
---Leer---

Lapdogs

Registrierter Benutzer

  • »Lapdogs« ist männlich
  • »Lapdogs« wurde gesperrt

Beiträge: 129

Dabei seit: 11. Oktober 2009

Wohnort: Rosenheim

Frühere Benutzernamen: ClipKing

Hilfreich-Bewertungen: 1

  • Private Nachricht senden

13

Mittwoch, 21. April 2010, 15:29

Einfach fantastisch! Toll!
Ich habs noch nciht ausporbiert sieht klasse aus, echt toll! respekt! 5 Sterne! ;)

Edit:// Wie wärs mit einer Doku dafür und wie man es verwendet?
Du weißt nicht was das soll, deshalb quatschst du mich hier voll :evil:

4typen

Droggelbecher?

  • »4typen« ist männlich

Beiträge: 436

Dabei seit: 26. April 2009

Hilfreich-Bewertungen: 105

  • Private Nachricht senden

Samus Aran

Registrierter Benutzer

  • »Samus Aran« ist männlich

Beiträge: 2 583

Dabei seit: 12. November 2009

Hilfreich-Bewertungen: 581

  • Private Nachricht senden

15

Mittwoch, 21. April 2010, 15:58


Das (zur Zeit einzige) unterstützte Dateiformat ist das *Obj-Format von Wavefront. Nahezu jede Modeller-Software (auch Blender!) kann dieses Format exportieren.


@timi: Hast du den ersten Post überhaupt gelesen? ;)

Lapdogs

Registrierter Benutzer

  • »Lapdogs« ist männlich
  • »Lapdogs« wurde gesperrt

Beiträge: 129

Dabei seit: 11. Oktober 2009

Wohnort: Rosenheim

Frühere Benutzernamen: ClipKing

Hilfreich-Bewertungen: 1

  • Private Nachricht senden

16

Mittwoch, 21. April 2010, 16:39

Könntest du ein Beispiel-Object reintun?
Du weißt nicht was das soll, deshalb quatschst du mich hier voll :evil:

yeti2078

Registrierter Benutzer

  • »yeti2078« ist männlich
  • »yeti2078« ist der Autor dieses Themas

Beiträge: 348

Dabei seit: 14. August 2007

Frühere Benutzernamen: gogogigo

Hilfreich-Bewertungen: 17

  • Private Nachricht senden

17

Mittwoch, 21. April 2010, 17:06

Wow!! Vielen Dank für die guten Kritiken.
Hätte niemals gedacht, dass das so vielen hier gefällt. :)


Ich werde auf jeden Fall daran weiter arbeiten. Falls es dann bald stabil ist gibt's auch den Sourcecode.
Eine Doku dazu wird auch kommen.

Zuerst aber:
- Vielleicht ist das jemanden schon aufgefallen, dass es kein "Tiefensortierung" (also kein Z-Buffer) gibt. Das heißt, die Polygone werden nacheinander, so wie sie im Mesh angeordnet sind, gezeichnet.
Daher kann es dazu kommen, dass ein Polygon, das eigentlich verdeckt sein müsste, über ein vorderes Polygon gezeichnet wird. Das sieht sehr unrealistisch aus (zB hier).

Daher werde ich ein Z-Buffer einbauen.

- Ein weiteres Manko ist, dass zur Zeit nur mit einer Farbe gezeichnet werden kann. Langweilig...
Damit sich das ändert kommt gegebenenfalls programmierbare Pixel- und Vertex-Shader hinzu, um für jeden Pixel einen Farbwert zu errechnen.
Somit sind Schatten, Texturen und alle möglichen Materialien möglich.
Ich hoffe mal, dass ich das hinkriege und die GDI-Performance dabei nicht den Bach herunterläuft.

- Das Laden von Obj-Files ist ein wenig fehlerhaft. Cinema4D beispielsweise exportiert irgendwie anders. Mal schauen.

Ich freue mich über jeden Vorschlag. ^^




So zur Technik:
Wie ich oben schon beschrieben habe, läuft alles wie auf Grafikkartenebene bei DX ab.
Ein Mesh besteht aus einer Liste von Vertices, also Raumpunkten. Jeweils 3 Vertices spannen ein Polygon bzw. Dreieck im Raum auf.

Für jeden Vertex eines Dreiecks passiert nun folgendes:
• Der Vertex ist ein 4-D-Vektor. Die ersten 3 Koordinaten sind die Raumpunkte. Die 4 Koordinate, also "w" ist immer 1.
Der Vektor wird mit der World-, dann der View- und dann der Projektions -Matrix multipliziert. Alle diese Matrizen sind ebenso 4-dimensionale Matrizen. In ihnen stecken die Informationen über Verschiebung, Rotation, Projektionsmethode usw.
• Der resultierende Vektor besitzt wieder 4 Koordinaten. Zur Vervollständigung unser Berechnung müssen nun xdie ersten 3 Koordinaten durch die 4. Koordinate geteilt werden.
Der ersten beiden Koordinaten sind jetzt die fertig projezierten 2-D-Koordinaten des Vertex. Die 3. gibt Asukunft darüber, wie weit der Vertex weg ist.

Hier noch ein genauerer Artikel.

Zitat

ich schätze mal, dass das ganze auf Eulerscher Rotation basiert.
Die Drehung im Raum beruht auf dieser Methode, ja. ^^

Zitat

und diese dann mit Regions/Paths zeichnet?
Zur Zeit wird alles mit mit FillPolygon und DrawPolygon gezeichnet.




Und hier noch ein Obj-Modell. Vor allem hier ist zu sehen, dass ein z-Buffer nötig ist.
»yeti2078« hat folgende Datei angehängt:
  • Obj-Modell.zip (43,62 kB - 292 mal heruntergeladen - zuletzt: 31. Januar 2012, 16:49)
Gruß yeti

Load-soft.ch.vu

Mag Algorithmen :)

  • »Load-soft.ch.vu« ist männlich

Beiträge: 988

Dabei seit: 30. Oktober 2009

Wohnort: Berlin

Frühere Benutzernamen: Confix.npage.de

Hilfreich-Bewertungen: 2

  • Private Nachricht senden

18

Mittwoch, 21. April 2010, 19:53

Bei mir kommt leider eine Felermeldung beim Testen:

"Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException. Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.."

PS: Das ist wohl einer der besten (oder das beste?) Libary :)

Der besten Library? Nein ganz sicher nicht. Das beste Library? Auch nicht. Die beste Library - ja genau.
Einer der besten Librarys passt wohl noch besser zu deinem Satz.
PS: Soll kein Angriff u.a. sein
Auch wenn ich jetzt eigentlich erwartet hätte du sagst das ist einer der bekanntesten Fehlermeldungen.


@Topic
Ahh, sowas hatte ich auch schonmal vor. Leider konnte man keine .obj Dateien nutzen. Kann mir sogar genau Vorstellen wie du das gemacht hast.
PS: Falls noch nicht gemacht - nutzt ein Protector.
Falls dir geholfen wurde :thanks;

  • »Prometheus« ist männlich

Beiträge: 179

Dabei seit: 20. August 2008

Wohnort: Österreich

Hilfreich-Bewertungen: 2

  • Private Nachricht senden

19

Mittwoch, 21. April 2010, 22:24

mist! - jz kann ich mir ne neue idee suchen :-D

immerhin hast du mir arbeit ersparrt ;-)

Patschi

pkern.at

  • »Patschi« ist männlich

Beiträge: 165

Dabei seit: 31. Juli 2009

Wohnort: pkern.at / Österreich

  • Private Nachricht senden

20

Donnerstag, 22. April 2010, 21:50

Entweder ich bin zu blöd den Link zum Video zu sehen oder es gibt irgendwie keinen o.O

btw: Schaut super aus ;)
Meine neue Homepage: pkern.at
Wetter bei mir zu Haus:

Social Bookmarks