Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

1

26.03.2009, 19:33

Plastische Kugel - Möglichkeiten zur Realisierung

Hallo,

ich habe vor einiger Zeit ein sowohl grafisch, als auch spielerisch sehr ansehnliches Billiardspiel für den PC gefunden. Es ist zwar eigentlich ein reines 2D-Spiel, aber die Kugeln sehen sehr dreidimensional aus:

(Link)

Ich habe mir daraufhin die Ressourcen des Spiel genauer angesehen und dabei erst einmal diese Textur gefunden, was mich zu der Annahme verleitet, dass es sich tatsächlich um eine echte 3D-Kugel handelt, auf die dann eben diese Textur gemappt wurde. Wenn ich das mit Direct3D selbst nachstelle, komme ich zu diesem Ergebnis:

(Link)

Da das Ergebnis natürlich längst nicht so ansehnlich ist, wie das Original, suchte ich weiter und entdeckte folgende zusätzliche Dateien:
ball32_a.gif
ballshadow_a.gif
bchannel2.gif
bchannel.gif
highlight.gif
innershadow.gif
innershadow_a.gif
refmap.gif
Könnt ihr mir sagen, wie diese ganzen Bilddateien möglicherweise verwendet wurden, um zu dem ganz oben gezeigten Ergebnis zu kommen? Es verwirrt mich insbesondere, dass es sich bei der Grundtextur um eine Textur handelt, die man anscheinend erst auf eine dreidimensionale Kugel mappen muss, die anderen Dateien jedoch bereits in der "zweidimensionalen Form" vorliegen und damit offenbar nicht als zu mappende Textur gedacht sind.

Vielleicht könnt ihr mir ja weiterhelfen :)

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

26.03.2009, 19:38

die basistextur wird wirklich denke auf eine kugel gemappt. danach werden die einzelnen texturen draufgezogen und mit der drunterstehen in einer bestimmten weise miteinander kombiniert. einfachstes wäre addieren der pixelwerte, man kann sie aver auch multiplizeiren, wodurch dunklere partien die textur drunter dunkler machen und hellere töne heller.

das ganze nennt sich multitexturing.

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

3

26.03.2009, 19:58

Aber die ganzen zusätzlichen Dateien sind doch gar nicht geeignet, sie ebenfalls auf die Kugel zu mappen, oder? Dabei würden sie ja um die Kugel gezerrt, aber sie haben ja bereits diese Kugelform (im Gegensatz zu der grünen Basistextur).

4

26.03.2009, 20:41

Zitat von »"ph4nt0m"«

Dabei würden sie ja um die Kugel gezerrt

kommt drauf an, wie man die texturkoordinaten setzt ;)

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

5

26.03.2009, 21:01

Ok, dann müsste ich aber verschiedene Texturkoordinaten für die verschiedenen Texturen verwenden. Außerdem kommt ja noch dazu, dass sich, wenn sich die Kugel dreht, nur die Basistextur mitbewegen soll, diese zusätzlichen Spiegeltexturen usw. müssen aber konstant bleiben, da sich ja die Beleuchtung nicht mitdreht. Ich kann mir ehrlich gesagt nicht vorstellen, dass man das löst, indem man in jedem Frame die Texturkoordinaten entgegengesetz dreht :?

Eine weitere Frage: Wofür ist denn diese Alphamaske "ball32_a.gif"? Das braucht man doch normalerweise nur bei Sprites, also wenn ich einen zweidimensionalen Kreis rendern will und dieser am Rand nicht pixelig sein soll.

6

26.03.2009, 21:04

Zitat von »"ph4nt0m"«

Ich kann mir ehrlich gesagt nicht vorstellen, dass man das löst, indem man in jedem Frame die Texturkoordinaten entgegengesetz dreht :?

guck mal nach textrukoordinatentransformation ;)
bzw. mit nem Shader ginge sowas mit sicherheit auch - mit nem shader geht ja (fast) alles ^O^

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

7

26.03.2009, 21:46

Naja, ehrlich gesagt kann ich doch die Texturkoordinaten setzen, wie ich will: Die Kugel "wölbt" sich nunmal immer im Randbereich nach hinten und ist keine platte Fläche, von daher wird doch jede Textur, die ich auf sie mappe, niemals 1:1 ausgegeben, sondern immer (wenn auch minimal) nach außen hin gezerrt.

Und die Frage wegen der Alphamaske bleibt ja auch offen. Ehrlich gesagt kommt es mir mittlerweile so vor, als wenn hier eventuell doch gar kein dreidimensionales Objekt (also eine Kugel) beteiligt ist, sondern nur ein einfaches Quad gerendert wird. Das würde zumindest die Anwendung der zusätzlichen Dateien erklären, da diese dann wirklich einfach mit Multitexturing übereinander gelegt werden können. Die einzige Frage, die dann aber offen bleibt: Kann man das kugelförmige Mapping der Basistextur (denn das soll ja so bleiben) auch ohne 3D nachbilden?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

8

26.03.2009, 22:11

das sollte durchaus mit koordinatenprojektion möglich sein, nur halt anstatt vertices texturkoordinaten.

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

9

26.03.2009, 22:32

Kannst du das eventuell ein bisschen spezifizieren? Was genau meinst du mit Texturkoordinatenprojektion? Durch verändern der Texturkoordinaten kann ich doch eigentlich nur den Ausschnitt ändern oder die Textur gleichmäßig verzerren. Die Textur auf einer Kugel wird aber zum Außenbereich hin immer stärker, wohl nach einer Sinusfunktion, gestaucht. Ich habe im Moment überhaupt keine Ahnung, wie ich das mit einem einfachen, zweidimensionalen Quad nachbilden soll :(

10

26.03.2009, 22:57

Du biegst die Textur zu einer Kugel und betrachtest entsprechend den Kreis (für X- und Y-Koordinate unabhängig). Die gesamte Texturlänge (1) ist dann der komplette Kreisbogen (2PI... Einheitskreis). Wenn wir nun einen Punkt auf dem Ball haben, der von oben links gesehen X0 und Y0 entfernt ist (relative Koordinaten), dann entspricht seine Texturkoordinate arccos(1-X0*2)/(2PI) [Entsprechend für Y0]

Auf die Texturkoordinate muss dann entsprechend der aktuellen Drehung noch was drauf gerechnet werden, aber das schaffst du bestimmt schon ;)

Werbeanzeige