テッセレーション

テッセレーションです。
面を再分割してくれます。
今回のプログラムはスペースキーを押すとテッセレーションで表示します。

ファイル
main.cpp

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#include <stdio.h>
#include <GL/freeglut/freeglut.h>
#include <vector>
using namespace std;

#define WIDTH 320
#define HEIGHT 240

//頂点情報用
struct vector3d{
 double x;
 double y;
 double z;
}vec3d;
vector <vector3d> vertex;
//テッセレータオブジェクト
GLUtesselator *tess;
//回転用
float anglex = 0.0f;
//白
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
//キーボード
BYTE KeyTbl[256];

void setdata(double x,double y,double z){
 vec3d.x=x;
 vec3d.y=y;
 vec3d.z=z;
 vertex.push_back(vec3d);
}
void display(void)
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glViewport(0, 0, WIDTH, HEIGHT);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();

 gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);
 glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

 gluLookAt(0.0,0.0,800.0,
      0.0,0.0,0.0,
     0.0,1.0,0.0);

 glMaterialfv(GL_FRONT, GL_DIFFUSE, white);

  glColor3f(1,1,1);

 GetKeyboardState(KeyTbl);
 if(KeyTbl[VK_SPACE] & 0x80){
  gluTessBeginPolygon(tess, 0);
   gluTessBeginContour(tess);
   for(int i=0;i<(signed)vertex.size();i++){
    gluTessVertex(tess, &vertex[i].x, &vertex[i]);
   }
   gluTessEndContour(tess);
  gluTessEndPolygon(tess);
 }else{
  glBegin(GL_LINE_LOOP);
  for(int i=0;i<(signed)vertex.size();i++){
   glVertex3dv(&vertex[i].x);
  }
  glEnd();
 }

 glutSwapBuffers();
}
void idle(void)
{
 glutPostRedisplay();
}
void Init(){
 //頂点情報セット
 setdata(50,50,0);
 setdata(200,50,0);
 setdata(150,-50,0);
 setdata(50,-20,0);
 setdata(0,0,0);

 glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
 glEnable(GL_DEPTH_TEST);
 //ワイヤーフレーム
 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  tess = gluNewTess();
 if(tess == NULL){
  printf("テッセレータオブジェクトがありません。");
  exit(1);
 }
 gluTessCallback(tess, GLU_TESS_BEGIN, (void (__stdcall*)(void))glBegin);
 gluTessCallback(tess, GLU_TESS_END, (void (__stdcall*)(void))glEnd);
 gluTessCallback(tess, GLU_TESS_VERTEX, (void (__stdcall*)(void))glVertex3dv);
}
int main(int argc, char *argv[])
{
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(WIDTH, HEIGHT);
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
 glutCreateWindow("テッセレーション");
 glutDisplayFunc(display);
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return 0;
}

 

最終更新:2015年03月14日 13:21
添付ファイル