metallische Oberflächen zusammengesetzter Körper

Started by ender, March 04, 2006, 12:06:45 PM

Previous topic - Next topic

ender

Ich habe kürzlich mit idx3d einen Torus mit metallischer Oberfläche programmiert. Der Torus hat einen runden Querschnitt. Die metallische Oberfläche konnte ich gut mit Environment-Mapping realisieren.
idx3d scheint jedoch zu scheitern, sobald der Torus der länge nach in zwei materalien geteilt ist, d.h. man programmiert zwei Tori, dessen Querschnitte jeweils zwei Halbkreise (jeweils gespiegelt) sind und positioniert die Halbkreise  so, daß ein einziger Torus mit einem runden Querschnitt erscheint.
Dann sieht der Torus durch das Environment-Mapping aus, als würde er aus zwei Tori bestehen, deren Quenrschnitt nicht jeweils ein Halbkreis ist, sondern ein ganzer Kreis.
idx3d streckt bzw. staucht die Envireonment-Textur einfach auf die Oberfläche, das führt zu optischen Täuschungen  :cry:  
Wie ist es bei jpct? Metallische glänzende Oberflächen? Sind sie einfach und korrekt zu realisieren?

EgonOlsen

Das Problem wird sein, dass das Environmentmapping schlicht und einfach ein Fake ist. Bei jPCT genauso wie bei IDX3D. Für die Generierung der Koordinaten werden die Vertexnormalen genommen und die sind bei einem Objekt standardmäßig anders, als wenn du das Objekt splittest. Das liegt an der Art der Berechnung (Mittelwert auf den Flächennormalen der angrenzenden Flächen). Was man in jPCT machen könnte: Die Vertexnormalen nachträglich so ändern, dass sie korrekt sind (d.h. so, als wäre das Objekt nicht zweigeteilt). Das ist nicht sooo kompliziert, erfordert aber ein Grundverständniss, was eine Vertexnormale überhaupt ist.

ender

Danke für die schnelle Antwort. Bringt mich auf jeden Fall weiter.
Lassen sich mit JPCT metallische Oberflächen anders als mit Environment-Mapping realisieren? Wenn nein habe ich noch ein Problem damit:
Speziell bei einem (der länge nach) zweigeteilten Torus bildet das Env.Mapping das definierte Environment auf beide Flächen jeweils komplett ab. Eigentlich müsste auf einer Seite die eine Hälfte und auf der anderen die andere Hälfte.  Das führt auch zu optischen Täuschung, wenn der Torus mit punktförmigem Licht bestrahlt wird oder die Environment Map in der Mitte ein reklektierendes Fenster hat. Es gibt dann statt einer großen zwei kleine Reflektionen auf dem Torus. Gibt es dazu auch eine Lösung?

EgonOlsen

Und das ist anders, wenn das Objekt nicht zweigeteilt ist?

ender

Ja, leider.  Ich habe ein Beispiel angefügt. Es sind zwei Tori, die zusammen einen Torus ergeben:
http://www.asgold.de/bilder/temp.jpg

Die Environment-Map ist auf beiden einzelnen Tori komplett abgebildet. Eigentlich müsste die Environment-Map auf jeden zur Hälfte abgebildet sein. Eine Lösung wäre natürlich die Environment-Map-Datei aufzuteilen in einzelne Hochkant-Segmente und je nach Breite auf die Tori aufsetzen, aber das ist glaube ich nicht besonders schön und bringt später viele Fehler.

ender

Entschuldigung. Habe vergessen das gleiche Beispiel mit einem ganzen Torus mit anzugeben:
http://www.asgold.de/bilder/temp2.jpg

EgonOlsen

Ok, ich verstehe jetzt, was du meinst. Das Problem liegt (wie schon angerissen) bei den Vertexnormalen. Was man machen müsste: Die Vertexnormalen der beiden Tori so ändern, dass sie denen eines einzelnen entsprechen. Mit jPCT kann man das mit einer Implementierung von GenericVertexController erreichen, die wird allerdings nicht ganz trivial.
Ich würde es etwa so angehen: Einzeltorus nehmen und mit einem GenericVertexController die ganzen Normalen inkl. der Vertexkoordinaten selber rausziehen. Dann einen weiteren GenericVertexController auf die beiden Tori ansetzen, der für jeden Vertex eines Halbtorus' einen aus der gemerkten Liste der Vertices des Einzelobjekts ermittelt, der von den Koordinaten her möglichst ähnlich ist. Von diesem die gemerkte Normale nehmen. Das kann klappen, wenn die beiden (bzw. drei) Objekte an sich sehr ähnlich (nur eben mittig geteilt) sind. Ob das hier so ist...keine Ahnung, dazu müsste ich ein Drahtgitter sehen.
Ansonsten könnte man die Normalen auch komplett "von Hand" neu berechnen, aber das klingt zumindest erstmal nach noch mehr Aufwand.

ender

Vielen Dank. Werde mal das versuchen. Hab' aber eine letzte Frage: Geht mit jpct auch echtes Bump Mapping?

EgonOlsen

Quote from: "ender"Geht mit jpct auch echtes Bump Mapping?
Was meinst du mit "echt"? Unter Angabe von Normalmaps? Dann nein, es geht "nur" das environmental mapped BM des Softwarerenderers und das auch nur dort.

ender

Ich meine Bump Mapping wie bei
http://de.wikipedia.org/wiki/Bump_Mapping

Ich möchte nämlich einen Torus bestehend aus verschiedenen metallischen Materalien darstellen. Diese Materialien sind entweder glänzend oder auch nicht glänzend. Die nichtglänzenden Oberflächen sollen wie sandgestrahlt oder wahlweise wie mattgeschliffen aussehen. Die glänzenden Materialen lassen sich gut durch Environment-Mapping realisieren. Die nichtglänzenden Oberflächen, die eine Oberflächen-Struktur  haben, ließen sich gut durch Bump-Mapping realisieren. Es ist sicher auch eine Frage der Performance. Mir würde es reichen, wenn man aufgrund von Performance-Problemen einen Snapshot  der Szene erhalten könnte. (Ich möchte kein Spiel programmieren, sondern ein Programm mit dem so ein Torus konfiguriert und möglichst realistisch dargestellt werden kann.)
Planst Du irgendwann echtes Bump-Mapping? Oder kann man es mit Hilfe von JPCT mit entsprechendem Programmieraufwand realisieren?

EgonOlsen

Naja, also du kannst mit dem vorhandenen Bumpmapping schon Strukturen simulieren, sofern du dich auf den Softwarerenderer beschränkst. Die Strukturen nicht nur nicht korrekt ausgeleuchtet, sondern eher ein Fake...wobei es auf die verwendete Bumpmap ankommt, wie gut oder schlecht es aussieht. Hier ein kleines Beispiel: http://www.jpct.net/download/bumpdemo.zip

ender

Ich glaube das sieht gut aus. Ich werde es mit einem Torus mal probieren. Vielen Dank.