Sollte ich die Eckpunkte des Dreiecks entsprechend ihrer Position neu anordnen, um eine korrekte Wicklung (im UhrzeigersC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Sollte ich die Eckpunkte des Dreiecks entsprechend ihrer Position neu anordnen, um eine korrekte Wicklung (im Uhrzeigers

Post by Anonymous »

Ich zeichne Dreiecke in OpenGL mit DrawArrays():

Code: Select all

public void DrawTriangle(
Vector2 a,
Vector2 b,
Vector2 c,
ShapeOptions shapeOptions = null)
{
shapeOptions ??= PresentationConsts.Shape.DefaultOptions;

var vertices = new float[]
{
a.X, a.Y,
b.X, b.Y,
c.X, c.Y,
};

GL.BindBuffer(BufferTarget.ArrayBuffer, _baoId);
GL.BufferData(
BufferTarget.ArrayBuffer,
vertices.Length * sizeof(float),
vertices,
BufferUsageHint.DynamicDraw);

shapeOptions.UseWithProgram();

GL.BindVertexArray(_vaoId);
GL.DrawArrays(PrimitiveType.Triangles, 0, 3);

GL.BindVertexArray(0);
GL.UseProgram(0);
}
Ich habe in ShapeOptions einen Modus zum Auswählen der Scheitelpunktwicklung:

Code: Select all

public enum DrawMode
{
Clockwise,
CounterClockwise
}
Wenn CounterClockwise ausgewählt ist, vertausche ich die letzten beiden Eckpunkte:

Code: Select all

var vertices = shapeOptions.DrawMode == DrawMode.Clockwise
? new float[] { a.X, a.Y, b.X, b.Y, c.X, c.Y }
: new float[] { a.X, a.Y, c.X, c.Y, b.X, b.Y };
Hier ist das Problem:
  • Angenommen, die Eckpunkte des Dreiecks werden in der Reihenfolge a -> b -> c übergeben.
  • Angenommen, der Modus ist auf CCW eingestellt.
  • Fall 1

    Code: Select all

      b
    a
    c
    
    Die Wicklung ist gegen den Uhrzeigersinn.
  • Fall 2

    Code: Select all

    a
    c
    b
    
    Die Wicklung ist CW.
Muss ich die Wicklung vorab berechnen, indem ich die Positionen der Scheitelpunkte vergleiche und sie neu anordne, bevor ich die CW/CCW-Logik anwende?
Oder reicht es, die Scheitelpunkte einfach blind entsprechend dem ausgewählten Modus auszutauschen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post