2016年6月27日 星期一

week17 期末作品

影覑網址:
https://youtu.be/o36J5ixLccI

week11

首先是載Kinect SDK和Toolkit接下來是載MeshLab再來是做利用kinect scan 然後做踢足球的概念,
所以圖中會出現圓圈
利用Toolkit, Kinect fusion color basics-D2D        

踢球

程式碼:
import SimpleOpenNI.*;
SimpleOpenNI  openni;
void setup(){
  size(600,400);
  openni = new SimpleOpenNI(this);
  openni.enableRGB();
  openni.enableDepth();
  openni.enableUser();
}
  float Xpos(PVector pos){
    return width/2 + pos.x*500/pos.z;
  }
  float Ypos(PVector pos){
  return height/2 - pos.y*500/pos.z;
  }
void draw(){
  openni.update();
  image(openni.userImage(),0,0, 600,400);
  for(int userId : openni.getUsers()){
    PVector pos = new PVector(0,0,0);
    float cofidence;
    cofidence = openni.getJointPositionSkeleton(
      userId,SimpleOpenNI.SKEL_LEFT_FOOT,pos);
    ellipse(Xpos(pos),Ypos(pos), 50,50);
    println(pos);
  }
}  
void onNewUser(SimpleOpenNI openni,int userId){
    openni.startTrackingSkeleton(userId);
  }

week05

畫會動的眼睛眼球

程式碼:


void setup(){
  size(120,120);
}
void draw(){
  float t =frameCount/180.0*PI;
  background(0);
  fill(255);
  ellipse(40,50, 33,33);
  ellipse(120-40,50,33,33);
  fill(0);
  ellipse(40+15*cos(t),50+15*sin(t),5,5);
  ellipse(123-40+15*cos(t),50+15*sin(t),5,5);
}

用滑鼠控制眼球 做出鬥雞眼
程式碼:



