①
#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);
}
ポリゴンモデルを表示するプログラムに法線を求める機能を追加し,スムーズシェーディ
ングによりウサギを表示する.各三角形ポリゴンの法線を求めた後に,各頂点における法
線をその頂点を共有する三角形ポリゴンの法線を平均することにより求める。各
頂点の法線を格納する配列(頂点座標を格納する配列と同形式)を用意し,そこに各三角
形ポリゴンの法線を足し込み,最後に正規化する。という問題です。
①のプログラムに②を追加したいのですが、どこに入れればいいのかさっぱり分かりません・・
また、大まかでいいので、ウサギをどうやって作っていけばいいのかも教えていただけたらありがたいです。
宜しくお願いします。
Open GLを使いウサギを作りたい
ページ移動
- 掲示板
- ↳ C言語何でも質問掲示板
- ↳ 四聖龍神録2 掲示板
- ↳ 四聖龍神録Plus掲示板
- ↳ AerobeatPlus掲示板
- 副次コンテンツ
- ↳ 作品お披露目掲示板
- 登録ユーザー用コンテンツ
- ↳ 登録ユーザー掲示板
- コミュニティフォーラム
- ↳ みんなでソースコードをレビューしよう
- ↳ 3DCGソフト使用者のコミュ
- ↳ Win32 API
- ↳ 組み込み系スクリプト言語をつかってみよう
- ↳ 東方好きあつまれ
- ↳ C言語誰でも交流サイト - mixC++ -
- ↳ ビット論理演算が好きな人♪
- ↳ 企画関係について語ろうか
- ↳ エフェクトアニメーション
- ↳ 学生で集まってみる?
- ↳ DirectX SDK
- ↳ マイコン/FPGA電子工作部
- ↳ PHPに可能性を無限大
- ↳ Code Golf を楽しもう!
- ↳ 作曲している人で話し合ってみませんか♪
- ↳ ソフト制作コミュ
- ↳ El Shaddai - エルシャダイ -
- ↳ PSPプログラミング
- ↳ CINEMA 4D
- ↳ お絵かきコミュニティ
- ↳ 素材作ってみたよ!
- ↳ OpenGL
- ↳ OpenCV
- ↳ RPGを作りたい!
- ↳ ポケモン好き集まれ
- ↳ ならば .NETをやらないか?
- ↳ 1から勉強してみないか?
- ↳ 赤髪超大好き♪
- ↳ ノースリーブ
- ↳ 伝説の戦士プリキュアを語ろう
- ↳ コンテストコミュニティー
- ↳ DXライブラリ何でも質問コミュニティ
- ↳ 四聖龍神録コミュニティ
- ↳ HTML/CSS/JavaScript
- ↳ 生放送コミュ
- ↳ サンプルを共有するコミュニティ
- ↳ おすすめマーカー
- ↳ minecraft
- ↳ Xtal Language
- ↳ マインクラフト
- ↳ 数学やらないか?
- ↳ 習ったことをプログラムで表してみよう!
- ↳ 小物アプリ作成や ら な い か
- ↳ AIの可能性は無限大
- ↳ 自作OS製作(GUI入門)[雑談]
- ↳ リレーコーディング
- ↳ Unix/Linux
- ↳ 競技プログラミングごっこやろうぜ
- ↳ 夏休みプログラミングイベント2012 in MixC++
- ↳ D言語を広めよう
- ↳ Scala布教の会
- ↳ 3Dゲーム作ろうぜ!モデリング~プログラミングまで
- ↳ 言語に興味を持ったら是非!!
- ↳ レイヴンズ・ネスト
- ↳ C言語とC++言語のコミュニティー!
- ↳ 放課後ふぁんたじあ
- ↳ マイ サンプルズ
- ↳ ガンヲタの館
- ↳ 歯科機器
- ↳ 歯科機器情報
- ↳ 52歳からはじめるC言語
- mixC++更新・仕様変更履歴