2020年3月24日 星期二

week04(2020/3/24)紀錄

今天進度:Transformation,移動,縮放,旋轉,矩陣
之前的課程都是二維(x,y),現在多了z軸,變成三維
glRotate(旋轉角度,X,Y,Z)
正值:順時鐘 負值:逆時鐘
XYZ負值會反轉上面的規則

先寫程式看看
預設程式是自動旋轉,我們改成滑鼠操控
先float mya(我的角度)
用glutMotionFunc()來開啟滑鼠程式
自己 void getmya(int x,int y) 來抓你的x,再將x套用到mya
glRotated(a,0,0,1); 中的a是旋轉角度,用mya來替換(const double a = mya;)
用茶壺程式自己寫
#include<GL/glut.h>
float mya=0;
void a()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glRotated(mya,0,0,1);
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void m(int x,int y)
{
    mya=x;
    a();
}
int main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week03");
    glutMotionFunc(m);
    glutDisplayFunc(a);
    glutMainLoop();
}
 但是他的轉動每次都會重新指定x,不會根據滑鼠現在的位子移動
所以我們要優化
#include<GL/glut.h>
float mya=0;
void a()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glRotated(mya,0,0,1);
    glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
int nowx=0;
void mouse(int b,int s,int x,int y)
{
    if(s==GLUT_DOWN) nowx=x;
}
void m(int oldx,int y)
{
    mya+=(oldx-nowx);
    nowx=oldx;
    a();
}
int main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week03");
    glutMotionFunc(m);
    glutMouseFunc(mouse);
    glutDisplayFunc(a);
    glutMainLoop();
}
加入滑鼠程式mouse用來記錄滑鼠當前的x,將它記錄做nowx,而Motion函式m中的x作為oldx
每次轉動oldx-nowx,並將nowx的值套在oldx中。
原理

沒有留言:

張貼留言