Нарисуйте 2D толстую дугу, используя многоугольник в OpenGL

Я хочу нарисовать толстую дугу (что-то вроде цветного сегмента аналогового циферблата), используя полигон. Для этого я добавил вершины в многоугольнике и его рабочую точку для внешней окружности, НО он соединяет концы для внутренней окружности (вогнутой стороны).

Та же логика прекрасно работает, если я добавлю эти вершины в Line, но это создаст пустую / незаполненную дугу.

Моя логика добавления вершин:

    for( float i = m_segmentVertex.size() - 1; i < vCount; i++ )
{
float x1 = (m_segmentVertex[ i ].x ) * cosA - m_segmentVertex[ i ].y * sinA;
float y1 = (m_segmentVertex[ i ].x ) * sinA + m_segmentVertex[ i ].y * cosA;
addVertex( vec3( x1, y1, 0.0f ) );
}

0

Решение

Быть в курсе, что GL_POLYGON работает только с выпуклыми многоугольниками.

Вам придется триангулировать вогнутые многоугольники.

1

Другие решения

Попробуйте использовать треугольный веер и сделайте центр циферблата первой точкой.
Возможно addVertex (vec3 (0.0f, 0.0f, 0.0f)); перед вашей петлей.

Я также рекомендовал бы делать int или unsigned int, здесь значение с плавающей точкой не имеет смысла.

0

Вот как я создал полигон динамически, триангулируя его:

//create thick colored segments
void CreateArcMesh( float sAngle, float eAngle, vec4 color, int thickness, int radius )
{
ObjectMeshDynamic meshObj = new ObjectMeshDynamic();
vec3 vertex[0];
float dAngle = ( ( eAngle - sAngle ) / ( VERTEX_COUNT / 2.0f ) );
float cosA = cos( DEG2RAD * dAngle );
float sinA = sin( DEG2RAD * dAngle );

meshObj.setMaterial( "material_base", "*" );
meshObj.setProperty( "surface_base", "*" );
meshObj.setMaterialParameter( "diffuse_color", color, 0 );
//Add the material on both side as the indices for Triangle strip start from last vertex added
Material material = meshObj.getMaterialInherit(0);
material.setTwoSided( 1 );
meshObj.addTriangleStrip( VERTEX_COUNT + 2 );

vec3 startPos = vec3( radius * cos( DEG2RAD * sAngle ), radius * sin( DEG2RAD * sAngle ), 0.0f );
vertex.append( startPos );

vec3 secondPos = vec3( ( radius - thickness ) * cos( DEG2RAD * sAngle ), ( radius - thickness ) * sin( DEG2RAD * sAngle ), 0.0f );
vertex.append( secondPos );

float x1 = startPos.x * cosA - startPos.y * sinA;
float y1 = startPos.x * sinA + startPos.y * cosA;
vertex.append( vec3( x1, y1, 0.0f ) );

x1 = secondPos.x * cosA - secondPos.y * sinA;
y1 = secondPos.x * sinA + secondPos.y * cosA;
vertex.append( vec3( x1, y1, 0.0f ) );

forloop( int k = 0 ; VERTEX_COUNT + 2 )
{
x1 = ( vertex[ vertex.size() - 2 ].x ) * cosA - vertex[ vertex.size() - 2 ].y * sinA;
y1 = ( vertex[ vertex.size() - 2 ].x ) * sinA + vertex[ vertex.size() - 2 ].y * cosA;

vertex.append( vec3( x1, y1, 0.0f ) );
meshObj.addVertex( vertex[k] );
}

vertex.clear();
meshObj.updateBounds();
meshObj.flush();
}
0
По вопросам рекламы [email protected]