2019電腦圖學 Computer Graphics 授課教師: 葉正聖 銘傳大學資訊傳播工程系 每週主題: 程式環境、點線面顏色、移動/旋轉/縮放與矩陣(Matrix)、階層性關節轉動(T-R-T)、做出機器人、打光、貼圖、glu/glut函式、鍵盤、滑鼠、計時器(timer)、讀入3D模型、粒子系統、聲音、特效、投影矩陣、攝影機與運鏡、機器人2.0、期末作品
2019年4月30日 星期二
uva100:3n+1
1.讀input
2.ans不明
所以
(1)ans是maxlength(最大長度),我們用max表示
(2)將規律翻譯出來(此程式還不能執行)
while:因為題目說"停止",所以條件要用while而不是if
3. 接下來,我們知道n是要被丟進if判斷的input,所以要從input裡面找出n的範圍
所以下一個方向是要寫出input從a跑到b這種感覺,我在for裡面宣告一個變數atob(a到b的意思)
為了讓atob可以專心做好永遠都是a到b
不讓atob改變,每次進入迴圈就讓n=atob
for(int n){
}
相當於
int n;
for(){
}
都是在迴圈外宣告、重製的意思
4.公式可以跑之後 我們要來求長度,例如上圖圈起來的atob=3時 長度是7+2(也要數到自己和1)
可以利用count來求長度,這裡的count就是length
5.把count擺if判斷裡面,每運算一次就++
6.在count裡面抓出最大的count
7.最後 測試資料裡面會有 a大b小的資料
所以要把大的擺到b小的擺到a
2019年4月26日 星期五
week10
下載好之後,觀察更鰾順序後是否有什麼改變
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0,0.5,0);
glutWireTeapot(0.3);
glPopMatrix();
glPushMatrix();
glTranslatef(0.51,0.64,0);
glRotatef(angle,0,0,1);
glTranslatef(0.6,0,0);
glRotatef(-90,0,1,0);
glutWireCone(0.1,0.6,10,10);
glPopMatrix();
glutSwapBuffers();
}
void motion(int x,int y)
{
angle = x;
display();
}
int main(int argc, char ** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week10-TRT");
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMainLoop();
}
做好前置作業,你知道的
做個茶壺
程式碼:
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc, char ** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week10-TRT");
glutDisplayFunc(display);
glutMainLoop();
}
加個煙
程式碼:
#include <GL/glut.h>
float angle=0;void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0,0.5,0);
glutWireTeapot(0.3);
glPopMatrix();
glPushMatrix();
glTranslatef(0.51,0.64,0);
glRotatef(angle,0,0,1);
glTranslatef(0.6,0,0);
glRotatef(-90,0,1,0);
glutWireCone(0.1,0.6,10,10);
glPopMatrix();
glutSwapBuffers();
}
void motion(int x,int y)
{
angle = x;
display();
}
int main(int argc, char ** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week10-TRT");
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMainLoop();
}
week10
1.www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10裡面先下載data,win32,glut32.dll
2.將windows解壓縮
3.將data解壓縮至windows的資料夾,並將glut32.dll移進去
4.按滑鼠右鍵點選swap translate/rotate
5.https://www.transmissionzero.co.uk/software/freeglut-devel/
6.freeglut解壓縮到桌面,點進lib資料夾將libfreeglut.a複製並改名為libglut32.a
7.新增一個project選擇glut project
8.複製程式碼並執行
#include <GL/glut.h>
void display()
{
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc, char ** argv)
{
glutInit( &argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week10 TRT");
glutDisplayFunc(display);
glutMainLoop();
}
9.新增一個圓錐體,做茶壺的延伸
程式碼:
#include <GL/glut.h>
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0,0.5,0);
glutSolidTeapot(0.3);
glPopMatrix();
glPushMatrix();
glTranslatef(0.51,0.63,0);
glRotatef(angle,0,0,1);
glTranslatef(0.6,0,0);
glRotatef(-90,0,1,0);
glutWireCone(0.1,0.6,10,10);
glPopMatrix();
glutSwapBuffers();
}
void motion(int x,int y)
{
angle=x;
display();
}
int main(int argc, char ** argv)
{
glutInit( &argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week10 TRT");
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMainLoop();
}
huangxuuu電腦圖學week10
今日目標:TRT旋轉(改變旋轉軸)
一.移動與旋轉
(1)設定好windows目錄,執行transformation.exe
(2)觀察glRotatef和glTranslate順序對調會有什麼差別
*glTranslatef();在外面:自轉後一邊移動
*glRotatef();在外面:一邊移動一邊繞著別人轉
二.TRT旋轉
電腦圖學---10
電腦圖學---10
下載
data (裡面有MAYA圖案,移動到Windows資料夾)
win32 (解壓縮會有Windows資料夾)
glut32.dll (移動到Windows資料夾)
⧭公轉、自轉
自轉 (先T在R)
公轉 (先R在T)
➟打開codeblocks
Files> New>project>GLUT ➟到Google 搜尋 freeglut windows 下載 Download freeglut 3.0.0 for MinGW ➟解壓縮 freeglut打開 lib 找到 freeglut.a 並複製
把 freeglut.a 改為 libglut32.a
把 freeglut.a 改為 libglut32.a
複製 freeglut連接位置
找到 程式碼 main.c 並打開 執行完成!
🔺將原本的glutSolidTeapot改成glutWireTeapot
茶壺會變成只有框架的茶壺
加上glutWireCone畫出圓錐
更改位置及旋轉點 讓圓錐點對準茶壺嘴
加上滑鼠控制旋轉的程式碼 可讓圓椎透過滑鼠移動旋轉
茶壺會變成只有框架的茶壺
加上glutWireCone畫出圓錐
更改位置及旋轉點 讓圓錐點對準茶壺嘴
加上滑鼠控制旋轉的程式碼 可讓圓椎透過滑鼠移動旋轉
程式碼
#include <GL/glut.h>
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0.51,0.63,0); /// (3)希望把 會動的手 從肚臍移到茶壺上
glRotated(angle, 0,0,1);/// (1)這是手的旋轉
glTranslatef(0.6,0,0); /// (2)這是把手旋轉中心,先移到畫面的中心
glRotatef(-90,0,1,0);
glutWireCone(0.1,0.6,10,10);
glPopMatrix();
glutSwapBuffers();
}
void motion(int x, int y)
{
angle =x;
display();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week 10");
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMainLoop();
}
幫我稱10秒!!!week_10
1.講解在程式中 把Translatef和Rotatef的順序對調
會有怎樣的變化
Translatef在前面,旋轉的方式像是自體旋轉
Rotatef在前面,旋轉的方式像是地球公轉,繞著一個圓心轉
程式順序由下看到上會比較容易理解
2.做出如下圖的程式
圓錐體可在茶壺口旋轉
#include <GL/glut.h> float angle=0; void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslated(0,0.5,0); glutWireTeapot(0.3); glPopMatrix(); glPushMatrix(); glTranslated(0.51,0.63,0); glRotatef(angle,0,0,1); glTranslated(0.6,0,0); glRotatef(-90,0,1,0); glutWireCone(0.1,0.6,10,10); glPopMatrix(); glutSwapBuffers(); } void motion(int x,int y)//用滑鼠來設定x,y { angle = x; display(); } int main(int argc,char ** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH); glutCreateWindow("第N個程式"); glutDisplayFunc(display); glutMotionFunc(motion);//呼叫滑鼠函式 glutMainLoop(); }
會有怎樣的變化
Translatef在前面,旋轉的方式像是自體旋轉
Rotatef在前面,旋轉的方式像是地球公轉,繞著一個圓心轉
程式順序由下看到上會比較容易理解
2.做出如下圖的程式
圓錐體可在茶壺口旋轉
#include <GL/glut.h> float angle=0; void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslated(0,0.5,0); glutWireTeapot(0.3); glPopMatrix(); glPushMatrix(); glTranslated(0.51,0.63,0); glRotatef(angle,0,0,1); glTranslated(0.6,0,0); glRotatef(-90,0,1,0); glutWireCone(0.1,0.6,10,10); glPopMatrix(); glutSwapBuffers(); } void motion(int x,int y)//用滑鼠來設定x,y { angle = x; display(); } int main(int argc,char ** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH); glutCreateWindow("第N個程式"); glutDisplayFunc(display); glutMotionFunc(motion);//呼叫滑鼠函式 glutMainLoop(); }
學渣的奮鬥史-8
我今天手機螢幕摔碎了
難過的一天QAQ
今天的上課內容是在旋轉跟移動還有縮放的關聯
有分自轉及公轉的差別
以下是自轉
再來是公轉
接這用這個概念做了茶壺旋轉的延伸
程式碼如下圖
#include <GL/glut.h>
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();//備份矩陣,保護程式
glTranslatef(0,0.5,0);
glutWireTeapot(0.3);
glPopMatrix();//還原矩陣
glPushMatrix();//備份矩陣,保護程式
glTranslatef(0.51,0.63,0);
glRotatef(angle,0,0,1);
glTranslatef(0.6,0,0);
glRotatef(-90,0,1,0);
glutWireCone(0.1,0.6,10,10);
glPopMatrix();//還原矩陣
glutSwapBuffers();
}
void motion(int x,int y)//用滑鼠來設定x,y
{
angle=x;
display();
}
int main(int argc,char ** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("第N個程式");
glutDisplayFunc(display);
glutMotionFunc(motion);//呼叫滑鼠函式
glutMainLoop();
}
成果如下
就這樣 ㄅㄅ
訂閱:
文章 (Atom)