step 1 : 下載資料
1.1 到https://jsyeh.org/3dcg10 下載 data , window32
1.2 windows.zip =壓縮=> 下載/windows/Shapes.exe
data.zip =壓縮=> 下載windows/data
glut32.dll ==> 下載/windows/glut32.dll
下載完後將 data 放入 windows 資料夾
下載完後將 data 放入 windows 資料夾
1.3 執行Transformation.exe
(右上角) 右鍵換模型
(下方) 拖曳綠色的數值
step 2 : 開啟上周茶壺
桌面 freeglut 的 lib 裡面有 libfreeglut.a 把它複製貼上並改成 libglut32.a
2.1 開啟OPENGL檔案 命名week03_translate
2.2 貼上上週茶壺程式碼
#include <GL/glut.h>///使用glut的外掛
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glColor3f(1,1,0);///設定色彩
glutSolidTeapot(0.3);///實心的茶壺
glutSwapBuffers();///畫好後交換出來
}
int main(int argc , char** argv) ///main主函式進階版
{
glutInit( &argc , argv);///把參數送給glut初始化
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH ); ///雙緩衝區 + 3D深度功能
glutCreateWindow("第02周的程式哦!");///開啟glut視窗
glutDisplayFunc(display);///用來顯示的函示
glutMainLoop();///主要的程式迴圈
}
2.3 新增可移動的程式碼 (/*代表新增)
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* glPushMatrix();///備份矩陣( 備份舊的位置 )
///移動會累積 因為他會修改矩陣
glTranslatef(0.5 , 0.5, 0); ///右上角
glColor3f(1,1,0);///黃色
glutSolidTeapot(0.3);///茶壺
glPopMatrix();///(還原舊的位置) */
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc , argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03 移動");
glutDisplayFunc(display);
glutMainLoop();
}
2.4 新增函式 讓四角都有茶壺 (/*代表新增)
#include <GL/glut.h>
void MyTeapot( float x ,float y)
{
glPushMatrix();///備份矩陣( 備份舊的位置 )
///移動會累積 因為他會修改矩陣
/*glTranslatef( x , y , 0);*/ ///自定義x, y軸 位置
glColor3f(1,1,0);///黃色
glutSolidTeapot(0.3);///茶壺
glPopMatrix();///(還原舊的位置)
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/*MyTeapot(0.5 , 0.5); ///右上
MyTeapot(-0.5 , 0.5); ///左上
MyTeapot(-0.5 , -0.5); ///左下
MyTeapot(0.5 , -0.5);*/ ///右下
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc , argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03 移動");
glutDisplayFunc(display);
glutMainLoop();
}
3.1 新增程式碼 (/*代表新增) (滑鼠點擊即可移動位置)
#include <GL/glut.h>
3.2 新增可列印滑鼠座標的程式碼(/*代表新增)
/*float mouseX=0 , mouseY=0;*/ /// 設定滑鼠位置的初始值
void MyTeapot( float x ,float y)
{
glPushMatrix();///備份矩陣( 備份舊的位置 )
///移動會累積 因為他會修改矩陣
glTranslatef( x , y , 0);
glColor3f(1,1,0);///黃色
glutSolidTeapot(0.3);///茶壺
glPopMatrix();///(還原舊的位置)
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/*MyTeapot( ( mouseX-150)/150.0 , -(mouseY-150)/150.0 );*/
///將滑鼠位置的座標 換算成3D的位置座標
///視窗預設 300*300 口訣 : 減一半 , 除一半 , Y軸是相反
glutSwapBuffers();
}
/*void mouse ( int button , int state , int x , int y)
{
mouseX=x; ///滑鼠位置的x
mouseY=y; ///滑鼠位置的y
}*/
int main(int argc, char** argv)
{
glutInit(&argc , argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03 移動");
glutDisplayFunc(display);
/* glutMouseFunc(mouse);*/ ///滑鼠用
glutMainLoop();
}
#include <GL/glut.h>
/*#include <stdio.h>*/ /// 印東西用的
float mouseX=0 , mouseY=0;
void MyTeapot( float x ,float y)
{
glPushMatrix();///備份矩陣( 備份舊的位置 )
///移動會累積 因為他會修改矩陣
glTranslatef( x , y , 0);
glColor3f(1,1,0);///黃色
glutSolidTeapot(0.1);///茶壺
glPopMatrix();///(還原舊的位置)
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
MyTeapot( ( mouseX-150)/150.0 , -(mouseY-150)/150.0 );
glutSwapBuffers();
}
void mouse ( int button , int state , int x , int y)
{
/* printf("%d %d %d %d \n",button , state , x , y);*/ ///印出滑鼠點擊壓住跟放開的座標位置
mouseX=x;
mouseY=y;
}
int main(int argc, char** argv)
{
glutInit(&argc , argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03 移動");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
}
step 4 : 利用小畫家幫忙找顏色 、 找位置
4.1 (示範程式碼) 調顏色
void MyTeapot( float x ,float y)
{
glPushMatrix();///備份矩陣( 備份舊的位置 )
///移動會累積 因為他會修改矩陣
glTranslatef( x , y , 0);
glColor3f( R/255.0 , G/255.0 , B/255.0 ); ///RGB可透過小畫家查
glutSolidTeapot(0.1);///茶壺
glPopMatrix();///(還原舊的位置)
}
4.2 (示範程式碼) 找位置
void mouse ( int button , int state , int x , int y)
{
printf(" glVertex2f( (%d-150)/150.0 , -(%d-150)/150.0 ); \n", x , y );///找出滑鼠點擊位置
mouseX=x;
mouseY=y;
}
沒有留言:
張貼留言