ProgrammingのTipなど

xファイルの読み込み2


xファイルを読み込んで
頂点とインデックスだけの表示
xファイルはWings3Dで出力
オブジェクトは1個のみでこのプログラムにはまだ汎用性はないので注意

Linux
g++
C++11用

xLorder.h
#ifndef XLOADER_H
#define XLOADER_H

#include <vector>
#include <stdio.h>
#include <cstring>
#include <string.h>
#include <iostream>

using namespace std;

typedef struct VertexStruct//頂点データ 構造体
{
	float x,y,z,w;
}TVertex;

typedef struct PlateStruct//面データ 構造体
{
	int size;
	int ix1,ix2,ix3,ix4;
}TPlate;

//配列vector
vector<float> v1;//頂点データ格納配列
vector<int> ix1;//インデックスデータ格納配列
//個数データ
int vertexNum = 0;//頂点の総数
int plateNum = 0;//面の総数
int indexNum = 0;//インデックスの総数
	
//フラグ変数
bool meshFlag = false;
bool vertexNumFlag = false;
bool vertexDataFlag = false;
bool plateNumFlag = false;


bool indexDataFlag = false;

void xFileLoad(char* xFileName)
{
	//変数
	FILE *fp;
	//tmp用
	char buf1[256];
	float x,y,z,w;//頂点用tmp
	char str1[256];
	char str2[256];
	int plateSize,ixp1,ixp2,ixp3,ixp4;
	
	int plateOneWithVertexNum = 0;//1つの面の頂点数

	
	
	//ファイル 読み込み
	fp = fopen(xFileName, "r");
	if (fp == NULL) {printf("can't open the file");};
	int tmp_eof = 0;
	
	//mesh の場所まで移動
	while(feof(fp) != true)
	{
		memset(buf1, 0, sizeof(buf1)); 
		fgets(buf1, 256, fp);//一行進める
		tmp_eof = fscanf(fp, "%s %s", &str1, &str2);
		if (strcmp(str1, "Mesh") == 0) 
		{
			printf("mesh OK\n");
			meshFlag = true;
			break;
		};

		if (tmp_eof == EOF) break;
		if (feof(fp)) break;
		
	};
	
	//vertex 頂点の総数 読み込み
	if (meshFlag) 
	{		
		fgets(buf1, 256, fp);//一行進める
		tmp_eof = fscanf(fp, "%d;", &vertexNum);
		printf("vertexNum is %d \n", vertexNum);
		if (vertexNum > 0)  vertexNumFlag = true;
	};
	
	TVertex tmpV1;
	//vertex 頂点 配列 読み込み
	if (vertexNumFlag)
	{
		for (int i=0; i < vertexNum; i++)
		{
			fgets(buf1, 256, fp);
			tmp_eof = fscanf(fp, "%f,%f,%f;", &x,&y,&z);
			v1.push_back(x);
			v1.push_back(y);
			v1.push_back(z);
			if (tmp_eof == EOF) break;
			if (feof(fp)) break;
		}
		if (v1.size() > 0) {vertexDataFlag = true;printf("vertex data readed\n");};
	}
	
	//頂点データ 表示
	if (vertexDataFlag)
    {
		for(auto itr = v1.begin(); itr != v1.end(); ++itr) 
		{
			//cout << *itr << "\n"; 
        }
     }
    
    //インデックスの総数を得る
    if (vertexDataFlag)
    {
		//2行進める
		fgets(buf1, 256, fp);
		fgets(buf1, 256, fp);
		//面の総数 読み込み
		tmp_eof = fscanf(fp, "%d;", &plateNum);
		if (tmp_eof == EOF) printf("eof indexNum");
		printf("plateNum is %d \n", plateNum);
		if (plateNum > 0)  plateNumFlag = true;
    }
    //fgets(buf1, 256, fp);//1行進める
    //インデックス配列データを得る
    if (plateNumFlag)
    {
		for (int i=0; i < plateNum; i++)
		{
			fgets(buf1, 256, fp);//1行進める
			tmp_eof = fscanf(fp, "%d;%d,%d,%d,%d;", &plateSize,&ixp1,&ixp2,&ixp3,&ixp4);
			
			printf("plate size is %d\n", plateSize);
			
			tmp_eof = fscanf(fp, "%d;%d,%d,%d,%d;", &plateSize,&ixp1,&ixp2,&ixp3,&ixp4);
			if (plateSize == 4)
			{
				
				printf("ixp1 is %d\n", ixp1);
				ix1.push_back(ixp1);
				printf("ixp2 is %d\n", ixp2);
				ix1.push_back(ixp2);
				printf("ixp3 is %d\n", ixp3);
				ix1.push_back(ixp3);
				printf("ixp4 is %d\n", ixp4);
				ix1.push_back(ixp4);
			}
			if (plateSize == 3)
			{
				
				ix1.push_back(ixp1);
				ix1.push_back(ixp2);
				ix1.push_back(ixp3);
			}
			
			
			if (tmp_eof == EOF) break;
			if (feof(fp)) break;
		}
	
		indexNum = ix1.size();
		printf("indexNum is %d\n", indexNum);
		if (ix1.size() > 0) {indexDataFlag = true; printf("index data readed\n");};
	}	
	
	//インデックスデータ 表示
	if (indexDataFlag)
    {
		for(auto itr = ix1.begin(); itr != ix1.end(); ++itr) 
		{
			cout << *itr  << "\n"; 
        }
     }
	fclose(fp);
};

