顯示具有 04160063_鐘珈翎 標籤的文章。 顯示所有文章
顯示具有 04160063_鐘珈翎 標籤的文章。 顯示所有文章

2017年6月5日 星期一

Week 16 鐘珈翎的上課筆記



(1)內插公式
(2)存檔、讀檔
(3)利用Timer自動內插
(4)鍵盤+滑鼠




用Excel來做內插公式



利用Timer做自動內插


#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel_head = NULL;
GLMmodel* pmodel_hand1 = NULL;
GLMmodel* pmodel_hand2 = NULL;
GLMmodel* pmodel_face = NULL;

float angle[9]={},dir=1;
float alpha=0.0;
float oldAngle[9]={0,0,0,0,0,0,0,0,0};
float newAngle[9]={40,40,-40,-40,0,0,0,0,0};
void interpolation()
{
    for(int i=0;i<9;i++)
    {
        angle[i]=alpha*newAngle[i]+(1-alpha)*oldAngle[i];
    }
    alpha+=0.1;
}

//float angle[20]={0};
int now=0;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        if (!pmodel_head)
        {                                  //head
            pmodel_head = glmReadOBJ("data/bodyfoot.obj");
            if (!pmodel_head) exit(0);
            glmUnitize(pmodel_head);
            glmFacetNormals(pmodel_head);
            glmVertexNormals(pmodel_head, 90.0);
        }

        if (!pmodel_hand1)
        {                                   //hand
            pmodel_hand1 = glmReadOBJ("data/righthand.obj");
            if (!pmodel_hand1) exit(0);
            glmUnitize(pmodel_hand1);
            glmFacetNormals(pmodel_hand1);
            glmVertexNormals(pmodel_hand1, 90.0);
        }

        if (!pmodel_hand2)
        {                                     //hand
            pmodel_hand2 = glmReadOBJ("data/lefthand.obj");
            if (!pmodel_hand2) exit(0);
            glmUnitize(pmodel_hand2);
            glmFacetNormals(pmodel_hand2);
            glmVertexNormals(pmodel_hand2, 90.0);
        }

        if (!pmodel_face)
        {                                     //hand
            pmodel_face = glmReadOBJ("data/face.obj");
            if (!pmodel_face) exit(0);
            glmUnitize(pmodel_face);
            glmFacetNormals(pmodel_face);
            glmVertexNormals(pmodel_face, 90.0);
        }


