2017-05-24 2 views

Antwort

0

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).

1

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
Verwandte Themen