Veränderung von Normalenvektoren bei Skalierung von Objekten

  • Loksim-Version: 2.9.4
    Programmteil: Editor - Objekte
    Betriebssystem: Windows 7
    Rechnerkonfiguration:
    Fehlerbericht gesendet:
    _________________________


    Guten Morgen,


    ich nutze gerne die Möglichkeit, Objekte zu gruppieren. Da ich gerade an verschieden langen Signalenmasten arbeite, habe ich den vorderen, hinteren und die seitlichen Rahmenelemente zusammengefasst, kann diese in das Mastobjekt am Ende als ein Objekt einfügen und nach Länge skalieren. Um die Deckfläche des Rahmens ebenfalls nicht zusätzlich in der Höhe verschieben zu müssen, habe ich diese auch mit eingefügt. Da es sich dabei um ein flaches Objekt handelt, sollte die Skalierung in Y-Richtung auf dieses Objekt keinen Einfluss haben. Scheinbar werden aber die Normalenvektoren dadurch falsch beeinflusst.


    unskaliertes Gruppenobjekt


    Faktor 2


    Faktor 10


    Die Deckfläche mit dem Normalenvektor 0/1/0 wird dabei dunkler, je größer der Skalierungsfaktor ist. Es hat dabei auch keinen Einfluss, wie dieses Teilobjekt ursprünglich ausgerichtet und gedreht wurde.


    Gruß, Klaus

  • Die Berechnung dürfte so korrekt sein, die Normalenvektoren werden ja mitverzerrt.

    Triebfahrzeugführer im Streckendienst der DB Fernverkehr in Frankfurt/Main
    BR: 101, 120, 147.5, IC-Steuerwagen, IC2-Steuerwagen, 401 ("ICE 1"), 402 ("ICE 2"), 403 ("ICE 3"), 406 ("ICE 3M"/"ICE 3MF"), 407 ("neuer ICE 3"), 411 ("ICE T"), 415 ("ICE T")

  • Hallo Julian,


    wenn aus "1" bei Verzerrung mit Faktor 10 "10" werden würde, würde sich am Verhalten gar nichts ändern, da sich Werte über 1 wie 1 verhalten.


    Fun Fact: Wenn ich im Objekt den Normalenvektor zu 0/10/0 statt 0/1/0 setze, verändert sich die Beleuchtung bis zu einer Skalierung von 10 nicht, und darüber dann entsprechend wie bei korrektem Normalenvektor.


    Gruß, Klaus


    EDIT: ich bezweifle die Korrektheit dieser Skalierung:


  • Ah! Dann glaube ich zu wissen, was da passiert. Die Normalenvektoren verweisen ja jeweils vom zugehörigen Vertex auf einen fiktiven Zielpunkt. Offenbar werden beim Skalieren hier nicht die Normalenvektoren, sondern die fiktiven Zielpunkte unverändert gelassen. In Deinem ersten Beispiel wird so aus dem Normalenvektor (0|1|0) etwas in Richtung (0|-9|0) (bei angenommener Objekthöhe von 1). Das ist natürlich in jedem Fall falsch.

    Triebfahrzeugführer im Streckendienst der DB Fernverkehr in Frankfurt/Main
    BR: 101, 120, 147.5, IC-Steuerwagen, IC2-Steuerwagen, 401 ("ICE 1"), 402 ("ICE 2"), 403 ("ICE 3"), 406 ("ICE 3M"/"ICE 3MF"), 407 ("neuer ICE 3"), 411 ("ICE T"), 415 ("ICE T")

  • Ich tippe eher drauf, dass bei Skalierung von 10 aus 1 => 0.1 wird, also in die falsche Richtung skaliert wird. Bzw. die Normierung vergessen wird.




    Oder beides. Also statt die Normalenvektoren bei der Skalierung zu multiplizieren wird durch den Faktor dividiert und dann wird auch nicht normiert. Die Länge aller Vektoren müsste ja 1 sein, also bei einem 45° nach oben zeigendem Vektor nicht 1/1/0 oder 0.5/0.5/0 sondern ~ 0.707/0.707/0. Bei der Funktion der automatischen Berechnung der Vektoren wurde die Normierung ja auch erst nachträglich implementiert, insbesondere für runde Objekte, da dort zuerst die Berechnung der Flächenvektoren wie bei der Berechnung für eckige Objekte erfolgt und jeder Punkt dann die Summe der Vektoren aller angrenzenden Flächen erhält und anschließen die Vektoren alle auf die Länge 1 gesetzt werden (Berechnung der Länge über Wurzel(x^2+y^2+z^2) und Teilen der X-, Y- und Z-Komponente durch die Länge. Genau das fehlt hier eindeutig. Der Würfel müsste nämlich in jede Richtung weiterhin die Vektorlänge 1 haben... und erhalt scheinbar überall 0.1.


    Gruß, Klaus

  • Das Problem hatte ich beim Bau des Sattelaufliegers für den Loktransport festgestellt. Ich bin dann dem Umweg gegangen und habe die Stirnseiten entfernt. Das ganze hat dann allerdings ein paar mehr Objekte gebracht. Nur so konnte ich den dunklen Flächen aus dem Weg gehen.


    Gruß
    Martin

  • Hallo Martin,


    ja, mich stört es auch, wenn dadurch die Produktivität sinkt. Hier im konkreten Fall brauchte es 4 statt 3 Schritte zur Änderung der Mastlänge. Dennoch konnte ich die in Überarbeitung und Neubau älterer Signalbauformen erwähnten 18 Mastlängen schon recht schnell erstellen. Etwas länger wird die Einarbeitung in die eigentlich fast fertigen Signalobjekte dauern, da dann je nach Bahnsteighöhe mehrere Einzelteile nach oben geschoben werden müssen (Mastschild, Bezeichnungsschild und vorderer Schaltkasten) und zwar so, dass sie sich nicht mit den anderen Elementen überschneiden (Wobei eine Überschneidung von Bezeichnung und Mastschild tatsächlich vorkommt, dies war auf Fotos von @taler zu sehen).


    Gruß, Klaus

  • Nur am Rande bemerkt: In Blender hätte man das Problem nicht, dort werden die Normalen natürlich korrekt gerechnet. Trotzdem sollte der LS3D-Editor das natürlich auch können für diejenigen, die an dem Werkzeug festhalten möchten.

    Triebfahrzeugführer im Streckendienst der DB Fernverkehr in Frankfurt/Main
    BR: 101, 120, 147.5, IC-Steuerwagen, IC2-Steuerwagen, 401 ("ICE 1"), 402 ("ICE 2"), 403 ("ICE 3"), 406 ("ICE 3M"/"ICE 3MF"), 407 ("neuer ICE 3"), 411 ("ICE T"), 415 ("ICE T")

  • Die Frage ist, was passiert, wenn ich ein Objekt mit Blender erstelle und dann im Loksim-Editor skaliere? Auch das wäre denkbar, denn auch Blender-Objekte müssen im Bezug auf Variablensteuerung im Loksim-Editor nachträglich zusammengesetzt werden. Und wie wir sehen, passiert da genau dasselbe (hier am Beispiel der 232 von Moritz, ich war jetzt zu faul, selbst schnell was mit Blender zu exportieren):




    Gruß, Klaus

  • Missverständlich ausgedrückt. Mit "Blender nutzen" meinte ich "alles in Blender machen" (außer halt Sichtbarkeitsbedingungen und co). Dass die fehlerhafte Normalenvektorenskalierung im LSEditor immer greift habe ich angenommen (wäre ja noch seltsamer, wenn nicht). Ist dann natürlich ein völlig anderer Workflow.

    Triebfahrzeugführer im Streckendienst der DB Fernverkehr in Frankfurt/Main
    BR: 101, 120, 147.5, IC-Steuerwagen, IC2-Steuerwagen, 401 ("ICE 1"), 402 ("ICE 2"), 403 ("ICE 3"), 406 ("ICE 3M"/"ICE 3MF"), 407 ("neuer ICE 3"), 411 ("ICE T"), 415 ("ICE T")

  • Hallo,
    interessantes Problem, ich vermute es geht um das hier:
    https://stackoverflow.com/ques…rse-of-the-modelview-matr


    Allerdings weiß ich gerade nicht wie ich das in den Loksim-Code einbauen könnte, da ich die Normalen nicht "per Hand" transformiere sondern DirectX alles überlasse. Irgendwo muss es hier eine Möglichkeit geben einzugreifen - oder DirectX7 ist da noch nicht weit genug :/ Meine Recherche heute hat mich nicht weitergebracht, aber ich werde es weiter versuchen


    lg
    Lukas

  • Hallo Carsten,
    danke für die Info! Das könnte wirklich weiter helfen. Ich werde schauen ob es eine solche oder ähnliche Konstante in DX7 gibt.


    lg
    Lukas

  • Hallo,
    danke @Carsten Hölscher für den Tipp, bei DX7 gibt es D3DRENDERSTATE_NORMALIZENORMALS.
    Und es funktioniert ;)


    Allerdings muss jetzt unsere alte Bekannte die Abwärtskompatibilität gefragt werden ob wir das überhaupt dürfen ;)
    Das Problem ist, dass ein generelles Setzen dieses Status, alle Normalenvektoren normalisiert. Wenn ein bestehendes Objekt also einen Normalenvektor von zB 0/10/0 hat, würde das bei einer Loksim Version mit diesem gesetzten Renderstatus anders aussehen.


    Wir hätten nun meines Erachtens folgende Möglichkeiten (wenn jemand eine andere Lösung einfällt, bitte einfach ergänzen):


    a) Wir setzen den Status allgemein, weil es sowieso fragwürdig ist ob Objekte ohne normalisierte Normalenvektoren jemals so gewünscht waren
    b) Die Option kann auf Gruppenobjektebene aktiviert werden
    c) Die Option wird automatisch aktiv, falls ein Objekt skaliert wird


    a) wäre für mich am einfachsten und schnellsten umgesetzt. Ich tendiere aber eher zu c) als saubere Lösung wo es nur sehr wenige Probleme mit bestehenden Objekten geben sollte und dem Benutzer keine zusätzliche Option angeboten werden muss (was die richtige Objekterstellung schwieriger macht). Was meint Ihr?


    lg
    Lukas

  • Moin,


    ich bin auch für a, einfach, weil es im Loksim keinen Sinn macht, andere Längen als 1 anzusetzen. Allerdings glaube ich, dass Leute Längen unterhalb von 1 gesetzt haben, vermutlich aber auch nicht wissentlich (wie im Beispiel 0.5/0.5/0 in meinem anderen Post). Wie dort schon geschrieben könnte man damit die Reflexion matter Flächen verringern, hat aber bisher sowieso keine wissentliche Anwendung gefunden. In anderen Engines geschieht das meines Wissens über Material.


    Gruß, Klaus

  • Nur am Rande bemerkt: In Blender hätte man das Problem nicht, dort werden die Normalen natürlich korrekt gerechnet. Trotzdem sollte der LS3D-Editor das natürlich auch können für diejenigen, die an dem Werkzeug festhalten möchten.

    Trotz korrekter Beleuchtung in Blender macht Loksim hier Blödsinn.



    Die Deckfläche ist in Blender als "flat" definiert, Loksim sollte also so tun, als wären Normalenvektoren pro Fläche aktiv, damit dürfte dieser dunkle Schatten da überhaupt gar nicht auftauchen.

  • PatrickR

    Hat das Label von Bestätigt auf Behoben geändert