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)
コメントをかく