2021年6月2日 星期三

築損 Week15

 第0部份

前置作業

printf 直接顯示在執行視窗

fprintf 能存在檔案中

修蓋cbp檔

將word dir=".";

檔案就會存到專案中

能讀取檔案中文字

執行結果







-----------------------------------------------------------------------------------------------------------------------------

第1部份

TRT

先讓手臂轉動

程式碼

 glPushMatrix();

            glTranslatef(-0.3,0,0);///掛在正確的地方

            glRotatef(angle,0,0,1);///旋轉

            glTranslatef(-0.3,0,0);///旋轉中心放到畫面中心

            glutSolidTeapot( 0.3 );///左手臂

glPopMatrix();

再加上身體跟手肘

程式碼

    glPushMatrix();

        glutSolidTeapot( 0.3 );///身體

        glPushMatrix();

            glTranslatef(-0.3,0,0);///掛在正確的地方

            glRotatef(angle,0,0,1);///旋轉

            glTranslatef(-0.3,0,0);///旋轉中心放到畫面中心

            glutSolidTeapot( 0.3 );///左手臂

            glPushMatrix();

                glTranslatef(-0.3,0,0);///掛在正確的地方

                glRotatef(angle,0,0,1);///旋轉

                glTranslatef(-0.3,0,0);///旋轉中心放到畫面中心

                glutSolidTeapot( 0.3 );///左手肘

            glPopMatrix();

        glPopMatrix();

    glPopMatrix();

接著增加鍵盤控制手臂手肘

先把angle改成angle[20]={};

新增angleID=0;

把timer裡 angle改成 angle[angleID]

新增keyboardc函式

程式碼

void timer(int t)

{

    glutTimerFunc(30,timer,t+1);

    angle[angleID]+=diff;

    if(angle[angleID]>90) diff=-2;

    if(angle[angleID]<0) diff=+2;

    glutPostRedisplay();

}

void keyboard(unsigned char key,int x,int y)

{

    if(key=='0')angleID=0;

    if(key=='1')angleID=1;

}

按1或0能讓手臂或手肘停止

複製

右半邊就出來了

總程式碼

#include <stdio.h>///可割可棄 #include <GL/glut.h> float angle[20]={},diff=2; int angleID=0; void timer(int t) { glutTimerFunc(30,timer,t+1); angle[angleID]+=diff; if(angle[angleID]>90) diff=-2; if(angle[angleID]<0) diff=+2; glutPostRedisplay(); } void keyboard(unsigned char key,int x,int y) { if(key=='0')angleID=0; if(key=='1')angleID=1; if(key=='2')angleID=2; if(key=='3')angleID=3; } void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glutSolidTeapot( 0.3 );///身體 glPushMatrix();///左半邊 glTranslatef(-0.3,0,0);///掛在正確的地方 glRotatef(angle[0],0,0,1);///旋轉 glTranslatef(-0.3,0,0);///旋轉中心放到畫面中心 glutSolidTeapot( 0.3 );///左手臂 glPushMatrix(); glTranslatef(-0.3,0,0);///掛在正確的地方 glRotatef(angle[1],0,0,1);///旋轉 glTranslatef(-0.3,0,0);///旋轉中心放到畫面中心 glutSolidTeapot( 0.3 );///左手肘 glPopMatrix(); glPopMatrix(); glPushMatrix();///右半邊 glTranslatef(0.3,0,0);///掛在正確的地方 glRotatef(-angle[2],0,0,1);///旋轉 glTranslatef(0.3,0,0);///旋轉中心放到畫面中心 glutSolidTeapot( 0.3 );///右手臂 glPushMatrix(); glTranslatef(0.3,0,0);///掛在正確的地方 glRotatef(-angle[3],0,0,1);///旋轉 glTranslatef(0.3,0,0);///旋轉中心放到畫面中心 glutSolidTeapot( 0.3 );///右手肘 glPopMatrix(); glPopMatrix(); glPopMatrix(); glutSwapBuffers(); } int main( int argc, char ** argv ) { glutInit( &argc, argv ); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("week15 file"); glutKeyboardFunc(keyboard); glutTimerFunc(0,timer,0); glutDisplayFunc(display); glutMainLoop(); }

























執行結果










-----------------------------------------------------------------------------------------------------------------------------

第0部份


執行結果


-----------------------------------------------------------------------------------------------------------------------------

第0部份


執行結果


-----------------------------------------------------------------------------------------------------------------------------

沒有留言:

張貼留言

距地表面160 Week11

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