#endif


main.cpp

#include <GL/glut.h>   
#include <GL/gl.h>	
#include <GL/glu.h>	
#include "Texture.hpp"
#include "xLoader.h"

float xrot, yrot, zrot;
TTexture *tex1;

void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	glTranslatef(0,0,-15);
	
	glRotatef(xrot,1.0f,0.0f,0.0f);		
        glRotatef(yrot,0.0f,1.0f,0.0f);		
        glRotatef(zrot,0.0f,0.0f,1.0f);	
	
	//glEnable(GL_TEXTURE_2D);
	glEnableClientState(GL_VERTEX_ARRAY);
	//glEnableClientState(GL_TEXTURE_COORD_ARRAY);

	//glEnableClientState( GL_COLOR_ARRAY );
	//glEnableClientState(GL_NORMAL_ARRAY);
	glVertexPointer(3 , GL_FLOAT , 0 , &v1[0]);
	//glTexCoordPointer(2, GL_FLOAT, 0, texCoord);
	//glColorPointer( 3, GL_FLOAT, 0, col );
	//glNormalPointer(GL_FLOAT, 0, normal);
	//glBindTexture(GL_TEXTURE_2D, tex1->ID);

	//glDrawElements(GL_QUADS , 24 , GLint , ix);
	glDrawElements(GL_QUADS , indexNum , GL_UNSIGNED_INT , &ix1[0]);
	
	//glDisableClientState(GL_COLOR_ARRAY);
	//glDisableClientState(GL_NORMAL_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);
	//glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	
	//glDisable(GL_TEXTURE_2D);
	
	xrot+=1.0f;		                	
        yrot+=1.0f;		                
        zrot+=0.0f;
	glutSwapBuffers();
}




void onKeyboard(unsigned char key, int x, int y)
{
	switch (key) {
		case '\033':   
			exit(0);
		default:
			break;
}
}

void onMouse(int button, int state, int x, int y)
{
	switch (button) {
		case GLUT_LEFT_BUTTON:
			break;
		case GLUT_MIDDLE_BUTTON:
			break;
		case GLUT_RIGHT_BUTTON:
			break;
		default:
			break;
	}
}


