顯示具有 week17 標籤的文章。 顯示所有文章
顯示具有 week17 標籤的文章。 顯示所有文章

2018年1月15日 星期一

Claire 的課堂作業 week17



計算機圖學 Computer Graphics

  1. 主題:期末作品 Q & A
2D Tetris 進度:
從上禮拜獲得老師的Q&A到今天已經大致上完成了整個俄羅斯方塊的操作,
剩下要完成的項目有...
  1. 顯示關卡、分數
  2. 貼圖
  3. 配樂
課堂上在找OpenCV怎麼安裝到Xcode上
大部分找到的資料都是類似這樣:Link
但似乎是改版了,現在直接下載下來只能看到opencv2.framework
但加入外部Library又不給用 ...

進度:暫時用terminal顯示分數


2018年1月14日 星期日

2018年1月13日 星期六

圖學筆記乄Week17

專題製作



解決上周困難: 打光問題




=>打光重點:法向量
                                                     x        y        z        w
GLfloat light_position1[] = {-10.0f, -40.0f, 15.0f, 1.0f };

1.當w為0 是平行光  而xyz值就是此平行光法向量值。
2.若w為1,此光為聚光燈,xyz為燈源位置。
此時,要在一個程式碼:const GLfloat lightDirection[] = {0.0, 0.0, 1.0}; 
上述藍色程式碼是定義其聚光燈方向向量。

glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection);// 聚光灯主轴方向 spot direction
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 0.0);
聚光燈需配合此兩行(寫在main中)

=>平行光與聚光燈差別?

=>平行光:在他的法向量中照射到的物體,其光亮程度都是一樣的 沒有隨遠近而變強變弱。

=>聚光燈:就是想像一個電燈在固定位置,所以其光強弱會與距離有關。

Weiting的計圖第十七週

期末專題:

老師教導如何用p語言建造3D的家

房間

建構素材:
box

建構方式:
運用2維陣列,陣列的rowcolumn表示xy軸,裡面的值表示高度(z),再運用三個for迴圈去顯示這些box

還要加上x, y軸的旋轉才看得)

有打光的格子狀房間




把打光和格子去掉(noStroke())




再打光(lights())就看起來很立體了!




家具的部分用相同原理製作,再加上一點位移(translate())就可以在適當位置

其他貼圖:
壁畫、床單、電視銀幕、地毯等等都是用2D小畫家畫出來的,
再將它們旋轉並移動到適當位置

人物

用一顆打光後的球,並運用鍵盤操控

限制:因為座標系統有旋轉,鍵盤操作上會有點不直觀





Hello World_OpenGL_note_Week17

Week 17


本週進度是讓 畫面看起來立體 並對物體進行打光 加上 音訊插入,進行測試

很遺憾我的電腦目前無法使用,不過這個程式應該沒問題(沒有bug),也有可能是我自己的軟體有點問題;總之,因為修正需要一些時間,因此放上原始碼,讓大家回去試試! 都是範例程式的使用,資料庫中都有喔!

import ddf.minim.*;
Minim minim;
AudioPlayer player, layer;

void setup(){
       size(600,500,P3D);

       minim = new Minim(this);
       player = minim.loadFile("ost.mp3");
                     //註: 音樂名稱.副檔名,要把檔案放進資料夾才行
       layer = minim.loadFile("K.mp3"); //註: 同上
}

int y = 100;

