1.基本10行
#include <GL/glut.h>
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清畫面
glColor3f(0,0,0);///顏色(RGB)
glutSolidTeapot(0.3);///就一個神燈
glutSwapBuffers();///畫好提交
}
int main(int argc, char** argv)///主函式 進階版 看不懂
{
glutInit( &argc, argv);///把參數給glutInit 初始化
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
glutCreateWindow("第二周的程式");///開GLUT視窗
glutDisplayFunc(display);///用來顯示的函式
glutMainLoop();
}
2.mouse
void mouse (int button, int state , int x,int y )
{
自己的要求
}///點下去一次 放開也一次
glutCreateWindow("第二周的程式");///開GLUT視窗
在這裡
glutMainLoop();
void mouse (int button, int state , int x,int y )
{
printf("%d %d %d %d\n",button,state,x,y);
}///印出座標--->記得要include <stdio.h>
四個數字
0左鍵 1中鍵 2右鍵
0點下去 1放開
x
0點下去 1放開
x
y
if(state==GLUT_DOWN)///如果左鍵壓下去
{
printf("(%d-150)/150 -(%d-150)/150\n",x,y);
}///印出座標--->記得要include <stdio.h>
3.範例
去https://jsyeh.org/3dcg10/
下載 data跟win32
把data丟在win32
執行 Transformation.exe
可以去玩他
4.讓茶壺跟我者滑鼠動
(前年的)
#include <GL/glut.h>
float mouseX=0, mouseY=0;
void myTeapot(float x,float y)
{
/// glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清畫面
glPushMatrix();///備份舊的位置
///移動會累積,因為它會修改矩陣
glTranslatef(x,y,0);///右上角
glColor3f(1,1,0);///顏色(RGB)
glutSolidTeapot(0.3);///就一個神燈
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 )
{
mouseX=x; mouseY=y;
}
int main(int argc, char** argv)///主函式 進階版 看不懂
{
glutInit( &argc, argv);///把參數給glutInit 初始化
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
glutCreateWindow("week03-移動");///開GLUT視窗
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
}
(今年的)
#include <GL/glut.h>
float teapotX=0, teapotY=0;
void myTeapot(float x,float y)
{
/// glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清畫面
glPushMatrix();///備份舊的位置
///移動會累積,因為它會修改矩陣
glTranslatef(x,y,0);///右上角
glColor3f(1,1,0);///顏色(RGB)
glutSolidTeapot(0.3);///就一個神燈
glPopMatrix();///還原矩陣
}
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///備份矩陣
glTranslatef(teapotX, teapotY,0);///把座標移動
glutSolidTeapot(0.3);
glPopMatrix();///還原矩陣
glutSwapBuffers();
}
void mouse (int button, int state , int x,int y )
{
teapotX=(x-150)/150.0;
teapotY=-(y-150)/150.0;
}
int main(int argc, char** argv)///主函式 進階版 看不懂
{
glutInit( &argc, argv);///把參數給glutInit 初始化
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
glutCreateWindow("week03-移動");///開GLUT視窗
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
}
功能一樣
5.旋轉
首先訂一個旋轉軸
旋轉軸先定義點 定義完之後與原點的連線
訂好後右手比讚方向指向你的旋轉軸
其餘4指方向為旋轉方向
xyz的軸方向不要搞錯
6.實作(旋轉)
(前年的)
#include <GL/glut.h>
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清畫面
glPushMatrix();///備分矩陣
glRotatef(90,0,0,1);///旋轉
glColor3f(1,0,0);///顏色(RGB)
glutSolidTeapot(0.3);///就一個神燈
glPopMatrix();///還原矩陣
glutSwapBuffers();///畫好提交
}
int main(int argc, char** argv)///主函式 進階版 看不懂
{
glutInit( &argc, argv);///把參數給glutInit 初始化
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
glutCreateWindow("第4周的程式");///開GLUT視窗
glutDisplayFunc(display);///用來顯示的函式
glutMainLoop();
}
(今年的)
#include <GL/glut.h>
#include <stdio.h>
float angle = 0;
float teapotX=0, teapotY=0;
void myTeapot(float x,float y);
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,0,0,1);
glutSolidTeapot(0.3);///就一個神燈
glPopMatrix();///還原矩陣
glutSwapBuffers();
}
void mouse (int button, int state , int x,int y )
{///修正
teapotX=(x-150)/150.0;
teapotY=-(y-150)/150.0;
}
void motion(int x, int y)
{
angle=x;
display();
}
int main(int argc, char** argv)///主函式 進階版 看不懂
{
glutInit( &argc, argv);///把參數給glutInit 初始化
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
glutCreateWindow("week03-旋轉");///開GLUT視窗
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
7.用鍵盤融合
#include <GL/glut.h>
#include <stdio.h>
float angle = 0;
float teapotX=0, teapotY=0;
void myTeapot(float x,float y);
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(teapotX,teapotY,0);
glRotatef(angle,0,0,1);
glutSolidTeapot(0.3);///就一個神燈
glPopMatrix();///還原矩陣
glutSwapBuffers();
}
int method=1;///1 rotate 2 translate
int oldX=0,oldY=0;
void mouse (int button, int state , int x,int y )
{
oldX=x;
oldY=y;
}
void keyboard(unsigned char key , int x, int y)
{
if (key=='e')method=1;///rotate
if (key=='w')method=2;///transltate
}
void motion(int x, int y)
{
if(method==1)
{
angle+=x-oldX;
}
else if(method==2)
{
teapotX+=(x-oldX)/150.0;
teapotY-=(y-oldY)/150.0;
}
oldX=x;
oldY=y;
display();
}
int main(int argc, char** argv)///主函式 進階版 看不懂
{
glutInit( &argc, argv);///把參數給glutInit 初始化
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );///雙緩衝區+3D深度功能
glutCreateWindow("week03-旋轉");///開GLUT視窗
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
沒有留言:
張貼留言