2016年7月3日 星期日

01160235_謝采玲, Week17

W17 期末作品 Demo




[2016.0621 - 體感互動期末作品/平衡球2-1] 

遇到的問題 & 前置作業









[2016.0703 - 體感互動期末作品/平衡球2-2] 

遊戲試玩

https://www.youtube.com/watch?v=EtdV0SGJGso&feature=youtu.be









[2016.0703 - 體感互動期末作品/平衡球4-3]

示範遊戲失敗

https://www.youtube.com/watch?v=HiuqrgtwiZE&feature=youtu.be









[2016.0703 - 體感互動期末作品/平衡球4-4]

示範遊戲成功

https://www.youtube.com/watch?v=XnluAyMUHtk&feature=youtu.be















action:


restart game => left hand to the right of head






next level => right hand to the left of head






floor lean forward => hands up and lean forward







floor lean backward =>hands up and lean backward







right => hands up & left hand above right hand


left => hands up & right hand above left hand





01160235_謝采玲, Week16

W16 期末作品製作


遇到的問題:


Q1

如何讓 Kinect 和 Unity 結合使用

不使用 FAAST

(此方法需要抓手的點,雖然精準,但非常費時)





Q2

Collider不會跟隨手移動

是跟著整個身體的座標




Q3

當左手碰到Sensor時

依右手和左的高度差去控制地板翻轉

但是發現左手太累了




Q4

在Maya製作場地模型

匯入Unity之後

加入Mesh Collider

球無法掉進洞裡












最後決定用 FAAST 來當控制的工具






前置作業:

參考其他相同遊戲






Classic Labyrinth 3d






Maze Fire Ball 3D






Plunk






Plunk其他關卡



























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)手可移動子彈的位置