void onReshape(int width, int height)
{
	if (height==0) height=1;
	if (width==0) width=1;
	glViewport(0,0,width,height);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void timer(int value)
{
	glutPostRedisplay();
	glutTimerFunc(30 , timer , 0);
}

void glInit(void)
{
	glClearColor(0.9, 0.9, 0.9, 1.0);
	glShadeModel(GL_SMOOTH);
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

void glLightingInit()
{
	glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
	glEnable(GL_COLOR_MATERIAL);
	glEnable(GL_LIGHT0);
	glEnable(GL_LIGHTING);
	glEnable(GL_NORMALIZE);
}

void init()
{
	//tex1 = new TTexture("tartan1.bmp");
	xFileLoad("aa1.x");
}

int main(int argc, char **argv) 
{  
	glutInit(&argc, argv);  
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);  
	glutInitWindowSize(750,750);  
 
	int window = glutCreateWindow(argv[0]);
	glutDisplayFunc(display);
	glutReshapeFunc(onReshape);
	glutMouseFunc(onMouse);
	glutKeyboardFunc(onKeyboard);
	glutTimerFunc(50 , timer , 0);
	glInit();
	init();
	//glLightingInit();
	glutMainLoop();  
	delete tex1;
	return 1;
}


aa1.x

xof 0303txt 0064
#Exported from Wings 3D 2.2.9
		Material default {
			0.7898538076923077; 0.8133333333333334; 0.6940444444444445; 1.0;;
		0.19999999999999996;
			0.1689853807692308; 0.17133333333333334; 0.15940444444444446;;
			0.0; 0.0; 0.0;;
		}
Frame Cube1 {
	Mesh {
		24;
		-2.792, -1.0, -1.0;,
		-2.792, -1.0, 2.8346666666666667;,
		-2.792, 1.0, 2.8346666666666667;,
		-2.792, 1.0, -1.0;,
		-2.792, -1.0, -1.0;,
		-2.792, 1.0, -1.0;,
		1.0, 2.640448, -1.0;,
		1.0, -1.0, -1.0;,
		-2.792, -1.0, -1.0;,
		1.0, -1.0, -1.0;,
		1.0, -1.0, 2.8346666666666667;,
		-2.792, -1.0, 2.8346666666666667;,
		-2.792, -1.0, 2.8346666666666667;,
		1.0, -1.0, 2.8346666666666667;,
		1.0, 2.640448, 2.8346666666666667;,
		-2.792, 1.0, 2.8346666666666667;,
		-2.792, 1.0, -1.0;,
		-2.792, 1.0, 2.8346666666666667;,
		1.0, 2.640448, 2.8346666666666667;,
		1.0, 2.640448, -1.0;,
		1.0, -1.0, -1.0;,
		1.0, 2.640448, -1.0;,
		1.0, 2.640448, 2.8346666666666667;,
		1.0, -1.0, 2.8346666666666667;;

		6;
		4;0, 1, 2, 3 ;,
		4;4, 5, 6, 7 ;,
		4;8, 9, 10, 11 ;,
		4;12, 13, 14, 15 ;,
		4;16, 17, 18, 19 ;,
		4;20, 21, 22, 23 ;;

		MeshNormals {
			24;		-0.5773502691896258, -0.5773502691896258, -0.5773502691896258;,
		-0.5773502691896258, -0.5773502691896258, 0.5773502691896258;,
		-0.7172274324611673, 0.47118703093348135, 0.5133883442436653;,
		-0.7172274324611673, 0.47118703093348135, -0.5133883442436653;,
		-0.5773502691896258, -0.5773502691896258, -0.5773502691896258;,
		-0.7172274324611673, 0.47118703093348135, -0.5133883442436653;,
		0.40596648108942296, 0.6179505754227073, -0.6732965933127957;,
		0.5773502691896258, -0.5773502691896258, -0.5773502691896258;,
		-0.5773502691896258, -0.5773502691896258, -0.5773502691896258;,
		0.5773502691896258, -0.5773502691896258, -0.5773502691896258;,
		0.5773502691896258, -0.5773502691896258, 0.5773502691896258;,
		-0.5773502691896258, -0.5773502691896258, 0.5773502691896258;,
		-0.5773502691896258, -0.5773502691896258, 0.5773502691896258;,
		0.5773502691896258, -0.5773502691896258, 0.5773502691896258;,
		0.40596648108942296, 0.6179505754227073, 0.6732965933127957;,
		-0.7172274324611673, 0.47118703093348135, 0.5133883442436653;,
		-0.7172274324611673, 0.47118703093348135, -0.5133883442436653;,
		-0.7172274324611673, 0.47118703093348135, 0.5133883442436653;,
		0.40596648108942296, 0.6179505754227073, 0.6732965933127957;,
		0.40596648108942296, 0.6179505754227073, -0.6732965933127957;,
		0.5773502691896258, -0.5773502691896258, -0.5773502691896258;,
		0.40596648108942296, 0.6179505754227073, -0.6732965933127957;,
		0.40596648108942296, 0.6179505754227073, 0.6732965933127957;,
		0.5773502691896258, -0.5773502691896258, 0.5773502691896258;;
		6;
		4;0, 1, 2, 3 ;,
		4;4, 5, 6, 7 ;,
		4;8, 9, 10, 11 ;,
		4;12, 13, 14, 15 ;,
		4;16, 17, 18, 19 ;,
		4;20, 21, 22, 23 ;;
		}
		MeshMaterialList {
			1;
			6;
			0;
			0;
			0;
			0;
			0;
			0;
			;
			{default}
		}
	}}

makefile
SOURCE = main
EXTENSIONTYPE = cpp
INCLUDE = -I/usr/include/
LIBDIR  = -L/usr/X11R6/lib 
CC = g++
CFLAGS = 
CPPVERSION = -std=c++11
LIBRARIES =  -lglut -lGL -lGLU 
EXENAME = main
OBJ = $(SOURCE).o

all: $(OBJ)
	$(CC) $(CPPVERSION) $(CFLAGS) $(INCLUDE) -o $(EXENAME) $(LIBDIR) $(OBJ) $(LIBRARIES)

$(SOURCE).o: $(SOURCE).$(EXTENSIONTYPE)
	$(CC) $(CPPVERSION) $(CFLAGS) $(INCLUDE) -c $^ $(LIBDIR) $(LIBRARIES)	


clean:
	rm $(OBJ) $(EXENAME) 
	

flymake:
	$(CC) $(CPPVERSION) -pedantic -fsyntax-only $(SOURCE).$(EXTENSIONTYPE)


コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー2

開くメニュー

閉じるメニュー

  • アイテム
  • アイテム
  • アイテム
【メニュー編集】

管理人/副管理人のみ編集できます