Frage

Ich ersteller einen HTML5-Leinwand 3D-Renderer, und ich würde sagen, dass ich ohne die Hilfe von so ziemlich weit weit gereist bin, aber ich bin in einen Showstopper von Sorten geführt. Ich versuche, die Backface-Culreing auf einem Cube mit Hilfe einiger Normalen Berechnungen umzusetzen. Ich habe dies auch als Webgl getaggt, da dies eine allgemeine Frage ist, dass sie sowohl für meinen Anwendungsfall als auch für einen 3D-beschleunigten Antrag gelten könnte.

Jedenfalls, während ich den Würfel drehe, habe ich festgestellt, dass die falschen Gesichter verborgen sind. Beispiel:

Backface Culling-Problem auf einem Cube

Ich verwende die folgenden Scheitelpunkte: https://developer.mozilla.org/de/webgl/createing_3d_objects_using_webgl_3d_objects_ussing_webgl.de 27s_vertierungen

Das allgemeine Verfahren, das ich benutze, ist:

    .
  1. Erstellen Sie eine Transformationsmatrix, mit der die Scheitelpunkte des Würfels

  2. umgewandelt werden sollen

  3. für jedes Gesicht, und für jeden Punkt auf jedem Gesicht umwandele ich diese in VeC3s, und multiplizieren sie mit der in Schritt 1 hergestellten Matrix.

  4. Ich bekomme dann die Oberflächennormal des Gesichts mit Newells Methode, und bekomme dann ein Punktprodukt von diesem Normal- und einigen gebrauchten Vec3, z. B. [-1, 1, 1], da ich nicht konnte Ich denke an einen guten Wert, um hier einzugehen. Ich habe gesehen, dass einige Leute die Position der Kamera dafür verwenden, aber ...

  5. Überspringen des üblichen Schritts der Verwendung einer Kameramatrix, ziehe ich die X- und Y-Werte von den resultierenden Vektoren an, um an meine Zeile zu senden und Renderer zu sehen, aber nur, wenn sie ein Punktprodukt über 0 haben. Ich erkennen Es ist ziemlich willkürlich, welche ich ziehe, wirklich.

  6. Ich frage mich zwei Dinge; Wenn mein Verfahren in Schritt 3 korrekt ist (höchstwahrscheinlich nicht), und wenn die Reihenfolge der Punkte, die ich auf den Gesichtern zeichne, ist falsch (sehr wahrscheinlich). Wenn das letztere wahr ist, bin ich mir nicht sicher, wie ich das Problem visualisieren kann. Ich habe gesehen, dass die Leute sagen, dass Normalen nicht relevant sind, dass es die Richtung ist, dass die Linie gezogen wird, aber ... es ist schwer für mich, den Kopf herumzuwickeln, oder wenn das meine Quelle meines Problems ist. .

    Es spielt wahrscheinlich keine Rolle, aber die Matrix-Bibliothek, die ich verwende, ist GL-Matrix:

    https://github.com/toji/gl-matrix

    auch die bestimmte Datei in meiner Open-Source-Codebase, die ich verwende, ist hier:

    http://code.google.com /p/nanoblok/source/browse/nb11/app/render.js

    Vielen Dank im Voraus!

War es hilfreich?

Lösung

Ich habe Ihr gesamtes System nicht überprüft, aber der "gebrauchte Vec3" sollte nicht willkürlich sein. Es sollte der Vektor "aus dem Bildschirm" sein, der (da Ihr Projektion ⟨ x ist, y , z ⟩ → ⟨ x , y ⟩) ist entweder ⟨0, 0, -1⟩ oder ⟨0, 0, 1⟩ in Abhängigkeit von der Händigkeit und der Bildschirmachsen Ihres Koordinatensystems. Sie haben keine explizite "Kameramatrix" (das normalerweise als Ansichtsmatrix bezeichnet wird), aber Ihre Kamera (Ansicht und Projektion) wird jedoch implizit durch Ihren Schritt 4-Projektion definiert!

heißt jedoch, dass dieser Ansatz nur für orthographische Vorsprünge funktioniert, nicht perspektivische (ein Gesicht auf der linken Seite des Bildschirms betrachten, nach rechts und parallel zur Ansichtrichtung zeigen; Das Punktprodukt wäre 0, aber es sollte sein sichtbar). Der übliche Ansatz, der in der tatsächlichen 3D-Hardware verwendet wird, besteht darin, zunächst die gesamte Transformation (einschließlich Projektion) durchzuführen, und prüfen Sie dann, ob das resultierende 2D-Dreieck gegen den Uhrzeigersinn oder im Uhrzeigersinn aufgewickelt ist, und basierend auf dieser Bedingung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top