Smoothing deaktivieren ?
Übersicht

XaneBetreff: Smoothing deaktivieren ? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Huhu,
also, hab folgendes Problem. Arbeite atm an einem Low-Poly Space-Shooter und die Modelle sind richtig Low-Poly (ca 100 - 150 Polys / Modell) á la SuperFX auf dem SNES. Das Problem ist nun, dass B3D die Modelle smootht, dH, die Polygone sehen nicht mehr flash aus, sondern eher geglättet und der Schatten macht die Triangles sichtbar. Der Sinn geht ja darin verloren... will's kantig und eckig XD... Meine Frage: Kann man das Smoothing in B3D deaktivieren ? Beim Modell habe ich das Smoothing deaktiviert, nur kein Unterschied bei B3d. - So sollte es aussehen. - So sieht's aus. Danke im Vorraus. ^^ |
||
![]() |
Ayman |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Thema hatte ich auch mal: alter Thread
Die Lösung kam dann von Robert Hierl per Post, wofür ich ihm noch heute dankbar bin ![]() Hier folgt die Funktion, die er damals geschrieben hat. Ich hab nur seine Emailadresse entfernt.: Code: [AUSKLAPPEN] ; UpdateNormalsFlat (mesh)
; ; Dient dazu Meshes, die mit EntityFX 4 von BB3d sonst falsch schattiert würden ; so umzubauen, dass das Problem behoben wird. ; ; Einfach nach dem Laden des Meshs diese Funktion drüberlaufen lassen. ; ; Vertexshading ist damit natürlich im Eimer, aber Flatshading schaut gut aus... ; Wichtig bei den Modellen ist, dass jedes Polygon eigene Vertexpunkte besitzt. ; ; UpdateNormals muss man in diesen Fällen auch vermeiden, da es den ursprünglichen ; Zustand von vor dem Aufruf von UpdateNormalsFlat wiederherstellen würde! ; ; Code von Robert Hierl, Mai 2004 Function UpdateNormalsFlat(mesh) Local surface, mesh_surface, faktor# Local v1, v2, v3 Local ax#, ay#, az# Local lx#, ly#, lz# Local nx#, ny#, nz# For mesh_surface = 1 To CountSurfaces(mesh) surface=GetSurface(mesh,mesh_surface) For triangle = 0 To CountTriangles(surface)-1 v1 = TriangleVertex(surface, triangle, 0) v2 = TriangleVertex(surface, triangle, 1) v3 = TriangleVertex(surface, triangle, 2) ;Achse durch v1 als Vektor lx# = -((VertexX#(surface,v3) + VertexX#(surface,v2))/2-VertexX#(surface,v1)) ly# = -((VertexY#(surface,v3) + VertexY#(surface,v2))/2-VertexY#(surface,v1)) lz# = -((VertexZ#(surface,v3) + VertexZ#(surface,v2))/2-VertexZ#(surface,v1)) ;Kante von v2 zu v3 als Vektor ax# = VertexX#(surface,v2) - VertexX#(surface,v3) ay# = VertexY#(surface,v2) - VertexY#(surface,v3) az# = VertexZ#(surface,v2) - VertexZ#(surface,v3) ;Kreuzprodukt beider Vektoren nx# = (ly# * az#)-(lz# * ay#) ny# = (lz# * ax#)-(lx# * az#) nz# = (lx# * ay#)-(ly# * ax#) ;Ergebnisvektor auf Laenge 1 bringen faktor# = Sqr((nx# * nx#)+(ny# * ny#)+(nz# * nz#)) nx# = nx# / faktor# ny# = ny# / faktor# nz# = nz# / faktor# VertexNormal surface, v1, nx#, ny#, nz# Next Next End Function Grüße Ayman |
||
![]() |
AymanBetreff: Hab ENDLICH die Lösung gefunden |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo zusammen,
jetzt hab ich endlich _eine_ Lösung zu diesem Problem gefunden - meine Herren, war das ein K(r)ampf - werft nur mal einen Blick auf die Uhrzeit ... ![]() Vorab: Hier geht es um korrektes Flatshading bei Animationsmodellen. Der Grund, dass bei vielen Modellen nur SmoothShading funktioniert, wurde zwar schon andernorts erwähnt, aber ich will es eingangs noch mal kurz umreißen und darum wird das hier so eine Art Kurztutorial zum Thema: Wie bekomme ich flach schattierte Animationsmodelle in Blitz3D korrekt zum laufen? Zur Beleuchtung von Polygonen (Triangles in Blitz3D) braucht es Normalenvektoren. Je nach Winkeldifferenz zwischen Normalenfektor und Lichtvektor wird die Fläche anders beleuchtet. Ist der Winkel gleich Null, dann fällt das Licht senkrecht ein und beleuchtet darum die Fläche zu 100%. Bei einer Winkeldifferenz von 90° fällt kein Licht mehr auf die Fläche, weswegen sie dunkel bleibt. Nun behauptet Blitz3D zwar, dass es ein Modell flach schattieren kann, wenn man den Befehl Code: [AUSKLAPPEN] EntityFX <mesh>, 4 auf das Mesh anwendet, aber das stimmt nur zum Teil. Nicht erwähnt wird/werden dabei im Allgemeinen die wichtige(n) Nebenbedingung(en), die dabei beachtet werden müssen.
Obwohl wir hier von der Beleuchtung von Flächen sprechen, werden die Normalenvektoren aus technisch für mich im Moment nicht nachvollziehbaren Gründen als Eigenschaften der Vertices abgespeichet. Zu _einem_ Vertex gehört demnach immer genau _eine_ Normale. Jetzt wissen wir alle, dass ein Vertex i.A. nicht nur _einem_ Triangle als Stützpunkt dient, sondern gemeinhin mehreren, denn das zeichnet eben eine übliches Mesh aus: An den Vertices stoßen die Triangles aneinander und werden durch sie zu einer größeren Fläche verbunden. Und damit wird auch schon das Problem offenbar: Wenn ein Vertex nur _einen_ Normalenvektor enthält, welchem Triangle wird dieser Normalenvektor im Falle der gewünschten Flachschattierung dann zugeordnet? Antwort: Meistens der falschen!!! Darum klappt es also nicht auf diese Art. Der nächste Schritt zur Lösung ist auch schon hier erläutert worden, wenn ich auch nicht weiß, ob unbedingt in diesem Kontext, also mach ich mal weiter. Ich gehe im folgenden mal davon aus, dass der Milkshape3D Modeller (ms3d) ein für Blitz3D-Programmierer übliches Tool ist. In ms3d gibt es die für dieses Problem nützliche Funktion "Vertex->Unweld". Diese dupliziert einfach alle ausgewählten Vertices dergestalt, dass hinterher für jedes Face (Triangle in Blitz3D) ein _separater_ Vertex existiert. Mit Modellen, die wir schön eckig dargestellt haben wollen, bietet sich der Gebrauch dieser Funktion also flächendeckend an, will sagen: Behandle damit jeden Vertex! Im Ergebnis hat das Modell nun zwar mehr Vertices, aber endlich zugleich die Chance für jedes Face/Triangle einen korrekten Normalenvektor abzulegen. Wer jetzt meint, dass wäre es schon gewesen, der unterschätzt die Perfidie des Details ![]() ![]() Was also damit exportiert wird ist in Punkto Flatshading nicht mehr zu gebrauchen - dummerweise sind wir ms3d-User aber auf eines dieser beiden Plugins angewiesen, da Blitz3D keine anderen Formate importieren kann. Die Lösung ist folgender Umweg: Man exportiert das Modell samt Animation im Milkshape3D-ASCII-Format in eine *.txt Datei und - jetzt geht es leider an den Spargroschen - kauft sich CharacterFX (15 US-Dollar), importiert die ms3d-ASCII-Datei und exportiert umgehend als *.b3d. Das war's - leider noch nicht. Zwar war Mark beim Implementieren des B3D-Importers gründlicher. Hierbei verliert er keine Vertices auf der Strecke ..., aber ein schlichtes EntityFX mesh, 4 reicht leider nicht aus - wäre wohl zu einfach. Folgendes ist nun noch zu tun:Code: [AUSKLAPPEN] mesh = LoadAnimMesh (<pfad zum mesh>)
UpdateNormalsFlat mesh ; die weiter oben abgedruckte Funktion von Robert Hierl EntityFX mesh,4 Das war's nun in der Tat ![]() Grüße Ayman |
||
OJayBetreff: Re: Hab ENDLICH die Lösung gefunden |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ayman hat Folgendes geschrieben: ... da Blitz3D keine anderen Formate importieren kann.
das ist so nicht ganz richtig... tatsächlich kann blitz3d auch *.3ds und, mit entsprechender bibliothek, *.ase laden! vielleicht hättest einfach mal diese formate testen sollen ![]() |
||
![]() |
Ayman |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ach OJay,
war ja sicher konstruktiv gemeint, aber lies doch mal den Kontext. Es geht um einen Export aus Milkshape3D. Und der kann bis zur aktuellen Version 1.7.4 keine Animationen im 3DS-Format exportieren. Oder liegen Dir da andere Informationen vor? Und mit einer 'entsprechenden Bibliothek' kann ich natürlich alles anfangen, nur haben müsst ich sie und das gestellte Problem lösen müsste sie auch noch ... Was sind denn diese ASE-Files und womit kann ich die produzieren? Grüße Ayman __________________ ... und ich hab einen gaaanz tollen Rechner - einen wirklich gaaaanz tollen - und meiner ist länger und größer und viiiiiel schneller als deiner und vor allem gaaaanz toll ! |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group