AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Texturbearbeitung

Ein Thema von VkPenguin · begonnen am 5. Mär 2013 · letzter Beitrag vom 12. Mär 2013
Antwort Antwort
Seite 1 von 3  1 23      
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#1

Texturbearbeitung

  Alt 5. Mär 2013, 17:58
Hallo zusammen,
ich habe ein Programm geschrieben, welches eine 2D "Karte", z.B. eines Labyrinths, in eine (Pseudo-)3D-Umgebung umwandelt, in der man sich frei bewegen kann. Ich verwende dabei keine Zusätze wie Genesis3D oder ähnliches. Nachdem ich noch einige Soundeffekte eingefügt habe funktioniert das ganze auch schon recht gut und man fühlt sich wie in einem (zugegebenermaßen schlechten) Computerspiel. Um die Wirkung zu steigern habe ich statt einfacher Farben (z.B. Grau für Wand) einen Algorithmus eingefügt, der die Farben für eine bessere Tiefenwirkung manipuliert. Viel besser ist der Effekt natürlich noch, wenn man statt einfacher Farben Texturen verwendet.

Das ganze funktioniert bei mir im Moment so:

Delphi-Quellcode:
...Canvas.Brush.Bitmap:=[TEXTUR-BITMAP]
...Canvas.FloodFill(...); oder Canvas.FillRect(...);
Dabei ergeben sich aber zwei Probleme. Zum einen verändert sich die Position der Pattern-Textur auf dem Gegenstand beim Bewegen mit (Wenn man z.B. an einer Wand mit einem Symbol darauf vorbeigeht würde immer nur den Teil des Symbols sehen, der noch vor einem liegt, bei meiner Methode zu zeichnen fängt die Textur von Anfang neu an, man würde also den Beginn des Symbols sehen, aber nicht das Ende). Dieses Problem möchte ich aber erst einmal zurückstellen, ich erwähne es nur, weil es eventuell mit dem anderen Problem zusammenhängt.

Zweitens müssten die Texturen ja eigentlich in der Tiefe "kleiner" werden (Seht euch mal dieses und dieses Bild an, dann versteht ihr denke ich, was ich meine) Ich suche also einen Weg, wie ich eine Wandtextur so bearbeiten kann, dass ich sie auf meine vorberechneten Formen auftragen kann und dabei eine solche Tiefenwirkung haben.

Beim Suchen bin ich auf das Stichwort "inverses Mapping" im Zusammenhang mit folgender Formel gestossen:

u = (u/z)/(1/z)
v = (v/z)/(1/z)

Ich verstehe allerdings nicht so ganz, was mir das sagen soll. Hat jemand vielleicht einen Tipp für mich?

Vielen Dank für die Hilfe!
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Texturbearbeitung

  Alt 5. Mär 2013, 18:13
Ich weiß nicht genau, wie du vorgehst, aber im Grunde müsste man eine Projektions Matrix und ne View Matrix erstellen/managen.. Diese multiplizieren und mit der dabei entstehenden Matrix kannst du einzelne Vektoren transformieren.
Kannst du Codeteile zeigen?
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton ( 5. Mär 2013 um 18:23 Uhr)
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#3

AW: Texturbearbeitung

  Alt 5. Mär 2013, 20:58
Hey, Danke erstmal für Deine Antwort.

"Matrix" ist mir in diesem Zusammenhang noch gar nicht begegnet, werd' ich mir gleich mal anschaun.

Klar zeig ich Dir gern Ausschnitte aus dem Code, ich weiß nur nicht, was genau im speziellen wichtig ist. Man sollte nur erstmal wissen, dass meine "3D-Engine" natürlich sehr rudimentär ist, da ich immer noch Anfänger in Delphi bin und auch nur in meiner Freizeit programmiere (Auch wenn ich finde, dass das Ergebnis bisher schon ganz gut aussieht).

Mal ganz grob erklärt, damit Du erstmal eine Vorstellung meines Ansatzes hast: Ich habe ein Array mit den Positionen und Daten der Wände etc. und einen festen Fluchtpunkt. Mit Sinussatz und ähnlichem rechne ich die Verhältnisse im Raum aus (also das eine Mauer weiter hinten "kürzer" ist zum Beispiel) und verbinde die so berechneten Eckpunkte dann mit Canvas.LineTo(...); . Dann Fülle ich die dadurch entstandenen Flächen einfach mit den Oben genannten befehlen aus. Das ist natürlich keine perfekte Lösung, aber ich bin wie gesagt eben Anfänger und eigentlich so schon stolz, das überhaupt hinbekommen zu haben.

In einer neuen Version habe ich nun die Canvas.Brush.Color:=$... -Befehle einfach durch Canvas.Brush.Bitmap:=[Bitmap] ersetzt, um mein kleines Spiel ein wenig plastischer wirken zu lassen. Es sieht auch eigentlich nicht so schlecht aus (abgesehen davon, dass ich noch keine wirklich guten Texturen gefunden habe), aber sobald man sich bewegt merkt man schnell, dass das ganze ziemlich unrealistisch ist. Wenn die Texturen ebenso "kleiner" würden wie die Wände wäre das schon deutlich besser, ich finde aber keinen Ansatz, wie ich das umsetzten soll.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Texturbearbeitung

  Alt 5. Mär 2013, 21:50
