顯示具有 40447025S_蒲立年 標籤的文章。 顯示所有文章
顯示具有 40447025S_蒲立年 標籤的文章。 顯示所有文章

2018年1月12日 星期五

蒲立年的學習筆記 Week 18

期末作品展示

空白鍵-叫出指令視窗&關閉指令視窗 滑鼠任意鍵點選視窗-可設成對應視窗的桌布 按住滑鼠拖曳-可依照原本自動滑動的軌跡,規律地旋轉視窗 鍵盤Z-可放大瀏覽指定視窗 鍵盤X-可全螢幕瀏覽指定視窗 鍵盤A-恢復成預設桌布

2017年12月21日 星期四

蒲立年的學習筆記 Week 14

一、Rasterization(光柵化)

>3D的圖投影在2D的方格空間上,有好像柵欄一樣,最後予以著色

程式碼範例1:

size(600,600,P3D);
background(255);
//glBegin(GL_POLYGON);
beginShape(TRIANGLE);
  //glColor3f(r,g,b);
  //glVertex3f(x,y,z);
  stroke(255,0,0);vertex(300,100);
  stroke(255,255,0);vertex(500,500);
  stroke(0,0,255);vertex(100,500);
//glEnd();

endShape();


程式碼範例2:

size(600,600,P3D);
background(255);
beginShape(TRIANGLE);
fill(255,0,0);
vertex(300,100);
fill(255,255,0);
vertex(500,500);
fill(0,0,255);
vertex(100,500);
endShape();
//stroke改成fill來填滿顏色 


程式碼範例3:

void setup(){
  size(600, 600, P3D);
}
void draw(){
 background(255);
 //first triangle
 beginShape(TRIANGLE);
  fill(255,0,0); vertex(100,100,0);
  fill(255,0,255); vertex(100,500,100);
  fill(255,255,0); vertex(500,500,0);
 endShape();
 //second triangle
 beginShape(TRIANGLE);
  fill(0,255,0); vertex(500,100,0);
  fill(0,255,255); vertex(500,500,100);
  fill(255,255,0); vertex(100,500,0);
 endShape();
}
//畫出重疊三角形


2017年12月20日 星期三

蒲立年的學習筆記 Week 12

一、範例黨執行
下載myGL_Frustum211_MultiView
(1)跑執行檔 .exe

(2)程式.cpp編譯

把老師給的範例程式.cpp貼到新的openGL專案

在main的地方程式碼補上如下:

