2021年3月31日 星期三

本人發言不代表本人立場 week06

 Spirograph 萬花尺 介紹


1. T-R-T 轉動

  • 畫轉動的方塊
    • glutSolidCube 畫方塊
    • angle++改變角度
    • glutIdleFunc 空閒時繼續畫
 #include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotated(angle,0,0,1);
        glutSolidCube(1);
    glPopMatrix();
    glutSwapBuffers();
    angle+=0.1;
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("ME");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();
}

    執行結果 :




  • 改變大小、顏色
    • Scale改變大小
    • Color改變顏色

#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotated(angle,0,0,1);
        glScalef(0.5,0.1,0.1);
        glColor3f(0,0,1);
        glutSolidCube(1);
    glPopMatrix();
    glutSwapBuffers();
    angle+=0.1;
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("ME");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();
}  

執行結果:



  • 改變轉動中心
    • Translate 改變轉動的中心
#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotated(angle,0,0,1);
        glTranslatef(0.25,0,0);
        glScalef(0.5,0.1,0.1);
        glColor3f(0,0,1);
        glutSolidCube(1);
    glPopMatrix();
    glutSwapBuffers();
    angle+=0.1;
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("ME");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();
}

     執行結果:



  • 改變轉動中心+位移
    • 紫字: 把畫方塊的程式碼放到hand()裡再呼叫他
    • 橘字: 再Rotate上面增加Translate改變方塊位置

#include <GL/glut.h>
float angle=0;
void hand()
{
    glPushMatrix();
        glScalef(0.5,0.1,0.1);
        glColor3f(0,0,1);
        glutSolidCube(1);
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(0.5,0.5,0);
        glRotated(angle,0,0,1);
        glTranslatef(0.25,0,0);
        hand();
    glPopMatrix();
    glutSwapBuffers();
    angle+=0.1;
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("ME");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();
}

執行結果: 




2.階層性轉動

  • 增加一個旋轉方塊
    • 藍字: 改變方塊大小讓旋轉方塊不超過界線,旋轉中心位置也要改變
    • 橘字: 增加一個旋轉方塊,讓旋轉中心在第一個方塊的末端

#include <GL/glut.h>
float angle=0;
void hand()
{
    glPushMatrix();
        glScalef(0.5,0.1,0.1);
        glColor3f(0,0,1);
        glutSolidCube(1);
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1);glutSolidCube(0.5);
    glPushMatrix();
        glTranslatef(0.25,0.25,0);
        glRotated(angle,0,0,1);
        glTranslatef(0.25,0,0);
        hand();
        glPushMatrix();
        glTranslatef(0.25,0,0);
        glRotated(angle,0,0,1);
        glTranslatef(0.25,0,0);
        hand();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("ME");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();
}

執行結果:




  • 增加左半邊的部分
    • 藍字: 記得改負號
    • 紅字: 複製右半邊的程式碼
#include <GL/glut.h>
float angle=0;
void hand()
{
    glPushMatrix();
        glScalef(0.5,0.1,0.1);
        glColor3f(0,0,1);
        glutSolidCube(1);
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1);glutSolidCube(0.5);
    glPushMatrix();
        glTranslatef(0.25,0.25,0);
        glRotated(angle,0,0,1);
        glTranslatef(0.25,0,0);
        hand();
        glPushMatrix();
            glTranslatef(0.25,0,0);
            glRotated(angle,0,0,1);
            glTranslatef(0.25,0,0);
        hand();
        glPopMatrix();
    glPopMatrix(); 
 
    glPushMatrix();
        glTranslatef(-0.25,0.25,0);
        glRotated(-angle,0,0,1);
        glTranslatef(-0.25,0,0);
        hand();
        glPushMatrix();
            glTranslatef(-0.25,0,0);
            glRotated(-angle,0,0,1);
            glTranslatef(-0.25,0,0);
            hand();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("ME");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();
}

執行結果:






沒有留言:

張貼留言

距地表面160 Week11

 #include "glm.h" GLMmodel* pmodel = NULL; void drawmodel(void) {     if (!pmodel) { pmodel = glmReadOBJ("data/porsche.obj...