void setup(){
  size(120,120);
}
void draw(){
  //float t =frameCount/180.0*PI;
  background(0);
  fill(255);
  ellipse(40,50, 33,33);
  ellipse(120-40,50,33,33);
  fill(0);
  float t=atan2(mouseY-50,mouseX-45);
  ellipse(40+15*cos(t),50+15*sin(t),5,5);
  t=atan2(mouseY-50,mouseX-(120-40));
  ellipse(123-40+15*cos(t),50+15*sin(t),5,5);

雙螺旋轉動
程式碼:

void setup(){
  size(600,600);
}
void draw(){
  //float t =frameCount/180.0*PI;
  background(0);
  float t=frameCount/100.0;
  for(float f=0; f<PI; f+=0.1){
    rect(200+150*cos(f+t),f*100,30,30);
    rect(200+150*cos(f+t+PI),f*100,30,30);
  }
}  

01160351 游承諭 04

發射子彈的砲台

程式碼如下:
PVector []bullet_dir=new PVector[10];
int bulletNow=0;
LeapMotion leap;
void setup(){
  size(600,400,P3D);
  leap=new LeapMotion(this);
  for(int i=0;i<10;i++){
    bullet[i]=new PVector(0,0,0);
    bullet_dir[i]=new PVector(0,0,0);
  }
}
void draw(){
  background(255);
  for(Hand hand:leap.getHands()){
    Finger finger_index=hand.getIndexFinger();
    finger_index.draw();
    pos=finger_index.getPosition();
    dir=finger_index.getDirection();
  }
 lights();
 fill(255,0,0);
 translate(width/2,height/2);
 pushMatrix();
    for(int i=0;i<10;i++){
      if(dir!=null) translate(dir.x*10*i,dir.y*10*i,dir.z*10*i);
      sphere(40);
    }
    popMatrix();
    pushMatrix();
      fill(0,0,255);
      for(int i=0;i<10;i++){
        pushMatrix();
          translate(bullet[i].x,bullet[i].y,bullet[i].z);
          sphere(41);
          bullet[i].x+=bullet_dir[i].x;
          bullet[i].y+=bullet_dir[i].y;
          bullet[i].z+=bullet_dir[i].z;
        popMatrix();
      }
      popMatrix();
}
void keyPressed(){
bullet[bulletNow].x=0; bullet[bulletNow].y=0; bullet[bulletNow].z=0;
  bullet_dir[bulletNow].x=dir.x*5;
  bullet_dir[bulletNow].y=dir.y*5;
  bullet_dir[bulletNow].z=dir.z*5;
  bulletNow++;
if(bulletNow>=10){
    bulletNow=0;
  }
}

打擊遊戲 當物體跟物體碰撞後會加分etc.

程式碼如下:
import de.voidplus.leapmotion.*;
LeapMotion leap;
PVector pos, dir, ball;
void setup() {
  size(600,400,P3D);
  leap = new LeapMotion(this);
  pos = new PVector(300,200,0); ball =new PVector(0,0,0);
  
}
void draw() {
  ball.x+=2; ball.y+=2;
  for(Hand hand : leap.getHands()){
    pos = hand.getPosition();
  }
  background(255);
  fill(255,0,0);
  pushMatrix();
  translate(pos.x,pos.y,pos.z);
  box(30,30,30);
  popMatrix();
  pushMatrix();
  translate(ball.x,ball.y);
  sphere(30);
  if(dist(ball.x, ball.y, pos.x, pos.y)<30) background(255,0,0);
  popMatrix();
}

2016年6月20日 星期一

期末作業

https://youtu.be/NDE8OC15CLs  part1
https://youtu.be/h1QJW_3Awoc part2

Week17_期末作品_02160421黃志楷


02162411_劉永健_期末作品展示


使用Unity 結合Kinect 製作的體感互動遊戲——Tank Battle  
DEMO

指導老師:葉正聖

學生:劉永健  沈泓宇

敵人的坦克摧毀了我們的城市,是時候化身超級英雄拯救世界

了!

在遊戲中,玩家化身超級英雄,體感操作,手握正義之劍,擊

退敵人的坦克,隨機觸發必殺技發射從天而降的衝擊波,助你

一臂之力!

2016年6月16日 星期四

week17_期末作品展示

https://youtu.be/sjebkC7z774


week17_期末作品展示_呂登祐

作品展示:


組員: 陳威志,鄧安倫,呂登祐
開發環境: kinect 和 Processing 2.2 

Week18 02132412_沈泓宇

期末作品開發過程:

遊戲中一些常見效果的實現:

敵人頭上有浮動的血條:


這種效果在很多遊戲里都能看得到,只要是打怪的遊戲,一般都會有這種效果。血條能做到跟隨敵人一起移動,始終保持在敵人頭上,受到傷害時血量會減少。

實現方式:

建一個新的canvas,渲染模式選擇為World Space,也就是一個3D的canvas,裡面的UI都是以3D的形式渲染出來,與普通的顯示在熒幕的2D介面不同。


Start方法里添加程式碼:

GameObject LifePrefab = (GameObject)Resources.Load ("LifeBar");
GameObject LifeBarObject = (GameObject)Instantiate (LifePrefab);
TankTransform = LifeBarObject.transform;
TankTransform.SetParent(GameObjectManager.Canvas3D.transform);
TankTransform.localScale = new Vector3 (0.06f,0.06f,0.06f);
TankLifeBar = LifeBarObject.GetComponent<Slider>();

然後在Update方法里添加程式碼:

Vector3 LifeBarPosition = this.transform.position;
LifeBarPosition.y += 8f;
TankTransform.transform.position = LifeBarPosition;
TankTransform.transform.eulerAngles = CameraManager.ThirdPersonCamera.transform.eulerAngles;

最後一行程式碼要根據具體需求來寫,看要控制血條的euler角度面向哪一個攝影機。

最後實現血條減血的效果就比較簡單:

LifeBar.value -= AttackValue;//血條的值減去傷害值

Week17 02132412_沈泓宇

期末作品開發過程:

一些細節問題:

關於Unity的UGUI部分的細節,這種介面算是比較新的,上手不難,使用上挺方便,不過還是有一些細節問題要注意,比如多個canvas(畫布)在同一個場景的渲染問題,在主介面中有一個按鈕,如果切換到角色介面,滑鼠移到主界面按鈕那個對應的位置點擊(當然是看不到這個按鈕的,因為已經切換了畫布),就會發現仍然有觸發點擊的事件。

這問題的概念有點複雜,而且不容易發現,我也是之前在一次偶然的情況,利用排除法排除了其它多個可能性,才發現問題出在這裡。簡單來說就像PS中圖層的概念,一個圖層中有一個按鈕,無論上面疊加了多少個圖層,這個按鈕仍然可以按得到,圖層並不妨礙點擊。所以在Unity中要避免這種問題,最好就是隱藏掉其它的canvas,需要顯示哪一個就顯示哪一個,其它的都隱藏,不然就有可能會發生類似這種情況:滑鼠在一個空白的地方點了一下,結果整個遊戲退出了,原因就是在當前的canvas滑鼠沒有點到任何按鈕,但在主介面中滑鼠游標的這個位置剛好是移到了“結束”按鈕上,這樣就會造成了誤觸。

做好隱藏canvas的操作後,設定一下canvas的渲染優先順序也是有必要的:



這個參數可以設定canvas的渲染優先順序,數值越大越會被優先渲染,

Week16 02132412_沈泓宇

序言

我們在努力P圖中...


開發人員的畫面沒什麼特別的,只要在PS里設計個字體,做成一張圖片放到Unity里就行了。


在場景中找到適當位置,設計敵人生成點:


在這個遊戲中,坦克是源源不絕的,永遠打不完,打敗了又會從敵人生成點復活,因為生成點是在3D的世界里,不存在自適應問題,所以坐標點可以寫死:

五個敵人生成點:

1(413.6,5.75,211.8)

2(304.56,5.75,124.4)

3(221.2,5.75,246.6)

4(211.81,7.79,349.93)

5(474,-3.3,460)

之前有考慮過把坦克做成Prefab的形式,在需要生成敵人的時候用實作Prefab的形式生成GameObject,被打敗后直接銷毀物件,但之後找了相關資料,了解到頻繁的生成和銷毀是很耗內存的,較好的方法是預先複製若干個坦克Prefab,被打敗后轉移到敵人生成點的坐標,復位速度、攻擊力等所有參數。

Week17 0616期末作品Demo 高健智 莊鎧旭


week07

Week 07 葉正聖老師示範

1. 下週請同學展示期中作品 (並票選, 做得最好的同學, 送 Leap Motion 一台)
2. 實作問題回覆


WEEK17

期末作業~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


UNITY




https://www.youtube.com/watch?v=AhitUUo4nVk

week15

下下個禮拜就要期末作品展示了
下個禮拜又是端午連假
所以這次是期末作品展示前最後一次上課了
==========================================
Question: 請問 FAAST 為什麼模擬出來的 mouse 移動事件, 在Unity裡面沒有反應?
Answer: google: unity faast mouse 可以找到以下的討論
http://forum.unity3d.com/threads/a-question-about-first-person-control.273230/
".... However, when I use Kinect that connect with Faast which control mouse pointer normally, the first person controller camera angle have not changed ..."
可見, 不只你遇到問題, 國外也有人遇到一樣的問題, 而且沒有人給回答。
我推測, FAAST 做的滑鼠模擬層級較高, 但是 Unity會去得到更低的硬體資訊, 所以騙不了Unity。
解決方案, 是不要用 FAAST, 或是用其他來取代。

==========================================
Question: 為什麼捉別人寫的 Unity程式, 跑一跑之後會當掉?
Answer: 有可能是 (1) CPU用盡, (2)記憶體Memory用盡, (3) 記憶體存取錯誤等。
(1) CPU用盡主要是程式沒寫好, (2) Memory用盡主要是資源沒管理好
建議可以使用工作管理員, 來看 Memory 及 CPU 的使用狀況, 先了解當機的原因。


另外我推測, 可能也與 Unity版本太多有關係, 所以你網路上下載下來、別人來路不明的程式, 到底是用哪一個版本的 Unity 也要特別比對注意, 真的要用, 就用 "一模一樣" 的版本, 會較容易解決。或著是使用相容性的設定, 讓Unity自動把程式碼從舊版, 換到新版, 就可以了。

==========================================

Question: 如果水果超出視窗大小, 請問怎麼亂數產生新的水果?
Answer: 注意事項 (1) random(2) 出來的數字, 是介於 0到小於2的數 (0, 0.1, ... 1.99, 不包含2) 所以要傳給整數時, 要記得改成 int direction=int(random(2)); 來把浮點數, 變成0 或 1 的整數
(2) 要小心, random() 的時機點, 如果在  draw() 裡, 一秒鐘跑60次,那就變成亂閃亂跑。要在你需要的幾秒後, 條件成立 (比如說 if(水果超過範圍) 再去 random() 將水果重生)

==========================================


手碰到時, 只發1次聲音
if(手碰到) //wrong    player.play();


==========================================
Q: 怎麼讓東西可以像飛靶飛出去?

==========================================
Question: Kinect
(1)在拍手時,射出子彈
(2)手可移動子彈的位置

week14

今天老師也解決了同學在期末作品上遇到的困難



2016體感互動 Week 14 跳舞機 Part 1 如何讓2種米老鼠圖片 在3個位置掉落



2016體感互動 Week 14 跳舞機 Part 2 消掉不同色彩的米老鼠





其他時候, 則是一對一教學, 教同學如何解決遇到的實作問題。

02163635_謝伃婕-week17

這禮拜是期末DEMO

我們做的是水果忍者


我們這次做的版本是簡陋版的

還有很多可以改進的地方

如果想要做得更完美

哪就要更努力更認真的深入研究才行

week13

今天老師解決了同學提出的期末作品所遇到的問題˙




1. 星球殞落

期末作品

組員:蔡瑩盈、龔郁如

作品名稱:跳舞機

遊戲玩法:
遊戲一開始畫面上方會掉下米奇的圖片,分別為紅色及藍色,
透過kinect偵測左右手,左手會顯示藍色的手掌圖案,右手會顯示紅色的手掌圖案,
手掌顏色必須和米奇圖片為相同的顏色才可消除,成功消除一張即可獲得一分,如果米奇圖片掉到畫面的最下方會被扣一分。
可以跟著音樂的律動去消除米奇圖案~

demo 影片

https://www.youtube.com/watch?v=1FuwLKYRc2Q

期末作品展示

這是本學期的期末作品
水果忍者
從一開始看老師youtube影片
到後來老師直接用fb視訊教學



終於順利完成期末作品了
\


也看到很多同學都結合了其他平台做出許多好玩的遊戲


雖然我們這組沒有做到很好

不過已經學了很多了

期待下次有類似的機會可以做得更好!!!

體感互動week12 02160473賴緯漢(期末DEMO影片)

期末DEMO影片

期末影片

https://www.youtube.com/watch?v=iy-KX-hFDCw

Weed17 期末展示(Demo)影片

很快就到了期末Demo的時間
總覺得這個學期學的滿開心的
有一個負責任的夥伴也是很棒的事
一起研究的感覺也不錯


這次我們是用Unity 跟 Kinect 結合
名叫"Running Man"
裡面會有一個猛男一直跑
路途要閃避障礙物跟吃水果


另外很特別的是我們結合Kinect
所以是以手勢來控制遊戲


以下是我們最後Demo的影片
真開心我們都完成任務了




Week15 02132412_沈泓宇

期末作品策劃三:

繼續開啟更多的特效,增強畫面的效果,比如實時光照,軟硬陰影、霧效:


場景做得比較很看了,接著可以做UI部分,開始畫面比較簡單,只需要一個標題、開發人員、開始按鈕即可:


因為場景加了灰蒙蒙的霧效,所以顯得陰沉一點,所以介面就用比較亮、活潑的顏色形成反差,與灰暗的場景互補,給人一種熱血的感覺。

另外,後面的場景中的坦克是AI模式,會在一定的範圍內巡邏。

角色介面;


同樣的比較簡單,只有角色的血條和倒計時進度條。這個遊戲是即時戰鬥的生存遊戲,在一定時間內會不斷有坦克開過來攻擊主角,主角要擊退坦克,避免自己體力損失過多,只要堅持到倒計時結束就算生存成功。

坦克AI的部分程式碼,涉及到狀態機和思考時間的概念。

在主介面時坦克有三種狀態:停留、移動、旋轉,我用了一些隨機數來增加坦克屬性的不確定性、隨機性,避免大量的坦克都有很相似的行為模式。我用隨機數的目的就是模擬真實世界的情況,一個群體里有能力參差不齊的個體,同樣的,不同坦克有大有小。






160616_02160065劉劭玟_02161034胡佩君_finalproject

不知不覺來到最後一周了
一下子就要大四了

這學期 我們以帥氣的遊戲
running man
來做美好的結束

我們使用了 unity 來做遊戲 並結合faast來辨識手勢

舉雙手__確定&返回遊戲畫面
舉左手__往左
舉右手__往右
跳__跳
鞠躬__開始遊戲




期末作品_02160934蔡閎鈞,02160305邱俊澄

https://youtu.be/2GzV28mabsE
期末作品影片

week17_期末DEMO

作品:打老鼠

遊戲說明:一開始會有個開始畫面,目的是要先抓到人的影像及左右手
       手移到play後就會進入玩遊戲的畫面
       老鼠會從4個水管中隨機跑出來
       只要左手或右手碰到老鼠就會打到老鼠
       每打到1隻老鼠加1分
       總共限時1分鐘,時間到就會跳到遊戲結束的畫面,顯示你得了幾分

       我們開始畫面、遊戲背景及水管都是用Maya做的




開始畫面

背景畫面

play


Week14 02132412_沈泓宇

期末作品策劃二:

現在繼續上次的遊戲遊戲策劃,上次已經把基本的東西準備好了現在來做場景、人物、敵人位置的擺放。

地形場景:


在這個遊戲中,主角基本上是不能移動的,坦克會從四面八方開過來,要做的是把開來的坦克擊退,所以主角放在一個四通八達的十字路口,坦克可以從五條路,也就是五個方向開過來。另外這個地形挺大的,匯入後已經開始卡了,更不要說再加上其它的程式、邏輯判斷,最後會變得更卡。

因為這次要做的是PC遊戲,與手游不同的地方是,畫面的質量可以做得奢侈一點,但再怎麼奢侈,也不能用太浪費記憶體,需要用到一點資源優化的只是,不然即使是PC也會帶不動。

針對場景大這個問題,最適合用的方法就是遮擋剔除(Occlusion Culling)了(這個功能我之前也稍微研究過),雖然Unity Pro版的效果會更好更強大,但Unity標準版還是能用的,這個地方就是遮擋剔除的介面:


那遮擋剔除有什麼用呢,看這張圖就明白了:



遮擋剔除就是針對大場景優化的,只有攝影機看到的地方才會渲染出來,被遮擋的地方不會渲染,這樣就可以大幅度降低GPU的負擔了。

然後其它的畫質就可以隨心所欲地調到很高:





期末作品

期末作品展示影片:https://www.youtube.com/watch?v=NawDY7pxvPU
我們做的是一全超人V2
組員: 周煒皓02160225 陳侑增 02161061

Week13 02132412_沈泓宇

期末作品策劃:

這次想做的主題和期中作品有很大不同,期中是騎馬遊戲,而這次是坦克類遊戲,既然是坦克遊戲,那無論是界面或場景的風格都是要比較戰爭風的。騎馬遊戲是冒險類遊戲,涉及到戰鬥的方面不算多,而這次的坦克遊戲對戰鬥系統的要求比較高,要做出即時戰鬥的效果,並且要用到粒子系統,做出炮火連天的效果。

這次使用的開發工具仍然是Unity引擎,之前已經試過了Unity接入Kinect的SDK,總體來說出現的問題不算很大。整個遊戲的開發是從Kinect的官方Demo開始研究的。

Demo中的角色,可以根據你做出的動作而做出相應的動作。雖然模型不美觀,但使用上很方便,於是就決定,遊戲中的主角就是你了:


至於場景方面,我們找到了一個大樓倒塌、雜草叢生的荒涼場景,還會讓然想起移動迷宮1的場景,比較符合戰地風格:


這個坦克遊戲是控制人物角色來打坦克,不是自己操作坦克,因此找到的坦克模型就當做是敵人AI:


然後再去找粒子系統,在這個遊戲中火焰的粒子系統時最重要的,因為要塑造出炮彈爆炸的效果,然後把火焰附加到坦克模型上,做成坦克快要被摧毀的著火效果:


結論:

現在遊戲基本的素材都準備好了,可以做進一步的策劃,完善細節的東西。