//////////////////////////////////////////////////////////////////////
    glPushMatrix();
       // glRotatef(angle, 0,1,0);


         glPushMatrix();
            glTranslatef(0,0,0);
            glScalef(1,1,1);
            glmDraw(pmodel_head, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();

        glPushMatrix();
            glTranslatef(0,0.8,-0.08);
             glRotatef(0, 0,1,0);
            glScalef(1.8,1.8,1.8);
            glmDraw(pmodel_face, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();


//////////////////////
        glPushMatrix();
            glTranslatef(0.3,0.4,0);  //掛到身體
            glRotatef(-angle[0], 0,0,1);  //開始旋轉
            glTranslatef(0.1,-0.6,0);   //找中心點
            glScalef(1,1,1);
            glmDraw(pmodel_hand2, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();



        glPushMatrix();
            glTranslatef(-0.3, 0.4, 0);  //掛到身體
            glRotatef(angle[1], 0,0,1);  //開始旋轉
            glTranslatef(-0.1,-0.6,0);   //找中心點
            glScalef(1,1,1);
            glmDraw(pmodel_hand1, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();




    glPopMatrix();
    glutSwapBuffers();
}
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
/*
#include <stdio.h>
void timer(int t)///計時器叫的時候, 要做什麼呢?
{
    glutTimerFunc(10, timer, t+1);///先撥下一個鬧鐘
    angle++;///做了要做的事

    glutPostRedisplay();///提醒電腦,有空要畫一下畫面哦

}///再度沈睡
*/
#include <mmsystem.h>
void keyboard(unsigned char key,int x,int y)
{
    if(key=='0')now=0;
    if(key=='1')now=1;
    if(key=='2')now=2;
}

int oldX=0,oldY=0;
void mouse (int button,int state,int x, int y)
{
    oldX=x;
    oldY=y;
    glutPostRedisplay();
}
void motion(int x, int y)
{
    angle[now]+=(x-oldX);
    oldX=x;
    glutPostRedisplay();
}

void timer (int t)
{
    glutTimerFunc(100,timer,t+1);
    interpolation();
    glutPostRedisplay();
}

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
    glutInitWindowSize(500,500);
    glutCreateWindow("04160063");

    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutTimerFunc(0,timer,0);

    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);

    glutDisplayFunc(display);
 //   glutIdleFunc(display);
  //  glutTimerFunc(0, timer, 0);///(1) 第一次呼叫timer計時器
    glutMouseFunc(mouse);
    glutKeyboardFunc(keyboard);
    glutMotionFunc(motion);
    glClearColor(1,1,1,1);
    //glEnable(GL_CULL_FACE);
    //glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();
}



ToDo:讀檔、寫檔
#include <stdio.h>
FILE*fout==NULLfout=fopen("file.txt","w+");
if(key=='s'||key=='S')
{
    fprintf(fout,"%.3f %.3f %.3f %.3f %.3f\n",angle[0]);
}




2017年5月22日 星期一

Week14 鐘珈翎的課堂筆記

(1)上週回家作業
(2)動起來

#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel_head = NULL;
GLMmodel* pmodel_hand1 = NULL;
GLMmodel* pmodel_hand2 = NULL;
GLMmodel* pmodel_body = NULL;
GLMmodel* pmodel_foot1 = NULL;
GLMmodel* pmodel_foot2 = NULL;
GLMmodel* pmodel_hat = NULL;

float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        if (!pmodel_body) {                                         //body
        pmodel_body = glmReadOBJ("data/body.obj");
        if (!pmodel_body) exit(0);
        glmUnitize(pmodel_body);
        glmFacetNormals(pmodel_body);
        glmVertexNormals(pmodel_body, 90.0);
        }

        if (!pmodel_head) {                                  //head
        pmodel_head = glmReadOBJ("data/head.obj");
        if (!pmodel_head) exit(0);
        glmUnitize(pmodel_head);
        glmFacetNormals(pmodel_head);
        glmVertexNormals(pmodel_head, 90.0);
        }

        if (!pmodel_hand1) {                                   //hand
        pmodel_hand1 = glmReadOBJ("data/hand1.obj");
        if (!pmodel_hand1) exit(0);
        glmUnitize(pmodel_hand1);
        glmFacetNormals(pmodel_hand1);
        glmVertexNormals(pmodel_hand1, 90.0);
        }

        if (!pmodel_hand2) {                                     //hand
        pmodel_hand2 = glmReadOBJ("data/hand2.obj");
        if (!pmodel_hand2) exit(0);
        glmUnitize(pmodel_hand2);
        glmFacetNormals(pmodel_hand2);
        glmVertexNormals(pmodel_hand2, 90.0);
        }



        if (!pmodel_foot1) {
        pmodel_foot1 = glmReadOBJ("data/foot1.obj");
        if (!pmodel_foot1) exit(0);
        glmUnitize(pmodel_foot1);
        glmFacetNormals(pmodel_foot1);
        glmVertexNormals(pmodel_foot1, 90.0);
        }

        if (!pmodel_foot2) {
        pmodel_foot2 = glmReadOBJ("data/foot2.obj");
        if (!pmodel_foot2) exit(0);
        glmUnitize(pmodel_foot2);
        glmFacetNormals(pmodel_foot2);
        glmVertexNormals(pmodel_foot2, 90.0);
        }

        if (!pmodel_hat) {
        pmodel_hat = glmReadOBJ("data/hat.obj");
        if (!pmodel_foot2) exit(0);
        glmUnitize(pmodel_hat);
        glmFacetNormals(pmodel_hat);
        glmVertexNormals(pmodel_hat, 90.0);
        }

//////////////////////////////////////////////////////////////////////
    glPushMatrix();
        glRotatef(angle, 0,1,0);
        angle++;
        glPushMatrix();
            glTranslatef(0,-0.1,0);
            glScalef(0.5,0.5,0.4);
            glmDraw(pmodel_body, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();

        glPushMatrix();
            glTranslatef(0,0.45,0);
            glScalef(0.8,0.8,0.8);
            glmDraw(pmodel_head, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();

        glPushMatrix();
            glTranslatef(-0.4,0,0);
            glScalef(0.4,0.4,0.4);
            glmDraw(pmodel_hand1, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();

         glPushMatrix();
            glTranslatef(0.4,0,0);
            glScalef(0.4,0.4,0.4);
            glmDraw(pmodel_hand2, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();

         glPushMatrix();
            glTranslatef(0.1,-0.5,0);
            glScalef(0.2,0.4,0.4);
            glmDraw(pmodel_foot1, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();

         glPushMatrix();
            glTranslatef(-0.1,-0.5,0);
            glScalef(0.2,0.4,0.4);
            glmDraw(pmodel_foot2, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();

         glPushMatrix();
            glTranslatef(0,0.8,0);
            glScalef(0.9,0.9,0.9);
            glmDraw(pmodel_hat, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();



    glPopMatrix();
    glutSwapBuffers();
}
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

#include <stdio.h>
void timer(int t)///計時器叫的時候, 要做什麼呢?
{
    glutTimerFunc(100, timer, t+1);///先撥下一個鬧鐘
    angle++;///做了要做的事
    printf("現在時間是 %d, 我起床了, 等一下鬧鐘會再叫一下哦  ", t);
    glutPostRedisplay();///提醒電腦,有空要畫一下畫面哦
    printf("... 然後我就又睡了....\n");
}///再度沈睡


int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
    glutCreateWindow("Yes, 3D Model Here");

    glutDisplayFunc(display);
    glutIdleFunc(display);

    glClearColor(1,1,1,1);
    //glEnable(GL_CULL_FACE);
    //glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();
}































#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel_head = NULL;
GLMmodel* pmodel_hand1 = NULL;
GLMmodel* pmodel_hand2 = NULL;
GLMmodel* pmodel_body = NULL;
GLMmodel* pmodel_foot1 = NULL;
GLMmodel* pmodel_foot2 = NULL;
GLMmodel* pmodel_hat = NULL;

float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        if (!pmodel_body)
        {                                         //body
            pmodel_body = glmReadOBJ("data/body.obj");
            if (!pmodel_body) exit(0);
            glmUnitize(pmodel_body);
            glmFacetNormals(pmodel_body);
            glmVertexNormals(pmodel_body, 90.0);
        }

        if (!pmodel_head)
        {                                  //head
            pmodel_head = glmReadOBJ("data/head.obj");
            if (!pmodel_head) exit(0);
            glmUnitize(pmodel_head);
            glmFacetNormals(pmodel_head);
            glmVertexNormals(pmodel_head, 90.0);
        }

        if (!pmodel_hand1)
        {                                   //hand
            pmodel_hand1 = glmReadOBJ("data/hand1.obj");
            if (!pmodel_hand1) exit(0);
            glmUnitize(pmodel_hand1);
            glmFacetNormals(pmodel_hand1);
            glmVertexNormals(pmodel_hand1, 90.0);
        }

        if (!pmodel_hand2)
        {                                     //hand
            pmodel_hand2 = glmReadOBJ("data/hand2.obj");
            if (!pmodel_hand2) exit(0);
            glmUnitize(pmodel_hand2);
            glmFacetNormals(pmodel_hand2);
            glmVertexNormals(pmodel_hand2, 90.0);
        }



        if (!pmodel_foot1)
        {
            pmodel_foot1 = glmReadOBJ("data/foot1.obj");
            if (!pmodel_foot1) exit(0);
            glmUnitize(pmodel_foot1);
            glmFacetNormals(pmodel_foot1);
            glmVertexNormals(pmodel_foot1, 90.0);
        }

        if (!pmodel_foot2)
        {
            pmodel_foot2 = glmReadOBJ("data/foot2.obj");
            if (!pmodel_foot2) exit(0);
            glmUnitize(pmodel_foot2);
            glmFacetNormals(pmodel_foot2);
            glmVertexNormals(pmodel_foot2, 90.0);
        }

        if (!pmodel_hat)
        {
            pmodel_hat = glmReadOBJ("data/hat.obj");
            if (!pmodel_foot2) exit(0);
            glmUnitize(pmodel_hat);
            glmFacetNormals(pmodel_hat);
            glmVertexNormals(pmodel_hat, 90.0);
        }

//////////////////////////////////////////////////////////////////////
    glPushMatrix();
       // glRotatef(angle, 0,1,0);


         glPushMatrix();
            glTranslatef(0,0.45,0);
            glScalef(0.8,0.8,0.8);
            glmDraw(pmodel_head, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();

        glPushMatrix();
            glTranslatef(0,-0.1,0);
            glScalef(0.5,0.5,0.4);
          glmDraw(pmodel_body, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();


        glPushMatrix();
            glTranslatef(0.4,0,0);
            glScalef(0.4,0.4,0.4);
            glmDraw(pmodel_hand2, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();

         glPushMatrix();
            glTranslatef(0.1,-0.5,0);
            glScalef(0.2,0.4,0.4);
            glmDraw(pmodel_foot1, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();

         glPushMatrix();
            glTranslatef(-0.1,-0.5,0);
            glScalef(0.2,0.4,0.4);
            glmDraw(pmodel_foot2, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();

         glPushMatrix();
            glTranslatef(0,0.8,0);
            glScalef(0.9,0.9,0.9);
            glmDraw(pmodel_hat, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();



//////////////////////

        glTranslatef(-0.2, 0, 0.5);  //掛到身體
        glRotatef(angle, 0,0,1);  //開始旋轉
        glTranslatef(0.3, -0, 0);   //找中心點

        glPushMatrix();
            glTranslatef(-0.1,0,0);  //
            glRotatef(0,0,1,0);    //旋轉
            glTranslatef(-0.4,0,0);  //一開始手臂的位置
            glScalef(0.4,0.4,0.4);
            glmDraw(pmodel_hand1, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();




    glPopMatrix();
    glutSwapBuffers();
}
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

#include <stdio.h>
void timer(int t)///計時器叫的時候, 要做什麼呢?
{
    glutTimerFunc(10, timer, t+1);///先撥下一個鬧鐘
    angle++;///做了要做的事

    glutPostRedisplay();///提醒電腦,有空要畫一下畫面哦

}///再度沈睡


int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
    glutCreateWindow("Yes, 3D Model Here");

    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutTimerFunc(0, timer, 0);///(1) 第一次呼叫timer計時器

    glClearColor(1,1,1,1);
    //glEnable(GL_CULL_FACE);
    //glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();
}

2017年5月15日 星期一

Week 13 鐘珈翎的上課筆記

(1)小考TRT觀念
(2)上週範例
(3)讀圖檔
(4)設定貼圖
(5)轉動的地球
(6)回家作業:機器人



小考TRT觀念

glPushMatrix();


glTranslatef(0.4,0.5,0);
glRotatef(angle,0,0,1);
glTranslatef(0.5,0.3,0);

drawArm();
glPopMatrix();

讀圖檔

















































轉動的地球

#include <opencv/highgui.h> ///for cvLoadImage()
#include <opencv/cv.h> ///for cvCvtColor()
#include <GL/glut.h> ///3D glut
#include <stdio.h>
GLUquadric * quad;
GLuint id;
float angle=0;
void display()
{   glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
    glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///自動轉很帥
        glRotatef(90, 1,0,0);
        glRotatef(angle, 0,0,1);///自動轉很帥
        gluQuadricTexture(quad, 1);
        gluSphere(quad, 1, 30, 30);///glutSolidTeapot(0.3);
    glPopMatrix();///自動轉很帥
    glFlush();
}
void timer(int t)
{   glutTimerFunc(20, timer, 0);/// 1000 msec   50fps:20msec
    angle+=1;///自動轉很帥
    glutPostRedisplay();
}
int myTexture(char *filename)
{
    IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    glGenTextures(1, &id); /// 產生Generate 貼圖ID
    glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}

void myInit()
{   quad = gluNewQuadric();
    id = myTexture("image.jpg");
}
int main(int argc, char**argv)
{   glutInit(&argc, argv);
    glutCreateWindow("3D");
    glutDisplayFunc(display); ///顯示
    glutTimerFunc(0, timer, 0);
    myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
    glutMainLoop();
}








2017年5月8日 星期一

Week 12鐘珈翎的上課筆記

上課主要內容
(1)3D TRT轉動
(2)矩陣、投影矩陣
(3)攝影機運鏡
(4)會動的機器人

首先,至jsyeh.org/3dcg10下載
data.zip->桌面\windows\data\模型.obj
windows.zip->桌面\windows\projection.exe
gult32.dll->桌面\windows\gult32.dll





加上camera的話,畫面的圖片將更加明亮。

gluLookAt(eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ);






#include <GL/glut.h>
#include <math.h>
float eyeX=0.1,eyeY=-0.9,eyeZ=0;
float centerX=0,centerY=0,centerZ=0;
float upX=0,upY=1,upZ=0;
float angle=0;
static void display(void)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
//  gluPerspective(60,1,0.001,10000);
    glMatrixMode(GL_MODELVIEW);

    angle+=0.01;
    eyeX=cos(angle);eyeY=sin(angle);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0);
    glPushMatrix();
        gluLookAt(eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ);

        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    //glutReshapeFunc(resize);
    glutDisplayFunc(display);
    //glutKeyboardFunc(key);
    //glutIdleFunc(idle);
    glutIdleFunc(display);

    glClearColor(1,1,1,1);
    //glEnable(GL_CULL_FACE);
    //glCullFace(GL_BACK);


    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();

    return EXIT_SUCCESS;
}

























#include <GL/glut.h>
#include <math.h>
float eyeX=0.1,eyeY=-0.9,eyeZ=0;
float centerX=0,centerY=0,centerZ=0;
float upX=0,upY=1,upZ=0;
float angle=0;
static void display(void)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,1,0.001,10000);
    glMatrixMode(GL_MODELVIEW);

    angle+=0.01;
    eyeX=cos(angle);eyeY=sin(angle);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0);
    glPushMatrix();
        gluLookAt(eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ);

        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}



若沒有黃色那行,茶壺將會破碎不完整。


2017年5月1日 星期一

Week11 鐘珈翎的上課筆記

這週上課內容

(1)組出機器人
(2)做出可轉動的關節
(3)錄製動作
(4)回家作業

先google:3D explorationo1.18版本 並下載其檔案
再至jsyeh.org/3dcg10下載data.zip(有3D模型可用)
開啟3D exploration後在開啟data內的模型(soccerball)


再另存新檔save as 出現框框後更改Sample APP


接著開啟CodeBlock->File->New project->OpenGL project
將原本的main.c刪掉
加入exploration內的soccerball.cpp
接著在專案那點選add File
將錯誤地方的程式碼註解掉執行後如下圖。






















收到檔案

(1)myGLMsample.zip
(2)data.zip
(3)source.zip{glm.c
                       glm.h
                       transformation
(4)freeglut.zip


利用exporation內的Dolphins模組
將其分開存檔






















將這三個Dolphins放入data內資料夾

#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel = NULL;
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        angle++;
        glRotated(angle,0,1,0);
        if(!pmodel){
            pmodel=glmReadOBJ("data/dolphins2.obj");
            if(!pmodel)exit(0);
            glmUnitize(pmodel);
            glmFacetNormals(pmodel);
            glmVertexNormals(pmodel,90.0);
        }
        glmDraw(pmodel,GLM_SMOOTH|GLM_MATERIAL);
        glPopMatrix();
    glutSwapBuffers();
}
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
    glutCreateWindow("Yes, 3D Model Here");

    glutDisplayFunc(display);
    glutIdleFunc(display);

    glClearColor(1,1,1,1);
    //glEnable(GL_CULL_FACE);
    //glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();
}














2017年4月24日 星期一

Week10 鐘珈翎的上課筆記

電腦圖學Week10上課內容

一、貼圖
二、聲音
三、小遊戲


Google:NeHe Lesson32
下載Lesson32最下面
Visual C++範例
解壓縮至桌面\Lesson32\lesson32.exe


試玩畫面。


在Leeson32中用PlaySound
模仿:File-New-Project.GULT
加入#include <mmsystem.h> //此為多媒體系統
        void mouse(int button,int state,int x,int y)
        {PlaySound("C:\\user\\user\\Desktop\\lesson32/Data/shot.wav",NULL,SND_ASYNC);}
       
        glutMouseFunc(mouse);

將CodeBlock打開glut檔案更改程式如下


可自行下載網路上音源,將MP3檔案轉換成WAV副檔名
如下方程式所見。

當點下滑鼠鍵可聽見聲音。




MP3音樂檔寫入程式。
小鋼琴加入KeyBoard
glutKeyboardFunc(keyboard);

















2017年4月17日 星期一

Week09 鐘珈翎的上課筆記

上課主題


一、期中考試


glPushMatrix();//備份矩陣
glTranslatef(x,y,z)//移動
glRotatef(angle,x,y,z)//旋轉
glScalef(x,y,z)//縮放
glBegin(GL_POLYGON);//開始畫
glTexCoord2f(tx,ty);//貼圖的座標
glNormal3f(nx,ny,nz)//打光的法向量
glColor3f(r,g,b);//顏色
glVertex3f(x,y,z);//頂點
glEnd();//結束畫
glPopMatrix();//還原矩陣

二、T-R-T觀念測驗

http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/ 下載資料夾

windows.zip->桌面\windows\Transformation.exe
data.zip->桌面\windows\data\soccerball.obj *7組
glut32.dll->桌面\windows\glut32.dll

(1)切換模形
(2)開啟soccerball.obj(使用notepad++按右鍵)
     {V開頭(Vertex),VN開頭(Vertex Normal),VT開頭(Vertex Texture Coordinate),F開頭(face)




三、製作匯出3D.obj檔


Google:obj mlt youtube可找到Maya匯出OBJ的方法
解開老師給的檔案myGLMsample.zip解開
freeglut.zip->桌面\freeglut\include\lib\bin






2017年4月10日 星期一

Week08 鐘珈翎的筆記

今天上課內容

(1)期中考模擬考
(2)T-R-T轉動
(3)打光
(4)機器人
(5)回家作業



glRotatef(x,y,z);//旋轉
glTranglPushMatrix();//備份矩陣
glScalef(x,y,z);//縮放
slatef(x,y,z);//移動
glBegin(GL_PLOYGON);//開始畫
glNormal3f(nx,ny,nz);//打光的法向量
glTexCoord2f(tx,ty);//貼圖的座標
glVertex3f(x,y,z);//頂點
glColor3f(r,g,b);//顏色
glEnd();//結束畫
glPopMatrix();//還原矩陣



#include <GL/glut.h>
float angle=0;
static void display(void)
{
    angle++;
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle,0,1,0);
        glTranslatef(0,0.6,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glPushMatrix();

        glutSolidTeapot(0.3);
    glPopMatrix();

    glutSwapBuffers();
}
增加並更改Rotate的數值

const GLfloat light_position[] = { 2.0f, -5.0f, -5.0f, 0.0f };
將數值加上負號(打光)



機器人的元件
可以是圓形、正方形、錐形




2017年3月27日 星期一

Week06鐘珈翎的上課筆記

期中考題複習 // 新課程



介紹旋轉數值與旋轉角度


至jsyeh.org/3dcg10
data.zip->桌面\windows\data\3D模型
windows.zip->桌面\windows\transformation.exe
glut32.dll->桌面\windows\glut32.dll

開啟transformation.exe試不同轉動軸
glRotatef(angel,x,y,z)
第一個參數為轉動角度,
用安培右手定則(大拇指指著轉動軸),其餘四指為轉動方向。
若是旋轉度數為負,可想成為負負得正。

glTranslatef為移動整台車,改變x軸,看起來是旋轉,事實上是移動視角。








2017年3月20日 星期一

Week04鐘珈翎的筆記


繼續上禮拜的作業延伸
開啟CodeBlock使用Glut project

(1)一般顯示茶壺的程式



這禮拜上課主要內容
1.旋轉
2.移動
3.縮放


(2)可拖曳的茶壺程式

void motion(int x,int y)
{
    mouseX=(x-150)/150.0;
    mouseY=-(y-150)/150.0;
    glutPostRedisplay();
}



(3)可縮放茶壺程式

 glScaled(mouseX,mouseY,0);




小精靈的縮放程式碼

2017年3月13日 星期一

Week03 鐘珈翎的筆記

複習上禮拜的課堂內容
打開codeblock點選GL專案
將下載後的GL檔案放置桌面
路徑改為GL檔案的存在地

將原本的程式碼改為下圖

接著我們要做 Mouse互動
將原本的程式改成下圖
點按茶壺圖片,可獲得茶壺的座標位置。
加入兩行程式碼
一個是根據坐標位置改變顏色
一個則是 請重新點選坐標
這樣就可以一直點選圖片換色
再將程式碼做些改寫
滑鼠拖曳 即可改變顏色
上圖是點選才能改變顏色
可以利用三維程式
來畫圖 在綜合以上程式手法改變顏色

利用程式 來畫圓
用for迴圈改角度
透過更改數值
可以改變圓的形狀大小




2017年3月6日 星期一

Week02 鐘珈翎的筆記

重複上次的的課堂作業,
(1)File->New->Project選取OpenGL專案

(2)File->New->Project選取GLUT專案(先至Facebook下載freeglut)

接著用(2)的檔案程式刪減 留下我們需要的十行程式碼。

在打入glutSolidTeapot(0.3);
後面括號內的數字表示茶壺大小。
接著執行後如下圖。
(4)改顏色
(5)先至http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/下載檔案data和window
(6)將檔案移置資料夾內後,有個名叫Shape的檔名開啟,參考內部程式輸入至CodeBlock。