總複習
最後一堂課了 !
1. 期末作品繳交方式
2. 期末作品評分方式
3. 網友問 push matrix 和 pop matrix 事件
4. 整學期總複習 & 示範期末作品怎麼做
## 怎把期末作業做出來
運鏡
2022電腦圖學 Computer Graphics 授課教師: 葉正聖 銘傳大學資訊傳播工程系 每週主題: 程式環境、點線面顏色、移動/旋轉/縮放與矩陣(Matrix)、階層性關節轉動(T-R-T)、做出機器人、打光、貼圖、glu/glut函式、鍵盤、滑鼠、計時器(timer)、讀入3D模型、粒子系統、聲音、特效、投影矩陣、攝影機與運鏡、機器人2.0、期末作品
總複習
最後一堂課了 !
1. 期末作品繳交方式
2. 期末作品評分方式
3. 網友問 push matrix 和 pop matrix 事件
4. 整學期總複習 & 示範期末作品怎麼做
## 怎把期末作業做出來
運鏡
alpha內插公式 : angle = alpha *新的 + (1-alpha) *舊的
alpha = 0.0 ~ 1
===========================================================================偷上禮拜的程式碼
///week16_interpolation
///改編自week15_angles_TRT_again
#include <GL/glut.h>
#include <stdio.h>
float angle[20],oldX=0;
int angleID=0;
FILE * fout=NULL, * fin = NULL;
void myWrite()
{///每呼叫一次myWrite
if(fout == NULL)fout=fopen("file.txt","w+");
for(int i = 0;i<20;i++)
{
printf("%.1f ",angle[i]);///小黑印出來
fprintf(fout,"%.1f ",angle[i]);///檔案印出來
}///這裡老師沒有fclose
printf("\n");///小黑印出跳行
fprintf(fout,"\n");///檔案跳行
}
void myRead()
{
if(fout!=NULL){fclose(fout); fout=NULL;}
if(fin==NULL) fin=fopen("file.txt","r");
for(int i=0;i<20;i++)
{
fscanf(fin,"%f",&angle[i]);
}
glutPostRedisplay();///重劃畫面
}
void keyboard(unsigned char key,int x,int y)
{
if(key=='s') myWrite();///調好動作才save存檔
if(key=='r') myRead();
if(key=='0') angleID=0;
if(key=='1') angleID=1;
if(key=='2') angleID=2;
if(key=='3') angleID=3;
}
void mouse(int button,int state,int x,int y)
{
oldX=x;
}
void motion(int x,int y)
{
angle[angleID]+=(x-oldX);
///myWrite();
oldX=x;
glutPostRedisplay();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);
glRectf(0.3,0.5,-0.3,-0.5);
glPushMatrix();
glTranslatef(0.3,0.4,0);
glRotatef(angle[0],0,0,1);
glTranslatef(-0.3,-0.4,0);
glColor3f(1,0,0);
glRectf(0.3,0.5,0.7,0.3);
glPushMatrix();
glTranslatef(0.7,0.4,0);
glRotatef(angle[1],0,0,1);
glTranslatef(-0.7,-0.4,0);
glColor3f(0,1,0);
glRectf(0.7,0.5,1.0,0.3);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(-0.3,0.4,0);
glRotatef(angle[2],0,0,1);
glTranslatef(0.3,-0.4,0);
glColor3f(1,0,0);
glRectf(-0.3,0.5,-0.7,0.3);
glPushMatrix();
glTranslatef(-0.7,0.4,0);
glRotatef(angle[3],0,0,1);
glTranslatef(0.7,-0.4,0);
glColor3f(0,1,0);
glRectf(-0.7,0.5,-1.0,0.3);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week15_angles_TRT_again");
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutMainLoop();
}
///week16_interpolation
///改編自week15_angles_TRT_again
#include <GL/glut.h>
#include <stdio.h>
float angle[20],oldX=0;
int angleID=0;
FILE * fout=NULL, * fin = NULL;
void myWrite()
{///每呼叫一次myWrite
if(fout == NULL)fout=fopen("file.txt","w+");
for(int i = 0;i<20;i++)
{
printf("%.1f ",angle[i]);///小黑印出來
fprintf(fout,"%.1f ",angle[i]);///檔案印出來
}///這裡老師沒有fclose
printf("\n");///小黑印出跳行
fprintf(fout,"\n");///檔案跳行
}
float NewAngle[20],OldAngle[20];
void myRead()
{
if(fout!=NULL){fclose(fout); fout=NULL;}
if(fin==NULL) fin=fopen("file.txt","r");
for(int i=0;i<20;i++)
{
OldAngle[i] = NewAngle[i];
fscanf(fin,"%f",&NewAngle[i]);
/// fscanf(fin,"%f",&angle[i]);
}
glutPostRedisplay();///重劃畫面
}
void myInterpolate(float alpha){
for(int i=0;i<20;i++){
angle[i] = alpha * NewAngle[i] + (1-alpha) * OldAngle[i];
}
}
int t=0;
void keyboard(unsigned char key,int x,int y)
{
if(key=='p'){///play
if(t%30==0)myRead();
myInterpolate((t%30)/30.0);
glutPostRedisplay();
t++;
}
if(key=='s') myWrite();///調好動作才save存檔
if(key=='r') myRead();
if(key=='0') angleID=0;
if(key=='1') angleID=1;
if(key=='2') angleID=2;
if(key=='3') angleID=3;
}
void mouse(int button,int state,int x,int y)
{
oldX=x;
}
void motion(int x,int y)
{
angle[angleID]+=(x-oldX);
///myWrite();
oldX=x;
glutPostRedisplay();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);
glRectf(0.3,0.5,-0.3,-0.5);
glPushMatrix();
glTranslatef(0.3,0.4,0);
glRotatef(angle[0],0,0,1);
glTranslatef(-0.3,-0.4,0);
glColor3f(1,0,0);
glRectf(0.3,0.5,0.7,0.3);
glPushMatrix();
glTranslatef(0.7,0.4,0);
glRotatef(angle[1],0,0,1);
glTranslatef(-0.7,-0.4,0);
glColor3f(0,1,0);
glRectf(0.7,0.5,1.0,0.3);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(-0.3,0.4,0);
glRotatef(angle[2],0,0,1);
glTranslatef(0.3,-0.4,0);
glColor3f(1,0,0);
glRectf(-0.3,0.5,-0.7,0.3);
glPushMatrix();
glTranslatef(-0.7,0.4,0);
glRotatef(angle[3],0,0,1);
glTranslatef(0.7,-0.4,0);
glColor3f(0,1,0);
glRectf(-0.7,0.5,-1.0,0.3);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week15_angles_TRT_again");
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutMainLoop();
}
#include <windows.h>
#include <stdio.h>
int main()
{
printf("PlaySound()之前\n");
PlaySound("badbad.wav",NULL,SND_SYNC);
printf("PlaySound()之後\n");
}
File-New-Empty File 存檔改名week14-1.cpp
程式碼 :
#include <stdio.h>
int main(){
FILE *fout=fopen("file.txt","w+");
printf("HELLO WORLD\n");
fprintf(fout,"HELLO WORLD\n");
fclose(fout);
}
#include<stdio.h>
int main()
{
///檔案指標fout 開啟檔案(檔名,write模式)
FILE * fout = fopen("file.txt","w+");
fprintf(fout,"3.1415926\n");
fclose(fout);///關檔
float angle =0;
FILE * fin=fopen("file.txt","r");
fscanf(fin,"%f",&angle);///沒加&會當
printf("讀到了角度:%f",angle);
fclose(fin);
}
#include <stdio.h>///printf用
float angle[4] , oldx=0;///angle變陣列以致可以放更多選轉角度
int angleID=0;///0號關節 1號關節
FILE * fout = NULL; ///設空指標
void myWrite()
{
if ( fout = NULL ) fout = fopen("file.txt", "w+");
for (int i=0;i<20;i++){
printf("%.1f",angle[i]);
fprintf(fout , "%.1f" , angle[i] );
}
}
void keyboard(unsigned char key , int x , int y)///根據按數字鍵多少決定第幾個關節要轉動
{ ///按數字鍵決定要改變哪個angleID
if (key=='0') angleID=0;
if (key=='1') angleID=1;
if (key=='2') angleID=2;
if (key=='3') angleID=3;
}
void mouse(int button , int state , int x ,int y)
{
oldx=x;
}
void motion (int x, int y)
{
angle[angleID]+=(x-oldx);///angle變成陣列
oldx=x;
mywrite();///執行用
glutPostRedisplay();///請glut重新re display
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);
glRectf( 0.3,0.5, -0.3,-0.5);
glPushMatrix();
glTranslatef(0.3,0.4,0);///
glRotatef(angle[0],0,0,1);///旋轉 對Z軸轉 ///angle[0] 第一個值
glTranslatef(-0.3,-0.4,0);///把手臂選轉中心放世界中心
glColor3f(1,0,0);
glRectf(0.3,0.5,0.7,0.3);///右手臂
glPushMatrix();
glTranslatef(0.7,0.4,0);;///(3)拉回到右上角
glRotatef(angle[1],0,0,1);///(2)旋轉角度 ///angle[1] 第二個值
glTranslatef(-0.7,-0.4,0);///(1)將軸心放到世界中心
glColor3f(0,1,10);
glRectf(0.7 , 0.5 , 1.0 , 0.3);///右上手臂
glPopMatrix();
glPopMatrix();
///左手跟右手的X軸相反,所以要加負號
glPushMatrix();
glTranslatef(-0.3,0.4,0);///
glRotatef(angle[2],0,0,1);///旋轉 對Z軸轉 ///angle[2] 第三個值
glTranslatef(0.3,-0.4,0);///把手臂選轉中心放世界中心
glColor3f(1,0,0);
glRectf(-0.3,0.5,-0.7,0.3);///左手臂
glPushMatrix();
glTranslatef(-0.7,0.4,0);///(3)拉回到左上角
glRotatef(angle[3],0,0,1);///(2)旋轉角度 ///angle[3] 第四個值
glTranslatef(0.7,-0.4,0);///(1)將軸心放到世界中心
glColor3f(0,1,10);
glRectf(-0.7 , 0.5 , -1.0 , 0.3);///左上手臂
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(600,600);
glutCreateWindow("week13_rect_many_TRT");
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutDisplayFunc(display);
glutMainLoop();
}
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glRectf( 0.3,0.5,-0.3,-0.5);///四邊形
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(600,600);///改視窗大小
glutCreateWindow("week13_rect_TRT");
glutDisplayFunc(display);
glutMainLoop();
}
glTranslatef( 0.9 , 0.0 , 0.0 );移動
glrotatef(角度,0,1,0);旋轉
=========================================================================
https://120.125.80.50/GL/ 期中考、小考題
Ctrl-R Reload可以清空
畫個身體 叫 MyDrawObject(0)
畫個手臂 叫 MyDrawObject(1)
可以改程式碼順序 再按空白鍵 會改變成動畫
#include <GL/glut.h>
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);
glutSolidTeapot(0.3);
glPushMatrix();
glTranslatef(0.3,0,0);
glRotatef( angle,0,0,1);
glTranslatef(0.2,0,0);
glColor3f(1,0,0);
glutSolidTeapot(0.2);
glPushMatrix();
glTranslatef(0.2,0,0);
glRotatef( angle,0,0,1);
glTranslatef(0.2,0,0);
glColor3f(1,0,0);
glutSolidTeapot(0.2);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
angle+=0.1;
}
int main(int argc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week12 TRT");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
}
一. 一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam, 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...