OpenGL塗りつぶし非凸状の描画
2291 ワード
OpenGLは非凸多角形を直接描くことはできませんが、gluTessVertex()というOpenGLの「細分化」の方法で非凸多角形を描くことができます.具体的な原理は次のとおりです.
GLUtesselatorは、任意の多角形を三角形または凸多角形の組み合わせに簡略化し、OpenGLが任意の形状の多角形を描くことができる.
1. gluNewTess();//新しい格子化オブジェクトを作成する2.gluTessCallback();//コールバック関数を登録し、格子化されたいくつかの操作を完了し、そのまま書けばいいです.3. gluTessProperty();//あってもなくてもいいので、いくつかの格子化された属性値を設定します. gluTessBeginPolygon();//多角形draw polygonを描き始める...//ここで多角形を描くと、1つ1つでいいので、最後の点が最初の点と自動的に接続されますgluTessEdnPolygon()//多角形を描くのを終わらせる5.gluDeleteTess();//格子化されたオブジェクトの削除
しかし、実際の操作では、次の問題に注意してください.
多変形上の点gluTessEndPolygon()が実行される前に空間が解放されないことを保証するには、一般的にgluTessBeginContour()が開始される前に多角形の点が指定されているはず!!
OpenGLがポイントの情報を読み込んでいないため、画像が描けない現象が発生します.以下はMFCフレームビューでOpenGLで任意のポリゴンを描く方法ですが、興味のある方はご覧ください.
効果は次のとおりです.
以前、「Tess」の細分化の原理と詳細な説明について2つの文章を転載しましたが、興味のある方はご覧ください.
GLUtesselatorは、任意の多角形を三角形または凸多角形の組み合わせに簡略化し、OpenGLが任意の形状の多角形を描くことができる.
1. gluNewTess();//新しい格子化オブジェクトを作成する2.gluTessCallback();//コールバック関数を登録し、格子化されたいくつかの操作を完了し、そのまま書けばいいです.3. gluTessProperty();//あってもなくてもいいので、いくつかの格子化された属性値を設定します. gluTessBeginPolygon();//多角形draw polygonを描き始める...//ここで多角形を描くと、1つ1つでいいので、最後の点が最初の点と自動的に接続されますgluTessEdnPolygon()//多角形を描くのを終わらせる5.gluDeleteTess();//格子化されたオブジェクトの削除
しかし、実際の操作では、次の問題に注意してください.
多変形上の点gluTessEndPolygon()が実行される前に空間が解放されないことを保証するには、一般的にgluTessBeginContour()が開始される前に多角形の点が指定されているはず!!
OpenGLがポイントの情報を読み込んでいないため、画像が描けない現象が発生します.以下はMFCフレームビューでOpenGLで任意のポリゴンを描く方法ですが、興味のある方はご覧ください.
void CALLBACK PolyLine3DBegin(GLenum type)
{
glBegin(type);
}
void CALLBACK PolyLine3DVertex(GLdouble * vertex)
{
const GLdouble *pointer = (GLdouble *)vertex;
glColor3d(1.0, 0, 0);//
glVertex3dv(pointer);
}
void CALLBACK PolyLine3DEnd()
{
glEnd();
}
void DrawFloor(DataFloor* floor)
{
if (!floor) return;
std::vector<glm::vec3>& boundary_pts = *floor->GetBoundaryPtsToFloor();//
size_t amount_pts = boundary_pts.size();
if (amount_pts < 3)
return;
GLdouble(*quad)[3];
quad = new GLdouble[amount_pts][3];//
for (int i = 0; i < amount_pts; i++)// GLdouble(*quad)[3]
{
glm::vec3 pt = boundary_pts.at(i);
quad[i][0] = pt.x;
quad[i][1] = pt.y;
quad[i][2] = pt.z;
}
GLfloat curColor[4];
glGetFloatv(GL_CURRENT_COLOR, curColor);
glColor3ub((GLubyte)220, (GLubyte)220, (GLubyte)220);
GLUtesselator* tess = gluNewTess();
if (!tess) return;
gluTessCallback(tess, GLU_TESS_BEGIN, (void (CALLBACK*)())&PolyLine3DBegin);
gluTessCallback(tess, GLU_TESS_VERTEX, (void (CALLBACK*)())&PolyLine3DVertex);
gluTessCallback(tess, GLU_TESS_END, (void (CALLBACK*)())&PolyLine3DEnd);
gluTessBeginPolygon(tess, NULL);
gluTessBeginContour(tess);
for (int i = 0; i< amount_pts; i++)
{// Tess“ ”
gluTessVertex(tess, quad[i], quad[i]);
}
gluTessEndContour(tess);
gluTessEndPolygon(tess);
glColor3f(curColor[0], curColor[1], curColor[2]);
delete[] quad;//
}
効果は次のとおりです.
以前、「Tess」の細分化の原理と詳細な説明について2つの文章を転載しましたが、興味のある方はご覧ください.