在OpenGL中使用多边形绘制2D粗圆弧
Draw 2D thick arc using polygon in 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 ) );
}
请注意,GL_POLYGON
只适用于凸多边形。
你必须对凹多边形进行三角化。
尝试使用三角形扇子,并将表盘的中心作为第一个点。addVertex(vec3(0.0f, 0.0f, 0.0f));
我还建议将I设置为int或unsigned int,这里的float没有意义
我是这样动态创建多边形的:
//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();
}
相关文章:
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- 如何在 openGL-2D 中绘制不同颜色的线条?
- 在 Mathematica 中绘制来自 c++ 的 2D 晶格数据
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- 绘制非常大的 2D 图形时出现问题
- (C++)在圆内夹紧 2D 位置(使用中点圆算法绘制)
- 过剩无法绘制 2D 图像
- UWP中的直接2D SVG绘制
- 通过在Android(和iOS)上使用QT绘制具有3D效果的2D线
- 在OpenGL中绘制多个2D纹理
- 如何在 2d 数组中绘制 X?C++
- 如何快速绘制10000 2D图形对象
- 在3D世界中的显示器上固定位置绘制2D文本-OpenGL
- 如何在 DirectX 中绘制 2D 几何体和 3D 对象?(D3D9)
- Opengl 在移动的 3D 场景中绘制 2D 矩形
- 在 2D 坐标系上绘制曲线轨迹
- 直接2D 加载和绘制位图
- 如何使用OpenGL绘制2D图像
- 在OpenGL中使用多边形绘制2D粗圆弧
- 如何在OpenGL中一起绘制2D和3D内容?