2016年5月5日 星期四

Week10 02132412_沈泓宇

這節課用了新的設備xbox360,還需要裝如下的drive:

Kinect SDK 1.8
FAAST
SimpleOpenNI
Processing 2.2.1 32位元版

Kinect for Windows Developer Toolkit也是必要的,裡面有很多現成的程式、範例可以體驗


裡面還有不少有趣的遊戲:




01160235_謝采玲, Week11

Kinect體驗


開 Developer Toolkitv1.8.0
執行Kinect Fusion Explorer - D2D





用Kinect掃描
存成.stl檔





下載meshlab






將.stl檔匯入meshlab裡








上課練習

踢足球

偵測到人的頭,就畫出一個ellipse






偵測到左腳,就畫出一個ellipse













偵測到左右腳和頭,就畫出一個ellipse

左腳比右腳高,就畫出透明紅色rect










































Week06 02132412_沈泓宇

這是我們組的期中作品:

我們做的是模擬仿真類的遊戲,用手抓住韁繩來控制馬匹,模擬真實騎馬的感覺,雙手抓住韁繩馬匹直走,只用左/右手抓,馬匹向左/右前方走。用Unity 3D引擎結合leap motion開發。

主界面:

背景是3D場景,前面是2D的UI,塑造出河流、馬匹、峽谷等元素,想表現出恢宏大氣的感覺。遊戲中有晝夜系統,因此有白天黑夜更替的效果,實現的方式比較簡單,通過控制燈光、skybox的值來調整環境的亮度、色調,讓這些值在一定範圍內來回變動,就能實現這樣的效果。


這匹馬只是NPC,用於場景的裝飾,不具備互動的效果。地上的草經過調整,有漸層乾枯的顏色。


場景關卡的設計,特意畫一條泥土的路徑來暗示玩家應該走的路。



採用第三人稱視角,UI的元素比較簡單,只有體力、呼吸兩個馬匹屬性,馬匹跑動時體力會逐漸下降,呼吸逐漸上升,呼吸表示馬匹呼吸的急促程度,跑的時間越長呼吸越急促,這樣設定是為了限制玩家控制馬匹無限跑下去。

程式碼:


這裡分開寫了好幾個class。

02160836_程玟綺, week11,

期末作品 : (跟林鈺倫同一組)

https://www.youtube.com/watch?v=TPwWl2HODAQ
我們想做的是,拳擊的遊戲



















下載的地方:120.125.70.53
(1)KinectSDK-v1.8-Setup
(2)MeshLab

open:
processing-2.2.1-windows32

先匯入需要的東西
(1)sketch
(2)import library
(3)add library
(4)SimpleOpenNI

















實作一:













import SimpleOpenNI.*;
SimpleOpenNI  openni;
void setup(){
  size(600,400);
  openni = new SimpleOpenNI(this);
  openni.enableRGB();
  openni.enableDepth();
  openni.enableUser();
}
void draw(){
  openni.update();
  image(openni.userImage(),0,0,600,400);
  //image(openni.depthImage(),0,240,320,240);
}

實作二:
(踢足球)
















import SimpleOpenNI.*;
SimpleOpenNI  openni;
void setup(){
  size(600,400);
  openni = new SimpleOpenNI(this);
  openni.enableRGB();
  openni.enableDepth();
  openni.enableUser();
}
void draw(){
  openni.update();
  image(openni.userImage(),0,0,600,400);
  for(int userId : openni.getUsers()){
   PVector pos = new PVector(0,0,0);
   float confidence = openni.getJointPositionSkeleton(
     userId,SimpleOpenNI.SKEL_HEAD,pos);
   ellipse(pos.x,pos.y,50,50);
   println(pos);
  }
}
void onNewUser(SimpleOpenNI openni,int userId){
  openni.startTrackingSkeleton(userId);
}



讓球可以出現在腳的位置















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 confidence;
   //float confidence = openni.getJointPositionSkeleton(
   confidence = 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);
}


當踢球時畫面會反紅












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), pos1 = new PVector(0,0,0),pos2 = new PVector(0,0,0);
   float confidence;
   //float confidence = openni.getJointPositionSkeleton(
   confidence = openni.getJointPositionSkeleton(
     userId,SimpleOpenNI.SKEL_LEFT_FOOT,pos1);
   ellipse(Xpos(pos1), Ypos(pos1),50,50);
   print("Foot: " + confidence);
   confidence = openni.getJointPositionSkeleton(
     userId,SimpleOpenNI.SKEL_HEAD,pos); 
   ellipse(Xpos(pos), Ypos(pos),50,50);
   confidence = openni.getJointPositionSkeleton(
     userId,SimpleOpenNI.SKEL_RIGHT_FOOT,pos2); 
   ellipse(Xpos(pos2), Ypos(pos2),50,50);
   println(abs(pos1.y-pos2.y));
   if(confidence>0.6 && abs(pos1.y-pos2.y)>100) {fill(255,0,0,128); rect(0,0,600,400);}
}
}
void onNewUser(SimpleOpenNI openni,int userId){
  openni.startTrackingSkeleton(userId);
}

