1-1 到jsyeh.org的3dcg10中
windows.zip下載 windows\Transformation.exe
data.zip下載 windows\data\很多模式
把data拉進windows然後執行windows\Transformation.exe
右上角換模式,下方可以換角度。
1-2
旋轉軸依照不同的x y z轉向不同的方向
依照X軸轉
依照Y軸轉
依照Z軸轉
2-1#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(180,0,0,1); (以x軸旋轉180度)
glColor3f(1,1,0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
int main( int argc, char**argv )
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week05 Rotate");
glutDisplayFunc(display);///Display顯示
glutMainLoop();
}
加入angle因為不同的角度,改變茶壺的旋轉方向。
3-1
#include <GL/glut.h>
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,0,0,1);
glColor3f(1,1,0);
glutSolidTeapot(0.3);
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("week05 Rotate");
glutDisplayFunc(display);///Display顯示
glutMotionFunc(motion);
glutMainLoop();
}
2-3
#include <GL/glut.h>
float angle=0,oldX=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,0,0,1);
glColor3f(1,1,0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void mouse(int button,int state,int x,int y)
{
oldX=x;
}
void motion(int x,int y)
{
angle+=(x-oldX);
oldX=x;
display();
}
int main( int argc, char**argv )
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week05 Rotate");
glutDisplayFunc(display);///Display顯示
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
一開始沒有頂點,用迴圈畫出N個頂點, N++多一個頂點, x[N-1]=mouseX新增頂點的X座標
y[N-1]=mouseY新增頂點的Y座標。
#include <stdio.h>
#include <GL/glut.h>
int N=0;
int x[1000],y[1000];
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_LINE_LOOP);
for(int i=0;i<N;i++){
glVertex2f((x[i]-150)/150.0,-(y[i]-150)/150.0);
}
glEnd();
glutSwapBuffers();
}
void mouse(int button,int state,int mouseX,int mouseY)
{
if(state==GLUT_DOWN){
N++;
x[N-1]=mouseX;
y[N-1]=mouseY;
printf("現在按下滑鼠,得到新座標 %d %d\n",x[N-1],y[N-1]);
}
display();
}
int main( int argc, char**argv )
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week05 複習mouse");
glutDisplayFunc(display);///Display顯示
glutMouseFunc(mouse);
glutMainLoop();
}
3-2縮減程式碼讓滑鼠能夠直接畫出圖形。
#include <stdio.h>
#include <GL/glut.h>
int N=0;
int x[1000],y[1000];
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_LINE_LOOP);
for(int i=0;i<N;i++){
glVertex2f((x[i]-150)/150.0,-(y[i]-150)/150.0);
}
glEnd();
glutSwapBuffers();
}
void motion(int mouseX,int mouseY)
{
N++;
x[N-1]=mouseX;
y[N-1]=mouseY;
printf("現在按下滑鼠,得到新座標 %d %d\n",x[N-1],y[N-1]);
display();
}
int main( int argc, char**argv )
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week05 複習mouse");
glutDisplayFunc(display);///Display顯示
glutMotionFunc(motion);
glutMainLoop();
}









沒有留言:
張貼留言