void draw(){

      if(mousePressed){
      lights();
  }

  //lights();

  background(0);

  translate(width / 2, height / 2);

  // Orange point light on the right
  pointLight(100, 100, 255,         // Color
  20, 150, 100);           // Position

  // Blue directional light from the left
  directionalLight(0, 102, 255,           // Color
  1, 0, 1);             // The x-, y-, z-axis direction

  // Yellow spotlight from the front
  spotLight(255, 150, 109,           // Color
  mouseX, 40, 20,            // Position
  0, 0.5, -0.5,           // Direction
  PI / 2, 2);        // Angle, concentration

  // Change height of the camera with mouseY
  camera(mouseX, mouseY, 220.0,             // eyeX, eyeY, eyeZ
  -0.0, -5.0, 0.0,            // centerX, centerY, centerZ
  -10.0, 0.0, 1.0);          // upX, upY, upZ

  fill(100);
  noStroke();
  triangle(100,0,-30,20.5,0,120.5);

  //sphere(50);
  box(90);
  stroke(255);

  line(-100, 0, 0, 100, 0, 0);
  line(0, -100, 0, 0, 100, 0);
  line(0, 0, -100, 0, 0, 100);

  y = y-1;

  if(y < 0 ){
      y = height;
  }

  //建立map函式
  float posx = map(player.position(), 0, player.length(), 0, width);
  stroke(0,200,0);

  float posy = map(layer.position(), 0, player.length(), 0, width);
  line(posx, posy, posx, height);
  // note that if the file is MONO, left.get() and right.get() will return the same value


  //以下就是用音訊輸入當作控制的神奇畫圖機制
  for(int i = 0; i < player.bufferSize() - 1; i++)     
  {
     float x1 = map( i, y, player.bufferSize(), 0, width );
     float x2 = map( i+1, y, player.bufferSize(), 0, width );
     line( x1, 50 + player.left.get(i), x2, 50 + player.left.get(i+1)*50 );
     line( x1, 150 + player.right.get(i)*50, x2, 150 + player.right.get(i+1)*50 );
  }

  for(int i = 0; i < layer.bufferSize() - 1; i++)
  {
     float x1 = map( i, y, layer.bufferSize(), 0, height );
     float x2 = map( i+1, y, layer.bufferSize(), 0, height );
     line( x1, 50 + layer.left.get(i), x2, 50 + layer.left.get(i+1)*50 );
     line( x1, 150 + layer.right.get(i)*50, x2, 150 + layer.right.get(i+1)*50 );
  }

}

void sound(){

}

void keyPressed(){   //鍵盤按鍵控制音訊播放

  if( player.isPlaying() )
     {
         player.pause();
         layer.play();
     }
  else if ( player.position() == player.length() )
     {
        player.rewind();
        player.play();
        layer.pause();
     }
  else
    {
       player.play();
       layer.pause();
    }



}

以上,如有bug,煩請自行改善。 
為何要修改別人的程式? 因為他就在那裏。
程式的進步需要大家的幫助! 
感謝!

week 17 陳泱竹

討論專題
->共筆連結:https://hackmd.io/s/B1j4leggM

2018年1月12日 星期五

Claire's Note #17

WEEK17

Topic:

  1. 期末作品Q&A

A. 期末專題

已具備基礎功能及部分附加功能:
主頁面:鍵盤控制旋轉、轉換視角
介面:計時、開新遊戲鍵、暫停鍵、警告視窗


目標:
1. 以滑鼠控制旋轉
2. 讀檔&存檔
3. 目錄

STEP 1: 滑鼠控制

同上週
若未完成,將下方方塊加上貼圖,標示鍵盤控制功能鍵


STEP 2: 讀檔&存檔

將目前魔術方塊每面的顏色及遊戲時間記錄存檔
開啟遊戲時,檢查是否有上次遊戲儲存進度。若有,則以MessageBox確認是否繼續


STEP 3: 目錄

含有開新遊戲、暫停遊戲、讀檔、存檔等功能




詠銓_Week17_Note

Class: 專題製作

1.承上進度:
    a.上次以完成了點擊發射球以及將由插入球串中

    b.這次一開始先解決消除判定,讓同色且超過3顆相連的球可以消除。

    c.同色回吸

    d.背景及軌道顯示

    e.終點製作

    f.debug