02163042_王冠閔_Week11

安裝Kinect1.8,再裝Tool kit,安裝完測試


測試完  安裝 meshlab


--------------------------------------------------------------------------------------------------------------------------

安裝processing 安裝library 安裝SimpleOpenNI


--------------------------------------------------------------------------------------------------------------------------

畫出骨架





程式碼:

import SimpleOpenNI.*;
SimpleOpenNI openni;

void setup(){
  size(600,400);
  openni = new SimpleOpenNI(this);
  openni.enableRGB();
  openni.enableDepth();
  openni.enableUser();
}

void draw(){
  openni.update();
  image(openni.userImage(), 0,0 ,600,400);
  for(int userId : openni.getUsers()){
    PVector pos = new PVector(0,0,0);
    float confidence = openni.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_HEAD,pos);
      ellipse(pos.x, pos.y, 50,50);
      println(pos);
  }
}
void onNewUser(SimpleOpenNI openni,int userId)
{
  openni.startTrackingSkeleton(userId);
}




Week11_頭腳偵測_02160421黃志楷

            第十一週課程:頭腳偵測
Week11:Detection head and feet

第一節課(準備)

1. 先下載並安裝 sdk 以及 KinectDeveloperToolkit


2.下載安裝meshlab


3.試試看,範例程式








第二節課(找頭)
1.找尋頭的座標
import SimpleOpenNI.*; 匯入函式庫
SimpleOpenNI show;
void setup()
{
   size(640,480);
   show=new SimpleOpenNI(this); 要宣告show 
   show.enableRGB();
   show.enableDepth(); 
   show.enableUser();
}

void draw()


{

   show.update();  記得要更新
  image(show.userImage(),0,0,640,480);
  for(int userId : show.getUsers()) 持續找臉跟畫球
  {
    PVector pos = new PVector(0,0,0);
    float conf=show.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_HEAD,pos);
    ellipse(pos.x,pos.y,50,50);
  }
}
void onNewUser(SimpleOpenNI curContext, int userId) 記得有人進來要給他一個id
{
 curContext.startTrackingSkeleton(userId);
}


第三節課(優化程式)

1.優化找頭程式,讓其更精準

import SimpleOpenNI.*;

SimpleOpenNI show;

void setup()
{
   size(640,480);

   show=new SimpleOpenNI(this);

   show.enableRGB();

   show.enableDepth(); 

   show.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()

{
   show.update();
  image(show.userImage(),0,0,640,480);

  for(int userId : show.getUsers())
  {
    PVector pos = new PVector(0,0,0);
    float conf=show.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_HEAD,pos);
   ellipse(xpos(pos),ypos(pos),50,50); 優化
    }
}
void onNewUser(SimpleOpenNI curContext, int userId)
{
  curContext.startTrackingSkeleton(userId);
}














2.增加左右腳



 for(int userId : show.getUsers())


  {

    PVector pos = new PVector(0,0,0),pos1 = new PVector(0,0,0),pos2 = new PVector(0,0,0);
    float conf=show.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_HEAD,pos);
     ellipse(xpos(pos),ypos(pos),50,50);
     conf = show.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_LEFT_FOOT,pos1);
     ellipse(xpos(pos1),ypos(pos1),50,50);
     conf = show.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_RIGHT_FOOT,pos2);
     ellipse(xpos(pos2),ypos(pos2),50,50);
  }




期末作品+今天上課內容

1.下載sdk 1.8+toolkit
2.下載meshlab
3.讀kinectFusion的模型
4.期末作品:
5.作骨架
做出一個圓能跟著頭部移動
import SimpleOpenNI.*;
SimpleOpenNI openni;

void setup(){
  size(600,400);
  openni =new SimpleOpenNI(this);
  openni.enableRGB();
  openni.enableDepth();
  openni.enableUser();//深度
}
void draw(){
openni.update();
image(openni.userImage(),0,0,600,400);
for(int userId : openni.getUsers()){
  PVector pos =new PVector(0,0,0);
  float confidence=openni.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_HEAD,pos);
  ellipse(pos.x,-pos.y,50,50);
  println(pos);
}
}
void onNewUser(SimpleOpenNI openni,int userId){
  openni.startTrackingSkeleton(userId);
}
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 confidence=openni.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_HEAD,pos);
  ellipse(pos.x,pos.y,50,50);////頭
  float confidence1=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);
}