Smoothing deaktivieren ?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Xane

Betreff: Smoothing deaktivieren ?

BeitragSa, Feb 12, 2005 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Feb 13, 2005 0:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

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

Ayman

Betreff: Hab ENDLICH die Lösung gefunden

BeitragSa, Feb 26, 2005 7:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ... Rolling Eyes

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 Laughing ..., denn wer eine Animation mit ms3d erstellt hat und sie nach Blitz3D exportieren will, hat die Rechnung sowohl ohne Mark Siblie's ms3d-b3d-Exporterplugin gemacht, noch kann er sich auf das DirectX8-Exporterplugin von ms3d verlassen. Beide Pluginautoren finden es nämlich offenbar eine tolle Idee, Vertices, die am selben Ort liegen, zusammenzufassen Evil or Very Mad
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 Smile

Grüße
Ayman
 

OJay

Betreff: Re: Hab ENDLICH die Lösung gefunden

BeitragSa, Feb 26, 2005 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Ayman

BeitragSa, Feb 26, 2005 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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 !

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group