open glで、フラットシェーディングを使い、スタンフォードバニーのようなウサギを作りたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
akasatana

open glで、フラットシェーディングを使い、スタンフォードバニーのようなウサギを作りたい

#1

投稿記事 by akasatana » 6年前

以下のプログラムを元にして、まずはフラットシェーディング(スムーズシェーディングは難しいので・・)で、ウサギを表示させたいのですが、どのように作っていったらいいか全く分かりません・・
もしよろしければ形の一部分でもどのようにしたらいいか教えていただけると有り難いです。
宜しくお願いします。

#include <stdlib.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <string.h>
#include <math.h>
#include <assert.h>
#include <stdio.h>
#define KEY_ESC 27

#define MAX_NODES 100000 //頂点数
#define MAX_ELEMENTS 100000 //ポリゴン数

static int NNodes;
static float NodePoint_s[MAX_NODES][3]; //頂点の座標

static int NElements;
static int ElementNodeId_s[MAX_ELEMENTS][3]; //三角形ポリゴンの位相(コネクティビティ)

void polarview( void );
float distance=7.0, twist=0.0, elevation=-45.0, azimuth=30.0;

void initialize(double NodePoint_s);

static void ReadPch (const char *filename)
{
FILE *fp;
int iElement;
int iNode;

fp = fopen(filename, "r");

if (fp == NULL)
{
fprintf (stderr, " file %s not found \n", filename);
exit(1);
}

fscanf (fp, "%d", &NNodes); // 頂点数
assert(NNodes <= MAX_NODES);

for (iNode = 0; iNode < NNodes; iNode++) {
fscanf (fp, "%f %f %f",
&NodePoint_s[iNode][0],
&NodePoint_s[iNode][1],
&NodePoint_s[iNode][2]);
//printf("%f\t%f\t%f\t\n", NodePoint_s[iNode][0],NodePoint_s[iNode][1],NodePoint_s[iNode][2]);
}

fscanf (fp, "%d", &NElements); // ポリゴン数
assert(NElements <= MAX_ELEMENTS);

for (iElement = 0; iElement < NElements; iElement++) {
for (iNode = 0; iNode < 3; iNode++) {
fscanf (fp, "%d", &ElementNodeId_s[iElement][iNode]);
}
}
fclose (fp);
}

void make_model(void)
{
int iElement;
int i,j;
int iNode;
float v0[3], v1[3], v2[3];
glEnable(GL_NORMALIZE);

glScalef(8.0,8.0,8.0);

glBegin (GL_TRIANGLES);

for (iElement = 0; iElement < NElements; iElement++){
for(j = 0; j < 3; j++){
v0[j] = (NodePoint_s[ElementNodeId_s[iElement][0]][j] );
v1[j] = (NodePoint_s[ElementNodeId_s[iElement][1]][j] );
v2[j] = (NodePoint_s[ElementNodeId_s[iElement][2]][j] );
}

glVertex3f(v0[0], v0[1], v0[2]);
glVertex3f(v1[0], v1[1], v1[2]);
glVertex3f(v2[0], v2[1], v2[2]);
}
glDisable(GL_NORMALIZE);
glEnd ();
}

void display(void)
{
glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
polarview();
glEnable( GL_DEPTH_TEST );

make_model();

glDisable( GL_DEPTH_TEST );

glPopMatrix();
glFlush();
}

void myKbd(unsigned char key, int x, int y)
{
switch( key ) {
case KEY_ESC:
exit( 0 );
}
}

void myInit (char *progname)
{
glutInitWindowPosition(0, 0);
glutInitWindowSize( 600, 600);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);
glutCreateWindow(progname);
glClearColor (0.0, 0.0, 0.0, 1.0);
glutKeyboardFunc(myKbd);
}

void myReshape(int width, int height)
{
float aspect = (float) width / (float) height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0, aspect, 1.0, 10.0);
glMatrixMode(GL_MODELVIEW);
}

void polarview( void )
{
glTranslatef( 0.0, 0.0, -distance);
glRotatef( -twist, 0.0, 0.0, 1.0);
glRotatef( -elevation, 1.0, 0.0, 0.0);
glRotatef( -azimuth, 0.0, 1.0, 0.0);
}

int main(int argc, char* argv[])
{
ReadPch("model.pch");
glutInit(&argc, argv);
glutCreateWindow;
myInit(argv[0]);
glutReshapeFunc (myReshape);
glutDisplayFunc(display);
glutMainLoop();

return 0;
}

“C言語何でも質問掲示板” へ戻る