int main(int argc,char *argv[])
{
    glutInit(&argc,argv);


就可執行執行喽~

二、Scene 場景
打開Processing,並在Library的地方 install Collada

在文件->範例程式->Collada的地方開啟Viewer2D執行

可以按指令並配合滑鼠拖曳就可以移動~



2017年12月7日 星期四

蒲立年的學習筆記 Week 13

一、色彩系統
程式碼如下:

RGB模式:
size(255,255);
colorMode(RGB,255);
for(int x=0;x<255;x++)
{
    for(int y=0;y<255;y++)
    {
      stroke(x,y,255);
      point(x,y);
    }

}



HSB模式:
size(255,255);
colorMode(HSB,255);
for(int x=0;x<255;x++)
{
    for(int y=0;y<255;y++)
    {
      stroke(x,y,255);
      point(x,y);
    }

}



二、足球軌跡、等速茶壺

程式碼如下:

#include <opencv/highgui.h> ///for cvLoadImage()
#include <opencv/cv.h> ///for cvCvtColor()
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
float mat[]={1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
GLUquadric * quad;
GLuint idBall, idCanvas, idTeapot;

float ballSize=0.2;
float posX=0.5, posY=0.5, posWin=0.1;
int oldX=0, oldY=0;
void mouse(int button, int state, int x, int y)
{
    oldX=x; oldY=y;
}
double dist(float x, float y){
    return sqrt(x*x+y*y);
}
void motion(int x, int y){
    int dx=x-oldX, dy=oldY-y;
    oldX=x; oldY=y;
    glPushMatrix();
        glRotatef( dist(dx,dy)/2, dy, -dx, 0);
        glMultMatrixf(mat);
        glGetFloatv(GL_MODELVIEW_MATRIX, mat);
    glPopMatrix();
    glutPostRedisplay();
    posX+=dx/500.0*posWin;
    posY-=dy/500.0*posWin;
    static FILE * fout=NULL;
    if(fout==NULL)fout=fopen("trace.txt", "w+");
    fprintf(fout, "%d %d\n", dx, dy);

    static IplImage * img = NULL;
    if(img==NULL){
        img=cvLoadImage("imgCanvas.png"); ///OpenCV讀圖
    }
    int px=posX*img->width, py=posY*img->height, pdx=-(dx/200.0*posWin)*img->width, pdy=(dy/500.0*posWin)*img->height;
    cvLine(img, cvPoint(px,py), cvPoint(px+pdx, py+pdy), cvScalar(255,0,0) );
    glBindTexture(GL_TEXTURE_2D, idCanvas); ///綁定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);
}
void display()
{
    glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glPushMatrix();
        glTranslatef(0, 0.5, 0);
        glBindTexture(GL_TEXTURE_2D, idTeapot);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glPushMatrix();
        glTranslatef(0,0, ballSize);
        glNormal3f(0,0,-1);
        glColor3f(1,1,1);
        glBindTexture(GL_TEXTURE_2D, idCanvas);
        glBegin(GL_POLYGON);
            glTexCoord2f(posX-posWin,posY-posWin);glVertex2f(-1,+1);
            glTexCoord2f(posX-posWin,posY+posWin);glVertex2f(-1,-1);
            glTexCoord2f(posX+posWin,posY+posWin);glVertex2f(+1,-1);
            glTexCoord2f(posX+posWin,posY-posWin);glVertex2f(+1,+1);
        glEnd();
    glPopMatrix();
    glPushMatrix();
        glMultMatrixf(mat);
        glBindTexture(GL_TEXTURE_2D, idBall);
        gluQuadricTexture(quad, 1);
        gluQuadricOrientation(quad, GLU_OUTSIDE);
        gluSphere(quad, ballSize, 30, 30);///glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}

void keyboard(unsigned char key, int x, int y){
    if(key==27)exit(0);
}
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 myLighting(){
    GLfloat light_position[] = {0,0,-1,0};
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glLightfv(GL_LIGHT0,GL_POSITION, light_position);
}
int main(int argc, char**argv){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutCreateWindow("roach");
    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutMouseFunc(mouse);
    glutKeyboardFunc(keyboard);

    printf("Use mouse to roll the ball and to draw trace\n");
    quad = gluNewQuadric();
    idBall = myTexture("imgBall.png");///重點:一定不可在display()讀圖檔
    idCanvas=myTexture("imgCanvas.png");///重點: 你要在main()只讀一次
    idTeapot=myTexture("idTeapot.jpg");
    myLighting();///時機點要在 glutMainLoop()之前, glutCreateWindow()之後

    glutMainLoop();
}


2017年11月23日 星期四

蒲立年的學習筆記 Week 11

一、播放音樂
1.播放wav檔
首先要先#include <mmsystem.h>
程式碼為 
PlaySoundA("file.wav",NULL,SND_ASYNC);
//括弧內容為(檔名,在哪裡,如何播) 
//ASYNC為不等待播完,SYNC為等待播完
//wav檔需放到freeglut資料夾的bin裡

2.播放mp3檔
首先#include <stdio.h>
        #include "CMP3_MCI.h"
程式碼為
CMP3_MCI mp3;//int a;
mp3.Load(".mp3");//讀入mp3檔
    mp3.Play();//Play播放mp3檔
    printf("等待");
    int a;

    scanf("%d",&a);//等待輸入時,程式還沒結束

3.用Processing播放音樂
首先要先下載安裝Minim



程式碼如下

import ddf.minim.*; //use ddf's minim music library
Minim minim; //int a; the whole system
AudioPlayer player; //corresponding to one mp3 file
AudioPlayer player2;
void setup(){
minim = new Minim(this); //constructor of Minim Object
player = minim.loadFile("file.mp3"); //minim load to player
player.play();
}
void draw(){

}

2017年11月16日 星期四

蒲立年的學習筆記 Week 10

一、用Processing寫Android程式

打開Processing,在右上角選擇添加模式

選擇Android模式

手機要設置開發人員選項,設定USB偵錯模式
就可以在Android手機上執行喽~

二、圓球碰撞模擬
這是老師的程式碼範例

void setup() {
size(500, 500);
}

float ballX=250, ballY=450, ballVX=1.3, ballVY=-10;
float ball2X=250, ball2Y=50;
void draw() {
if ( dist(ballX, ballY, ball2X, ball2Y)<100 ) {
float cx=(ballX+ball2X)/2, cy=(ballY+ball2Y)/2;
float nx=ballX-ball2X, ny=ballY-ball2Y;
line(ballX,ballY, ball2X,ball2Y);
PVector N=new PVector(nx, ny);
N.normalize();
PVector v0=new PVector(ballVX, ballVY);
float len= -N.dot(v0);
v0.add(N.mult(len*2));
line(cx,cy, cx+10*ballVX, cy+10*ballVY);
line(cx,cy, cx+20*v0.x, cy+20*v0.y);
ellipse(cx, cy, 10, 10);
stroke(0); 
line(ballX, ballY, ball2X, ball2Y);
stroke(255, 128, 0); 
line(cx, cy, cx+5*ballVX, cy+5*ballVY);
stroke(255, 128, 0); 
line(cx, cy, cx+5*v0.x, cy+5*v0.y);
stroke(255, 0, 0); 
line(cx, cy, cx+N.x, cy+N.y);
//return;
ballVX=v0.x; 
ballVY=v0.y;
}
background(255);
ballX+=ballVX; 
ballY+=ballVY;
if(ballX<50 || ballX>500-50) ballVX = -ballVX;
if(ballY<50 || ballY>500-50) ballVY = -ballVY;
ellipse(ballX, ballY, 100, 100);
ellipse(ball2X, ball2Y, 100, 100);
}
void mouseDragged(){
ball2X=mouseX; ball2Y=mouseY;
}



但其實這個程式有BUG,用滑鼠控制移動的時候有機率兩個球會黏在一起~





2017年11月9日 星期四

蒲立年的學習筆記 Week 09

一、Processing 3實作
別人程式碼範例 : https://www.openprocessing.org/sketch/249457 

試用Processing 3 執行其程式碼

試用Processing 3 執行自己寫的程式碼

程式碼如下:

PImage img=loadImage("Doge.jpg");
size(1000,600); //視窗大小

image(img, 0 ,0, 1000,600); //圖片(開始位置、圖片大小)

*圖片檔直接拉近視窗裡就好,其儲存路徑按ctrl+K可以看到

我們試著用滑鼠位置決定圖片生成位置,達到如下圖的效果

程式碼如下 : 

PImage img;
void setup()
{
  size(1280,1000);
  img=loadImage("Doge.jpg");
}
void draw()
{
  image(img, mouseX, mouseY,50,50);
}


試寫出一個簡易Mario程式~

程式碼如下:

int [][]map={{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
             {0,0,1,1,2,1,1,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
             {1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
PImage imgMario, imgBrick, imgBrick2;
void setup(){
  size(700,600);
imgMario=loadImage("mario.png");
imgBrick=loadImage("brick.png");
imgBrick2=loadImage("brick2.png");
}
float marioX=200, marioY=100, marioVX=0,marioVY=0;
boolean marioOnFloor=false;
void draw(){
  background(255);
  for(int x=0;x<14;x++){
    for(int y=0;y<11;y++){
      if(map[y][x]==1) image(imgBrick, x*50, y*50,50,50);
      if(map[y][x]==2) image(imgBrick2, x*50, y*50,50,50);
    }
  }
  image(imgMario,marioX,marioY,100,100);
  marioY += marioVY; marioX += marioVX;
  marioVY +=0.98;
  if(marioY>=500-80){marioY=500-80; marioVY=0; marioOnFloor=true;}
}
void keyPressed(){
  if(keyCode==UP && marioOnFloor){marioVY=-15; marioOnFloor=false;}
  if(keyCode==RIGHT) marioVX=5;
  if(keyCode==LEFT) marioVX=-5;
}
void keyReleased(){
  if(keyCode==RIGHT || keyCode==LEFT) marioVX=0;
}


太神啦!!



2017年11月2日 星期四

蒲立年的學習筆記 Week 08

一、Texture 貼圖
首先到~jsyeh/3dcg10下載source、data、win32、glut32.dll
此為texture範例檔~

下載openCV 2.1.0
記得到這步驟要點選第三個選項~

安裝完後開啟codeblock,並開啟console application專案
將main.cpp程式碼更改如下

#include <opencv/highgui.h>
int main()
{
IplImage * img=cvLoadImage("earth.jpg"); //隨檔名作更改
cvNamedWindow("hello");
cvShowImage("hello", img);
cvWaitKey(0);
return 0;
}

從網路上下載一個圖片並跟專案檔放在同一個資料夾

但執行後會發生錯誤~


因此我們來做個設定~

右鍵點左邊專案,選擇build options

在compiler的地方add C:\OpenCV2.1\include

在linker地方add C:\OpenCV2.1\lib

Linker Settings加入
1.cv210
2.cxcore210
3.highgui210


設定完成後F9執行~
完成~

讓我們再開個openGL專案~

我們一樣在新的專案點右鍵選build option和上面一樣的設定

在main的地方加上同樣的程式碼

#include <opencv/highgui.h>
int main()
{
IplImage * img=cvLoadImage("earth.jpg"); //隨檔名作更改
cvNamedWindow("hello");
cvShowImage("hello", img);
cvWaitKey(0);
return 0;
}

並複製圖片到freeglut資料夾裡的bin裡

執行~
再按一次任意鍵~
完成~~

接下來我們試著讓earth map變成一個3D立體地球儀
程式碼如下~

#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("earth.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年10月26日 星期四

蒲立年的學習筆記 Week 07

一、用滑鼠打光源

1.首先我們先開啟openGL專案
2.將const  GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };的const 刪去,讓我們能更改light_position的變數,結果為 => GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
3.再下方加上涵式
void motion(int x, int y)
{
    light_position[0]=(x-150*2)/150.0*2;
    light_position[1]=-(y-150)/150.0*2;
    glLightfv(GL_LIGHT0,GL_POSITION,light_position);
    glutPostRedisplay();
}
完成!!

2017年10月19日 星期四

蒲立年的學習筆記 Week 06

打光 (Linghting)
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel = NULL;
void
drawmodel(void)
{
    if (!pmodel)
    {
        pmodel = glmReadOBJ("data/al.obj");
        if (!pmodel) exit(0);
        glmUnitize(pmodel);
        glmFacetNormals(pmodel);
        glmVertexNormals(pmodel, 90.0);
    }

    glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    drawmodel();
    glutSwapBuffers();
}
 GLfloat light_pos[] = { 0.0, 0.0,-1.0, 0.0 }; //打光的方向,此參數時為背後打光
int main(int argc, char**argv)
{

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05");

    glutDisplayFunc(display);
    glEnable(GL_DEPTH_TEST); //深度測試
    glEnable(GL_LIGHTING); //打光(1)
    glEnable(GL_LIGHT0); //打光(1)
    glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
    glutMainLoop();
}
藍字為打光程式碼
綠字為深度程式碼




加入KeyBoard、Mouse和Motion

#include <GL/glut.h>
#include <stdio.h>
#include "glm.h"
GLMmodel* pmodel=NULL;
int rotateX=0,rotateY=0,rotateZ=0;
int oldX=0, oldY=0, oldZ=0;
void keyboard(unsigned char key, int x, int y)
{
    printf("Now:%c (%d %d)\n", key, x, y);
    if (key=='1') rotateX++;
    if (key=='2') rotateY++;
    if (key=='3') rotateZ++;
    glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
    printf("Button:%d State:%d (%d %d)\n",button, state, x, y);
    if(state==GLUT_DOWN)
    {
        oldX=x;
        oldY=y;
    }
}
void motion(int x, int y)
{
    rotateY += -(x-oldX);
    rotateX += -(y-oldY);
    oldX=x;
    oldY=y;
    glutPostRedisplay(); //貼出公告,請電腦有空時,把畫面重新redisplay
}
drawmodel(void)
{
    if (!pmodel)
    {
        pmodel = glmReadOBJ("data/al.obj");
        if (!pmodel) exit(0);
        glmUnitize(pmodel);
        glmFacetNormals(pmodel);
        glmVertexNormals(pmodel, 90.0);
    }

    glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glRotatef(rotateX, 1, 0, 0);  //設定旋轉角度
    glRotatef(rotateY, 0, 1, 0);
    glRotatef(rotateZ, 0, 0, 1);
    drawmodel();
    glPopMatrix();
    glutSwapBuffers();
}
GLfloat light_pos[] = { 0.0, 0.0,-1.0, 0.0 };
int main(int argc, char**argv)
{

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05");

    glutDisplayFunc(display);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
    glutMotionFunc(motion);
    glutMouseFunc(mouse);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
}





2017年10月12日 星期四

蒲立年的學習筆記 Week 05

Part 1: 開啟移動、選轉、縮放模擬程式

Step 1: 從jsyeh.org/3dcg10下載data、win32和 glut32.dll

Step 2: 解壓縮後放入同一層級資料夾

Step 3: 執行Transformation.exe
=>可透過滑鼠在參數上方上下拖移改變參數
完成!!

Part 2: 模擬透視投影

Step 1: 承上述步驟,執行另一檔案 Projection.exe


=>右鍵可以選擇不同參數模式
(1)glu Perspectivev(fovy,aspect,zNear,zFar)
(2)glOrtho(左,右,上,下,近,遠)
     glFrustum(左,右,上,下,近,遠)
(3)gluLookAt(eyeX,eyeY,eyeZ,
                        centerX,centerY,centerZ,
                        upX,upY,upZ)
=>eye為視角位置, center為物體位置, 視角看出去的角度


Part 3: 建構簡單透視模擬程式

Step 1: 從jsyeh.org/3dcg10下載source

Step 2: 把projection.cpp簡化成以下程式
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel = NULL;
void
drawmodel(void)
{
    if (!pmodel) {
pmodel = glmReadOBJ("data/al.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
    }

    glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    drawmodel();
    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05");

    glutDisplayFunc(display);

    glutMainLoop();

}

注意!! 由於glm.cpp裡的strdup涵式為舊式涵式,執行前請將Settings->compiler裡的C++11勾選取消!!
就可以執行喽~

蒲立年的學習筆記 Week_04

Topic 1 : 移動(Translate)、旋轉(Rotate)、縮放(Scale)

Translate : 

glTranslated(X, Y, Z) - 朝(x,y,z)方向平移


Rotate : *以右手定律為基礎*

glRotated(角度,x,y,z) => glRotated(60,1,0,0)是以向量(1,0,0)X軸為選轉軸逆時針旋轉60度
glRotated(a,0,0,1) => 由於a= t*90.0不是定值,所以可以使其一直旋轉


沒有旋轉的時候~

從左到又以X軸90、60、30度逆時針旋轉~

Scale : 

glScale(x縮放率,y縮放率,z縮放率)

原圖~

從左到右一程式碼之設定倍率縮放~

Topic 2 : Mouse and Motion

2017年9月28日 星期四

蒲立年的學習筆記 Week 03

HW1 編譯小小兵的程式:


Step 1:從moodle上下載學姐小小兵的程式(hw1.c/minion.txt)

Step 2:把minion.txt放到freeglut/bin資料夾裡

Step 3:開啟OpenGL專案,把學姐的程式碼複製貼上,並建立執行
完成!!

HW2 


Step 1:從moodle上下載所需的檔案(足球模型、3D Explorer)

Step 2:安裝完3D Explorer並開啟,從3D Explorer開啟soccerball.obj

Step 3:儲存為.cpp

Step 4:選擇Sample APP

Step 5:由CodeBlocks開啟OpenGL專案建立執行,將不能編譯的部分隱藏

Step 6:在一次建立執行
完成!!