Oh, ok.. Also du machst es dir zu umständlich.. als Anfänger würde ich mich zuerst mal den existierenden Tools bedienen.
Für computer graphische Sachen verwendet man entweder DirectX oder OpenGL.
OpenGL ist imho viel anfängerfreundlicher und du darfst sehr bald schon Ergebnisse sehen.
Weiters gibts ne tolle Delphi Community drumherum.
Nimm dir die Zeit und arbeite diese Tutorials durch!
Da werden im späteren Verlauf auch näher auf rendertechnische Sachen eingegangen.
Matrizen werden auch erklärt!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#5

AW: Texturbearbeitung

  Alt 5. Mär 2013, 22:25
Ja, das kenne ich schon, der Spass liegt für mich aber darin es selbst zu programmieren.. Bisher bin ich damit ja auch ganz gut zurecht gekommen, aber hier weiß ich echt nicht weiter. Werde mir die Tutorials aber trotzdem mal ansehen, vielleicht erfahre ich da ja was. Hast du sonst vielleicht noch einen Tipp ? Oder sonst jemand?
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#6

AW: Texturbearbeitung

  Alt 6. Mär 2013, 00:11
Zitat:
Bisher bin ich damit ja auch ganz gut zurecht gekommen, aber hier weiß ich echt nicht weiter.
Die Angelegenheit legt exponential an Schwierigkeit zu.
Eine Alternative ist noch GLScene, das baut auf OpenGL auf.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Texturbearbeitung

  Alt 6. Mär 2013, 10:09
der Spass liegt für mich aber darin es selbst zu programmieren..
OpenGL und DX machen jetzt auch nicht so wahnsinnig viel automatisch - da kommst du sicherlich noch genug zum Selbermachen. Allerdings sind die 3D APIs gerade was das Handhaben von Texturen angeht doch eine große Hilfe (in Sachen Komfort aber auch Geschwindigkeit).

Dein Problem, dass der von der Windows GDI bereit gestellte Bitmap-Filler keine perspektivische Verzerrungen kennt ist unumgänglich. Du müsstest auf diese einfach Art des Flächen füllens gänzlich verzichten, und im Grunde deine Bitmaps Pixel für Pixel selbst sowohl mappen als auch zeichnen. Ohne eine vernünftige Matrixdarstellung der Welt ist das schon fast ein Ding der Unmöglichkeit (zumindest wird man oft mit Singularitäten und horrend unübersichtlichen und daher fehlerträchtigen Termen konfrontiert).
Beim Textur-Mapping scheint mir eine Grenze deines prinzipiellen Ansatzes einfach erreicht zu sein. Bzw. wäre der Aufwand und die Problemchen die man sich damit mittelfristig einhandeln würden das Ergebnis wohl nicht wert.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#8

AW: Texturbearbeitung

  Alt 6. Mär 2013, 13:21
Auch wenn ich nun natürlich immer noch nicht weiter bin weiß ich immerhin, dass es so, wie ich es mir erst dachte wohl nicht geht. Ich würde aber trotzdem gern auf Erweiterungen verzichten, zur Not lasse ich Texturen eben ganz weg. Einen (natürlich keineswegs optimalen) Weg gibt es aber glaube ich doch (und das würde mir schon reichen, es ist ja nur ein kleines Projekt zum Spaß und zum Üben der Syntax): wenn ich im Code

Canvas.StretchDraw(rect(...)),[TEXTUR]); schreibe, kommt im Prinzip das richtige raus. Nun ist Stretchdraw natürlich weder sonderlich effizient noch geschickt, aber immerhin funktionierts so. Allerdings funktioniert das ja nur mit Wänden, die exakt Rechteckig erscheinen. Seitenwände, also quasi Parallelogramme, kann ich damit nicht füllen. Hat jemand eine Idee, wie das geht? Ich könnte die Bitmap zwar passend zuschneiden/skalieren, aber wie kann ich die Bitmap zur Laufzeit skalieren ?
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: Texturbearbeitung

  Alt 6. Mär 2013, 14:02
Das ist eben genau der Knackpunkt, auf den ich quasi hinaus wollte Ohne Matrizen wird diese Transformation zum einen kostspieliger (Trigonometrie ist einfach lahm), und ziemlich hässlich. Du musst deine Bilder Pixel für Pixel anfassen, und jeden quasi wie einen Eckpunkt deiner Geometrie auch durch die Projektionsmethode schubsen. Jetzt ganz kurz und vereinfacht gesagt.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Texturbearbeitung

  Alt 6. Mär 2013, 14:04
P.S. ohne mathematische Kenntnisse tutst du dich auch bei Verwendung von OpenGL oder DX schwer.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz