Wie heißt das bei der Programmierung von Videospielen? Einige Formeln zeigen es. Was sind einige dieser Formeln?Wie kann festgestellt werden, ob ein Polygon zur Kamera zeigt oder weg zeigt?
Antwort
Wenn die Polygone gegen den Uhrzeigersinn ausgerichtet sind (d. H. Wenn ihre Eckpunkte in CCW aufgeführt sind), können Sie den Normalvektor für das Polygon berechnen und sehen, ob es zur Kamera zeigt oder von ihr weg zeigt.
Suchen Sie nach drei aufeinanderfolgenden Ecken a, b, c des Polygons, die einen konvexen Winkel bilden, und berechnen Sie den Normalenvektor (b-a) x (c-b).
Ok die Frage ist etwas mehrdeutig, da Sie fragen, was ist ein normales 3D-Problem, aber mit dem Tag 2d-Spiele. Aber 2D ist gültig, da die Richtung eines Polygons im Uhrzeigersinn (CW) oder gegen den Uhrzeigersinn (gegen den Uhrzeigersinn) (CCW) immer noch eine Eigenschaft eines 2D-Polygons ist.
Für 2D oder 3D (nach der Projektion angewendet wurde Transformations) haben Sie ein Polygon, das 3 oder mehr Ecken in 2D-Koordinaten (Bildschirmraum)
v1.x = ?; // vert x and y
v1.y = ?;
// v2, v3 same for two more verts on the polygon.
// polygon is drawn from v1, to v2, to v3
// long hand to show working clearly
// get the vector from v2 to v1
vec1.x = v1.x - v2.x;
vec1.y = v1.y - v2.y;
// get the vector from v2 to v3
vec2.x = v3.x - v2.x;
vec2.y = v3.y - v2.y;
// get the cross product of the 2 vectors
cross = vec1.x * vec2.y - vec1.y * vec2.x;
if(cross < 0) { /* polygon is CCW and facing away */ }
else if(cross > 0) { /* polygon is CW and facing */ }
else { /* cross is 0 means polygon is edge on */ }
Für die 3D-Lösung, die Sie Polygone keulen wollen hat als so früh wie möglich, um den Arbeitsaufwand des Putzers zu reduzieren. Die meisten 3D-Pipelines enthalten die Normale des Polygons (einen Vektor senkrecht zur Polygonfläche), der vorberechnet ist, und einen Teil der Polygonnetzgeometrie.
Die normale Normale des Polygons muss zuerst in den Weltbereich transformiert werden. Sie können dann das Skalarprodukt des Polygonwortraums normal und den Vektor der Kamera verwenden, um einen Wert mit dem Punkt < zu erhalten 0 bedeutet Polygonflächen weg, Punkt> 0 steht der Kamera gegenüber und Punkt == 0 Polygon ist Kante an.
Oder Sie können ein wenig vereinfachen und einen Vektor für die Kamera definieren, der die Blickrichtung im Weltbereich definiert.
norm = {x,y,z}; // transformed world space polygon normal
camNorm = {x,y,z}; //vector out from camera into world space
// get the dot product of norm and camNorm
dot = norm.x * camNorm.x + norm.y * camNorm.y + norm.z * camNorm.z
// now if dot is negative (facing in the opposite direction of the camera direction) the polygon is facing the camera
if(dot < 0) { /* polygon is CW and facing */ }
else if(dot > 0) { /* polygon is CCW and facing away */ }
else { /* dot is 0 means polygon is edge on */ }
In den meisten Fällen können Sie den Rand auf Fälle ignorieren und keulen sie (Punkt oder Quer == 0)
In einigen Fällen das Polygon erst spät in der Pipeline und kann nicht nicht definiert werden hab das normale. In solchen Fällen können Sie die Projektionstransformation anwenden und die 2D-Lösung (erste)
verwenden- 1. Wie kann festgestellt werden, ob ein Dateideskriptor gesucht werden kann?
- 2. Kann festgestellt werden, ob ein Objekt zur Laufzeit verfügbar ist?
- 3. Wie kann festgestellt werden, ob ein Netzwerkadapter kabellos ist?
- 4. Wie kann festgestellt werden, ob ein entferntes Netzwerkgerät verfügbar ist?
- 5. Wie kann festgestellt werden, ob ein Netzwerkpfad verfügbar ist oder nicht (online oder offline)?
- 6. Wie kann festgestellt werden, ob PHPUnit-Tests ausgeführt werden?
- 7. Kann festgestellt werden, ob ein UII-Bild dehnbar ist?
- 8. Wie kann festgestellt werden, ob es sich um ein Rechnungsjournal oder ein Zahlungsprotokoll handelt?
- 9. Wie kann festgestellt werden, ob die Montage durchgeführt wurde?
- 10. Wie kann festgestellt werden, ob "ZonedDateTime" "heute" ist?
- 11. Wie kann festgestellt werden, ob ein Skript beim Start oder manuell ausgeführt wird?
- 12. Wie kann festgestellt werden, ob ein Attribut in der Ursprungsklasse oder der geerbten Klasse liegt?
- 13. Wie kann festgestellt werden, ob der aktuelle Prozess übergeordnet ist?
- 14. Wie kann festgestellt werden, ob eine .NET-Ausnahme behandelt wird?
- 15. OpenCV Kamera Bild zeigt bläulich
- 16. Wie kann festgestellt werden, ob Webapp in Hudson oder anderen CI-Servern erfolgreich bereitgestellt wurde?
- 17. Wie kann festgestellt werden, ob VSTO 2010 Runtime installiert ist?
- 18. Wie kann festgestellt werden, ob der CKEditor geladen ist?
- 19. SurfaceView zeigt keine Kamera an
- 20. Kann festgestellt werden, ob sich die SIM/Telefonnummer geändert hat?
- 21. Wie kann festgestellt werden, ob das OAuth-Token abgelaufen ist?
- 22. Kann mit Hilfe von JavasScript festgestellt werden, ob sich ein GeoJSON-Punkt in einem GeoJSON-Polygon befindet?
- 23. Wie kann festgestellt werden, ob eine Internetverbindung verfügbar ist?
- 24. Wie kann festgestellt werden, ob das WPF-Fenster geöffnet ist?
- 25. Wie kann am einfachsten festgestellt werden, ob ein Android Wear-Gerät mit dem Telefon verbunden ist?
- 26. Kann festgestellt werden, ob ein Objekt von einem anderen Objekt referenziert wird?
- 27. Wie kann festgestellt werden, ob ein Aktionsparameter als 'Komplex' betrachtet werden soll?
- 28. Wie kann festgestellt werden, ob das JavaScript-Objekt ein Ereignis ist?
- 29. Erkennen, ob Linienfolge ein Polygon betritt oder verlässt
- 30. Wie kann festgestellt werden, ob ein NSSet Berührungen für ein bestimmtes Steuerelement enthält?