Open GLを使いウサギを作りたい

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

Open GLを使いウサギを作りたい

#1

投稿記事 by akasatana » 9年前


#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;
}


void normalize(float v[3])
{

GLfloat d = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);

if (d == 0.0){
printf("zero length vector\n");
return;
}

v[0] /= d; v[1] /= d; v[2] /= d;
}

void normcrossprod(float v1[3], float v2[3], float out[3])
{
out[0] = v1[1]*v2[2] - v1[2]*v2[1];
out[1] = v1[2]*v2[0] - v1[0]*v2[2];
out[2] = v1[0]*v2[1] - v1[1]*v2[0];

normalize(out);
}

ポリゴンモデルを表示するプログラムに法線を求める機能を追加し,スムーズシェーディ
ングによりウサギを表示する.各三角形ポリゴンの法線を求めた後に,各頂点における法
線をその頂点を共有する三角形ポリゴンの法線を平均することにより求める。各
頂点の法線を格納する配列(頂点座標を格納する配列と同形式)を用意し,そこに各三角
形ポリゴンの法線を足し込み,最後に正規化する。という問題です。

①のプログラムに②を追加したいのですが、どこに入れればいいのかさっぱり分かりません・・
また、大まかでいいので、ウサギをどうやって作っていけばいいのかも教えていただけたらありがたいです。
宜しくお願いします。

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