Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <math.h>
- #include <stdio.h>
- #include <stdlib.h>//glut.hより先にインクルード
- #include <gl/glew.h>//glut.hより先にインクルード
- #include <gl/glut.h>
- #define M_PI 3.141592
- static
- int angle=0;
- float tx=0.0;
- float ty=0.0;
- float tz=0.0;
- float sx=1.0;
- float sy=1.0;
- float sz=1.0;
- double tx_p,ty_p,tz_p;
- double sx_p,sy_p,sz_p;
- //------- 頂点データ-----------//
- //「6」面、「4」頂点、1頂点はx,y,zの「3」要素
- GLfloat vertexAry[3][3] =
- {
- {0.0f,0.6f,0.0f},{-0.6f,0.0f,0.0f},
- {0.6f,0.0f,0.0f}
- };
- //法線データ
- GLfloat normalAry[3][3] =
- {
- {0.0f,0.6f,0.0f},{-0.6f,0.0f,0.0f},
- {0.6f,0.0f,0.0f}
- };
- //色データ
- GLfloat colorAry[3][3] =
- {
- {0.0f,0.6f,0.0f},{-0.6f,0.0f,0.0f},
- {0.6f,0.0f,0.0f}
- };
- //インデックス
- GLint indexAry[]=
- {
- 0,1,2
- };
- // π/180の値
- const float PI_OVER_180 = 0.0174532925f;
- //VBO用ID
- GLuint VboId[3];//3つ分
- GLuint VboIndex;//インデックス
- //描画関数
- void drawAry(void)
- {
- GLfloat *clientPtr;//クライアント側用
- GLfloat tmp[3];
- int idloop;
- int loop;
- static float angle = 2*PI_OVER_180;
- //データの場所を知らせる
- //座標
- glBindBuffer(GL_ARRAY_BUFFER,VboId[0]);
- glVertexPointer(3, GL_FLOAT, 0, 0);
- //法線
- glBindBuffer(GL_ARRAY_BUFFER,VboId[1]);
- glNormalPointer(GL_FLOAT, 0, 0);
- //色
- glBindBuffer(GL_ARRAY_BUFFER,VboId[2]);
- glColorPointer(3,GL_FLOAT, 0, 0);
- //インデックスもバインド
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VboIndex);
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_NORMAL_ARRAY);
- glEnableClientState(GL_COLOR_ARRAY);
- //描画
- glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_INT,0);
- glDisableClientState(GL_COLOR_ARRAY);
- glDisableClientState(GL_NORMAL_ARRAY);
- glDisableClientState(GL_VERTEX_ARRAY);
- //座標と法線を回転させる
- //for(idloop = 0; idloop < 2;++idloop)
- {
- //idloop番目のバッファオブジェクトに注目
- //glBindBuffer(GL_ARRAY_BUFFER,VboId[idloop]);
- //対応付け
- clientPtr = (GLfloat *)glMapBuffer(GL_ARRAY_BUFFER,GL_READ_WRITE);
- if(clientPtr != NULL)
- {
- //24頂点*3座標
- for(loop = 0; loop < 3*3;loop += 3) {
- //読み出し(READ)
- tmp[0] = clientPtr[loop];
- tmp[1] = clientPtr[loop+1];
- tmp[2] = clientPtr[loop+2];
- //書き込み(WRITE)
- clientPtr[loop] = cos(angle)*tmp[0]
- + sin(angle)*tmp[2];
- clientPtr[loop+1] = tmp[1];
- clientPtr[loop+2] = -sin(angle)*tmp[0]
- + cos(angle)*tmp[2];
- }
- glUnmapBuffer(GL_ARRAY_BUFFER);//対応付けの解放
- }
- }
- //クライアント側に戻す
- glBindBuffer(GL_ARRAY_BUFFER,0);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- }
- //------- 各種コールバック----------//
- void display(void)
- {
- static int angle = 0;
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
- glPushMatrix();
- glRotatef(angle,1.0,0.0,0.0);//x軸回転
- glRotatef(angle,0.0,1.0,0.0);
- glRotatef(angle,0.0,0.0,1.0);
- glTranslatef(tx,ty,tz);
- glTranslatef(-tx,-ty,-tz);
- glScalef(sx, sy, sz);
- drawAry();
- glPopMatrix();
- glutSwapBuffers();
- if(++angle >= 360) angle = 0;
- }
- void reshape(int w, int h)
- {
- glViewport(0,0,w,h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(30.0, double(w)/h, 0.1, 200.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- /*void idle(void)
- {
- glutPostRedisplay();
- }
- */
- //------ その他初期設定-------//
- void otherInit(void)
- {
- glClearColor(1.f, 1.f, 1.f, 1.f);
- glEnable(GL_DEPTH_TEST);
- glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
- glEnable(GL_COLOR_MATERIAL);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHTING);
- glEnable(GL_NORMALIZE);//法線の正規化
- }
- //---- VBOの作成----//
- void buildVBO(void)
- {
- glGenBuffers(3,&VboId[0]);//座標、法線、色の3つ
- //頂点
- glBindBuffer(GL_ARRAY_BUFFER,VboId[0]);
- glBufferData(GL_ARRAY_BUFFER,sizeof(vertexAry),
- vertexAry,GL_DYNAMIC_DRAW);//データ変更する
- //法線
- glBindBuffer(GL_ARRAY_BUFFER,VboId[1]);
- glBufferData(GL_ARRAY_BUFFER,sizeof(normalAry),
- normalAry,GL_DYNAMIC_DRAW);//データ変更あり
- //色
- glBindBuffer(GL_ARRAY_BUFFER,VboId[2]);
- glBufferData(GL_ARRAY_BUFFER,sizeof(colorAry),
- colorAry,GL_STREAM_DRAW);//データ変更なし
- //インデックス
- glGenBuffers(1,&VboIndex);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,VboIndex);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indexAry),
- indexAry,GL_STATIC_DRAW);//データ変更なし
- }
- static void
- idle()
- {
- angle=(angle+1)%360;
- //tx=fmodf(tx+0.01,10);
- //ty=fmodf(ty+0.01,10);
- //tz=fmodf(tz+0.01,10);
- //sx=fmodf(sx+0.01,10);
- //sy=fmodf(sy+0.01,10);
- //sz=fmodf(sz+0.01,10);
- tx_p=(tx_p+0.5)*M_PI;
- tx=(float)sin(tx_p);
- printf("%f\n",tx);
- ty_p=(ty_p+0.5)*M_PI;
- ty=(float)sin(ty_p);
- printf("%f\n",ty);
- tz_p=(tz_p+0.5)*M_PI;
- tz=(float)sin(tz_p);
- printf("%f\n",tz);
- sx_p=(sx_p+0.1)*M_PI;
- sx=(float)sin(sx_p);
- printf("%f\n",sx);
- sy_p=(sy_p+0.1)*M_PI;
- sy=(float)sin(sy_p);
- printf("%f\n",sy);
- sz_p=(sz_p+0.1)*M_PI;
- sz=(float)sin(sz_p);
- printf("%f\n",sz);
- glutPostRedisplay();
- }
- //----------- メイン関数------------//
- int main(int argc, char *argv[])
- {
- //GLUTの初期設定
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
- glutInitWindowSize(640,480);
- glutCreateWindow("VBO Sample");
- //GLEWの初期設定
- GLenum err = glewInit();
- if(err != GLEW_OK)
- {
- fprintf(stderr,"Err:%s\n",
- glewGetErrorString(err));
- return -1;
- }
- //拡張チェック
- if(!glewIsExtensionSupported(
- "GL_ARB_vertex_buffer_object")){
- puts("you Can't use VBO");
- return -1;
- }
- //コールバック
- glutDisplayFunc(display);
- glutReshapeFunc(reshape);
- glutIdleFunc(idle);
- otherInit();
- buildVBO();//VBOの作成
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement