2016年11月18日 星期五

Week10 施柏豪上課筆記

本日課程綱要:

1.簡單複習上周LeapMotion接金幣
2.陣列、存檔、成績排名與計算
3.剪刀石頭布的猜拳判斷(下周再學)
4.用陣列做"3D畫畫過程重播"示範(下周再學)

上課方向;

引起動機:
駭客任務電影場景中有經典的躲避子彈殘影畫面,老師以此為基礎進一步介紹希望能在LeapMotion上抓到手指頭移動的軌跡。

實作LeapMotion結合陣列之效果:
以 ArrayList 功能建立陣列容器,可以使用 add() 函式增加 ArrayList 中的元素 (element),而這些元素是具有Vector性質的變數,再引入LeapMotion的Library,LeapMotion裝置能偵測每一個手指位置是3D空間中的座標,需要5個儲存陣列去裝5隻手指移動的軌跡,五隻手指頭就建立五個PVector 類別的ArrayList,ArrayList<PVector>history; 程式效果如圖:


因為陣列是程式語言中的物件,以new指令產生物件,history= new ArrayList<PVector>(0);

最後應用電腦圖學的3D矩陣換算方式,將眾多軌跡球的中心座標移動到原點,旋轉之後再移動回畫面中間,整體視覺呈現出一種非常立體繽紛的3D模型世界效果。

實作程式碼:
import de.voidplus.leapmotion.*;

LeapMotion leap;

PVector pt;

ArrayList<PVector>history;//many point vector

ArrayList<PVector>history2;

ArrayList<PVector>history3;

ArrayList<PVector>history4;

ArrayList<PVector>history5;



void setup(){

  size(900,600,P3D); // 3D function

  leap = new LeapMotion(this);

  pt=new PVector(width/2,height/2);

  history= new ArrayList<PVector>(0);

  history2= new ArrayList<PVector>(0);

  history3= new ArrayList<PVector>(0);

  history4= new ArrayList<PVector>(0);

  history5= new ArrayList<PVector>(0);

}



void myBall(float x,float y,float z){

  pushMatrix();

  translate(x,y,z*10);

  sphere(10);

  popMatrix();

}

void draw(){

  background(255);

  lights();

  translate(width/2,height/2);

  rotateY(radians(frameCount));

  translate(-width/2,-height/2);

  noStroke();

  for(PVector nowPt : history){

    fill(255,0,0); myBall(nowPt.x,nowPt.y,nowPt.z);

  }

  for(PVector nowPt : history2){

    fill(255,255,0); myBall(nowPt.x,nowPt.y,nowPt.z);

  }

  for(PVector nowPt : history3){

    fill(0,255,0); myBall(nowPt.x,nowPt.y,nowPt.z);

  }

  for(PVector nowPt : history4){

    fill(0,0,255); myBall(nowPt.x,nowPt.y,nowPt.z);

  }

  for(PVector nowPt : history5){

    fill(255,0,255); myBall(nowPt.x,nowPt.y,nowPt.z);

  }



  for(Hand hand:leap.getHands()){

    //PVector pos = hand.getPosition();

    //history.add(new PVector(pos.x,pos.y));

    hand.draw();

    Finger finger = hand.getThumb();

    Finger finger2 = hand.getIndexFinger();

    Finger finger3 = hand.getMiddleFinger();

    Finger finger4 = hand.getRingFinger();

    Finger finger5 = hand.getPinkyFinger();

    PVector pos;

    pos=finger.getPosition();

    history.add(new PVector(pos.x,pos.y,pos.z));

    pos = finger2.getPosition();

    history2.add(new PVector(pos.x,pos.y,pos.z));

    pos = finger3.getPosition();

    history3.add(new PVector(pos.x,pos.y,pos.z));

    pos = finger4.getPosition();

    history4.add(new PVector(pos.x,pos.y,pos.z));

    pos = finger5.getPosition();

    history5.add(new PVector(pos.x,pos.y,pos.z));

   

  }

}

void mouseMoved(){

  history.add(new PVector(mouseX,mouseY));

}

沒有留言:

張貼留言