2014年6月29日 星期日

第五週進度

第五週進度
去壹傳媒之前的資料查找,先預習什麼事MoCap和Light StageX,現場將可以看到實務(開心

1.MoCap


2.Light StageX

第六週進度

第六週進度
壹傳媒參訪心得
銘傳大學-資訊傳播工程學系 魏正
當我被問到對壹傳媒的印象時,我腦海裡浮現出壹週刊、蘋果日報,還有壹電視新聞台,與我生活中對其它媒體公司的印象並沒有太大差異,我答覆對此印象是一家傳統的媒體公司。但在聽完壹傳媒的主任對該公司的介紹後,徹底改變了我對媒體公司的刻板印象。先介紹一下壹傳媒的背景,壹傳媒是一家來自香港的公司,老闆黎智英是一位有企圖心的商人,起初來台時,以羶色腥的手法發行壹週刊,並隨著便利超商的崛起,與其簽約並以低價在各個門市販售,迅速在台攻佔市場,讓大眾在生活中習慣去閱覽壹傳媒發行的報章雜誌。在達成建立品牌的目的後,黎老闆與旗下團隊依然不斷在尋找客群的需求,並將壹週刊劃分為明星八卦與政壇內幕的兩本刊物,明星八卦是一些內文吸引群眾目光的刊物,但政壇內幕這本就比較特別,專門揭露政府弊案,行使公民的第四權。
         最衝擊我對壹傳媒印象的是蘋果動畫的部門,我從沒想過媒體公司會融入這麼多的科技元素。蘋果動畫部門大部分產品為新聞的短篇動畫,其動畫的大致製作流程為確認新聞部的劇本、腳本製作、繪畫草圖、動畫部門進行會議、動作捕捉、建立模型與場景、加入特效與音效。為了能供應大量的新聞劇本進行動畫化,這麼多的流程實際上只擁有一小時三十分鐘。
壹傳媒為提高動畫製作的效率,縮短製作上的時間,在動畫部門投入了許多如MoCapLight Stage等前衛的科技。在動畫部門的會議室裡,主任特別強調了會議室裡的電腦數量與桌數,一共四張桌子,每張桌上有三台電腦,也就是說在開會時一共會有四組人馬,分別將四個動畫案子進行討論與分工,動畫部門的最高效能是在同時間裡平行製作四部動畫。
在觀摩動作捕捉Motion Capture的流程時,我們來到一間四周掛滿幾十支紅外線改應器的房間,地上貼有一圈白色的膠帶標記儀器感測的範圍,專業的戲組人員穿上外層帶有十來顆具有燈源的感測器,外表如潛水裝的緊身衣,演員與導演和操作儀器的工程師討論後,便開始錄製各個橋段的動作,在開始錄製與結束時,演員都會擺出”T”字型的姿勢,讓儀器進行骨架校正。
在錄製完成之後,檔案送到3D模組的部門,該部門人員會將骨架的節點套入到3D模型中,並微調模型的動作,再放入背景,之後的流程就與一般的動畫製作較沒有差異。在人物模型的表情上,壹傳媒有特別的一個研究部門,他們位在一間室內黑色調的工作室,裡面陳列許多3D列印的臉部作品,並在空地上搭建Light Stage儀器,還有幾台加裝風扇的Kinect,工作室的人員向我們介紹這台Light Stage是由國外引進材料,送入這裡後才進行搭建與測試,外觀類似空心球體,由許多的金屬長條與線路所組成,操作時,model需在臉部上白底,並畫上許多黑點,讓儀器在測量時能鎖定特徵點,完妝後,model進入到儀器內部,由周圍的感測器掃描後,將錄製的臉部表情與3D模型的人物表情進行特徵點綁定,讓動畫模型的人物表情與真人表情一模一樣。此方法與許多國外的動畫公司進行合作過,精緻但較為費時,這對於蘋果動畫追求高產出的流程來說,得使用一款類似Face Reconstruction的軟體,使用一張擷取過的正面臉部照片,塑造出一個頭部模型,然後放到一個體態已設定好的身體模型上,便製作好一個人物模型,可套入動作捕捉的骨架進行動畫化。
在這次的參訪後,震撼得知媒體公司在研究、製作動畫,顛覆了我的既有印象,這讓我大開眼界,使我了解到壹傳媒對於動畫事業的傾力,除新聞方面的案子動畫化之外,動畫部門依然在研究更新穎的技術,並與國外許多公司進行合作,讓我對台灣的動畫產業致敬,並期許自己在研究體感與圖學領域後,也能學以致用為台灣的動畫產業盡一份心力。

第七週進度

第七週進度
思索期中作品IDEA
想利用leap motion製作出類似皮影戲的互動作品,利用兩根長筷來操控螢幕上的人偶,讓人偶上半身隨筷子移動,下半身隨之晃動,並能操控人偶的手部,讓其能做出揮手、武器的動作,並可以切換背景畫面與人物,在迅速的切換中,達到無接縫的表演。

第八週進度

第八週進度
其中作品程式碼
import de.voidplus.leapmotion.*;
LeapMotion leap;

PVector leftTool_position, rightTool_position;
PImage imgB, imgH, imgD, back;
float angleH, angleD;
float[] px = new float[10];
void setup()
{
  size(800, 560, P3D);
  leap = new LeapMotion(this);
  imageMode(CENTER);
  imgB = loadImage("up.png");
  imgH = loadImage("pair.png");
  imgD = loadImage("down.png");
  back = loadImage("back1.jpg");
}
void draw()
{
  background(back);
  int fps = leap.getFrameRate();
  for (Hand hand : leap.getHands())
  {
    Tool leftTool = hand.getLeftTool();
    leftTool_position = leftTool.getPosition();
    Tool rightTool = hand.getRightTool();
    rightTool_position = rightTool.getPosition();
    angleH = atan((rightTool_position.y-leftTool_position.y)/(rightTool_position.x-leftTool_position.x))*180/PI;

    for (int i=8;i>=0;i--)//update stack
      px[i+1]=px[i];
    px[0]=leftTool_position.x;

    pushMatrix();//up
    translate(leftTool_position.x, leftTool_position.y);
    image(imgB, 0, 0);
    pushMatrix();//hand
    translate(0, 0);
    rotate(radians(angleH-90));
    translate(58, 58.5);
    image(imgH, 0, 0);
    popMatrix();
    pushMatrix();//down
    translate(-5, 90);
    if (px[9]!=0)
      angleD = atan((leftTool_position.x-px[9])/(leftTool_position.y-leftTool_position.y+280))*180/PI;
    rotate(radians(angleD*1.5));
    translate(-14, 75);
    image(imgD, 0, 0);
    popMatrix();
    popMatrix();
  }
  if (keyPressed)
  {
    if (key == 'q' || key == 'Q')
    {
      back = loadImage("back1.jpg");
    }
    if (key == 'w' || key == 'W')
    {
      back = loadImage("back2.jpg");
    }
    if (key == 'a' || key == 'A')
    {
      imgB = loadImage("up.png");
      imgH = loadImage("pair.png");
      imgD = loadImage("down.png");
    }
    if (key == 's' || key == 'S')
    {
      imgB = loadImage("up2.png");
      imgH = loadImage("pair2.png");
      imgD = loadImage("down2.png");
    }
  }
}

void leapOnInit() {
  // println("Leap Motion Init");
}
void leapOnConnect() {
  // println("Leap Motion Connect");
}
void leapOnFrame() {
  // println("Leap Motion Frame");
}
void leapOnDisconnect() {
  // println("Leap Motion Disconnect");
}
void leapOnExit() {
  // println("Leap Motion Exit");
}

第十一週進度

第十一週進度

FAAST的介紹

剛剛想嘗試,可是發現FAAST官網好像壞了= =
只好自己使用模擬鍵盤輸入來嘗試,程式碼如下
[DllImport("User32.dll", EntryPoint = "keybd_event")]
        public static extern void keybd_event(
            byte bVk,
            byte bScan,
            int dwFlags,
            int dwExtraInfo
        );
keybd_event(33, 0, 0x2, 0);
keybd_event(34, 0, 0x2, 0);

第十二週進度

第十二週進度
Kinect SDK 1.8 範例

all sample

audio basic

background removal

rgb

depth


第十三週進度

第十三週進度
1.下載/安裝kinect SDK1.8
2.下載 simpleOpeNI
簡易的深度值與彩色值

import SimpleOpenNI.*;
SimpleOpenNI openni;
void setup(){
  size(640+640, 480);
  openni = new SimpleOpenNI(this); 
  openni.enableDepth();
  openni.enableRGB(); 
}
void draw(){
  openni.update();
  image(openni.depthImage(), 0,0);
  image(openni.rgbImage(), 640, 0);
}