1. 3dcg.org.....Transformation.exe...
下方右鍵,可變自轉、公轉
2-1.按keyboard,畫面顯示座標
#include <GL/glut.h>
#include <stdio.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,0);
glutSolidTeapot(0.5);
glutSwapBuffers();
}
void keyboard( unsigned char key,int x,int y )
{
printf("你按下了 %c 在 %d %d 座標\n",key,x,y);
}
int main(int argc,char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week keyboard");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
2-2. 把上週、上上週的加進去,但中間空白
#include <GL/glut.h>
#include <stdio.h>
float x=0,y=0,z=0;
int oldX=0,oldY=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef((x-150)/150.0 , -(y-150)/150.0, z);
glColor3f(1,1,0);
glutSolidTeapot(0.5);
glPopMatrix();
glutSwapBuffers();
}
void keyboard( unsigned char key,int mouseX,int mouseY )
{
}
void mouse(int button , int state , int mouseX , int mouseY)
{
}
void motion(int mouseX ,int mouseY)///按住滑鼠進行移動,會有瞬移情況
{
x+=(mouseX-oldX) , y+=(mouseY-oldY);
oldX=mouseX , oldY=mouseY;
display();
}
int main(int argc,char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week keyboard");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);///this week
glutMouseFunc(mouse);///last last week
glutMotionFunc(motion);///last week
glutMainLoop();
}
2-4 加入mouse使其正常移動,並新增背景顏色

#include <GL/glut.h>
#include <stdio.h>
float x=150,y=150,z=0;
int oldX=0,oldY=0;
void display()
{
glClearColor( 0.3 , 0.4 , 0.6 , 1);///R、G、B、A,A為半透明,目前關閉
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef((x-150)/150.0 , -(y-150)/150.0, z);
glColor3f(1,1,0);
glutSolidTeapot(0.5);
glPopMatrix();
glutSwapBuffers();
}
void keyboard( unsigned char key,int mouseX,int mouseY )
{
}
void mouse(int button , int state , int mouseX , int mouseY)
{
oldX=mouseX,oldY=mouseY;///解決"瞬移"
}
void motion(int mouseX ,int mouseY)///會有瞬移情況
{
x+=(mouseX-oldX) , y+=(mouseY-oldY);
oldX=mouseX , oldY=mouseY;
display();
}
int main(int argc,char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week keyboard");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);///this week
glutMouseFunc(mouse);///last last week
glutMotionFunc(motion);///last week
glutMainLoop();
}
2-5 原地放大縮小

#include <GL/glut.h>
#include <stdio.h>
float x=150,y=150,z=0,scale=1.0;
int oldX=0,oldY=0;
void display()
{
glClearColor( 0.1 , 0.7 , 0.5 , 1);///R、G、B、A,A為半透明,目前關閉
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef((x-150)/150.0 , -(y-150)/150.0, z);
glScalef(scale , scale , scale);///縮放為scale倍
glColor3f(1,1,0);
glutSolidTeapot(0.5);
glPopMatrix();
glutSwapBuffers();
}
void keyboard( unsigned char key,int mouseX,int mouseY )
{
}
void mouse(int button , int state , int mouseX , int mouseY)
{
oldX=mouseX,oldY=mouseY;///解決"瞬移"
}
void motion(int mouseX ,int mouseY)///會有瞬移情況
{
if( mouseX-oldX > 0) scale*=1.1;///放大縮小
if( mouseX-oldX < 0) scale*=0.9;
(此行刪除,使其固定原地)
oldX=mouseX , oldY=mouseY;
display();
}
int main(int argc,char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week keyboard");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);///this week
glutMouseFunc(mouse);///last last week
glutMotionFunc(motion);///last week
glutMainLoop();
}
沒有留言:
張貼留言