2.卡關部分:
    a.同色回吸,因為球串的前進方式是讓後面的球推著前面的球跑,所以回吸必須找出尾端的
       球。但如果球串是多段的話,不能單純地找鏈結串列的尾端

    b.debug:有各種bug,不一一贅述,比較大的是回吸時的插入判斷問題

3.解決問題:
    a.將球串的鏈結串列分成順序以及相連的雙向串列,順序可以記錄下一顆球,相連的雙向鏈
       結串列只記錄有相連的前後的球,所以要回吸的話只要找到該串球鏈的尾端,再用一開始
       的方法,用後面推前面的球就可以往回吸。

    b.因為軌道的位置判斷中有用到速度,但回吸時速度是反向,所以造成判斷錯誤,所以將軌
       道的位置判斷全部改成用位置來判斷,例如用當時的x座標算出y座標,而不用到速度。

魏建新的第十七週學題單

老師生病沒有上課

在家做專題

2018年1月11日 星期四

楊喻文的學習手札 20180104

week17

製作期末作品

製作作品中~~

這周我製作了聲音的部分,包含波紋與顏色的變化

羅浩倫的學習筆記 Week17

本週沒有上課


專題進度
上週決定在一顆球體上直接貼一張背景圖後,這週開始撰寫程式碼。

基本的概念是是利用老師在week8的時候教的"如何在球體上貼圖(地球)",不過其實是我找不到方法可以讀取舞台的模型,最終成果就是讓MMD模型可以直接在球體中間跳舞,因為如果只是在背景貼一張圖的話,旋轉視角之後就會顯得很突兀,結果圖:



最後的小小心得:有了前幾週花了非常多時間研究如何使用現成的library的經驗,最後在連結opencv的時候就輕鬆了不少,我覺得我這學期最大的收穫應該就是了解了靜態還有動態library的差別吧XD

不過當然在圖學的部分,最近在很多的手遊或是CG、動畫畫面上都有越來越高的比例使用3D模型了,一方面是GPU的進步,另一方面則是人們因應科技進步,眼睛也越來越"貪心"了,在10年以前根本無法想像當今如此複雜多彩的畫面吧,現在還能以人類眼睛都無法跟上的速度變換畫面,這背後極大量的計算量,如果沒有GPU的支援也是很難達成的吧。

最後感謝葉正聖老師這學期的教導,謝謝老師,老師辛苦了~~~~

2018年1月5日 星期五

吳映廷 計算機圖學 week17

本週的主題是製作期末作品。
這週的進度是將基本的HUD(分數,血量)加入
以及敵人的生成.。
以下是分數和血量的部分程式碼。
    public void Score()
    {
        bonusHealthText.SetActive(false);
        stick_man_combo += 1;
        if (stick_man_combo % 5 == 0)
        {
            stick_man_health += 10;
            bonusHealthText.SetActive(true);
            healthText.text = "Health: " + stick_man_health.ToString();
        }
        comboText.text = "Combo: " + stick_man_combo.ToString();
        stick_man_score += stick_man_combo * 10;
        scoreText.text = "Score: " + stick_man_score.ToString();
    }
    public void Hurt()
    {
        stick_man_combo = 0;
        comboText.text = "Combo: " + stick_man_combo.ToString();
        stick_man_health -= 10;
        healthText.text = "Health: " + stick_man_health.ToString();
        if (stick_man_health <= 0)
        {
            gameoverText.SetActive(true);
            gameover = true;
        }

    }

以下是敵人經過時間隨機生成的程式碼。
if (gameover == false)
        {
            System.Random rnd = new System.Random();
            GenTime = rnd.Next(1, 50);
            GenTime2 = rnd.Next(1, 50);
        }
        if (enemyGenCounter > GenTime)
        {
            GameObject.Instantiate(enemy);
            enemyGenCounter = 0;
        }
        if (enemyGenCounter > GenTime2)
        {
            GameObject.Instantiate(enemy_R);
            enemyGenCounter2 = 0;
        }