お絵描きやプログラミングやアーマードコアについて綴っていくつもりです。プログラミングは備忘録的に使うつもりだったりする。
プロフィール

typeすつーか

Author:typeすつーか
FC2ブログへようこそ!

最新トラックバック
カウンターです
ついったー

広告とか

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--/--/-- --:-- スポンサー広告 TB(-) CM(-)
Processing Advent Calendar 2012 23日目の記事です。



↑即興でつくったブロック崩し(-ω-`)








AdventCalenderにむけてSimpleOpenNIでなにかをつくりたかったのですが、
事実上、アイデアソンで終わってしまった・・・。


そこで今回は、おもしろ(がじぇっと)の素となるもの、
すなわちアイデアの採掘方法を自分なりに公開しようとおもいます。


私がよく用いている発想法として、まず第一に


   

I.不便と感じたときに、それを便利にするものをつくる



があります。


そして、今回の記事のメインディッシュはコレ↓



   

II. Processing × ナニカ





いきなりこれをみただけでは「(・へ・?)」

となってしまうかもしれません。





私は今回のハッカソン(?)にあたり、
きがつくとProcessing向けのさまざまなライブラリを手当たり次第にあたっていました。
ちょうど、「ナニカ」の部分に当てはめて。




そして生まれました。








がじぇっとの「素」が。






タイトルをみて楽しみにしてらっしゃった方ごめんなさい、
また機会をみてつくろうとおもいます(ーー;)






申し訳なけ程度にうp・・・↓


import SimpleOpenNI.*;

SimpleOpenNI kinect;
HashMap hands = new HashMap();
PVector pos2d;

void setup(){
kinect = new SimpleOpenNI(this);
kinect.enableDepth();
kinect.enableRGB();
kinect.enableScene();
kinect.alternativeViewPointDepthToImage();
kinect.setMirror(true);

//---
kinect.enableGesture();
kinect.addGesture("Wave");
kinect.addGesture("Click");
//kinect.addGesture("RaiseHand");
kinect.enableHands();

size(kinect.rgbWidth(), kinect.rgbHeight());


pos2d = new PVector(100, 100);

}

int px = 0, py = 0, vx = 5, vy = 16;
void draw(){
kinect.update();
image(kinect.rgbImage(), 0, 0);

drawHands();
ellipse(px, py, 30, 30);
reflec();
racket();
}

void reflec(){
px += vx;
py += vy;
if(px < 0 || px > kinect.rgbWidth()){
vx = -vx;
}
if(py < 0 || py > kinect.rgbHeight()){
vy = -vy;
}
}

void racket(){
if(abs(pos2d.x - px) < 30 && abs(pos2d.y - py) < 30){
px = (int)random(kinect.rgbWidth());
py = (int)random(kinect.rgbHeight());
}

}

void drawHands(){
for(Map.Entry entry : hands.entrySet()){
int id = (Integer)entry.getKey();
PVector pos3d = (PVector)entry.getValue();

pos2d = new PVector();
kinect.convertRealWorldToProjective(pos3d, pos2d);

//ellipse
stroke(255, 0, 0, 128);
strokeWeight(32);
point(pos2d.x, pos2d.y);
}

}


void onRecognizeGesture(String strGesture, PVector idPosition, PVector endPosition){
println("Recognzed "+ strGesture);
kinect.startTrackingHands(endPosition);
}

void onUpdateHands(int handId, PVector pos, float time){
hands.put(handId, pos);
}

void onDestroyHands(int handId, float time){
hands.remove(handId);
}





このプログラムの遊び方


    まず初めに、手を振るジェスチャである、「バイバイ」をすると手を認識する

    画面にでてきた火球をタッチするとなんか起こる

    それだけ!



つまりは、動くボールを描画する入門的なコードとSimpleOpenNIの初歩の部分をミックスしたというものです。



明日はp5infoさんです。






-------------追記-----------------


SimpleOpenNIを使ったブロック崩しゲームできました。

y軸方向の反射はありません。。。

import SimpleOpenNI.*;

SimpleOpenNI kinect;
HashMap hands = new HashMap();
PVector pos2d;
int flag[][] = new int[8][4];

void setup(){
kinect = new SimpleOpenNI(this);
kinect.enableDepth();
kinect.enableRGB();
kinect.enableScene();
kinect.alternativeViewPointDepthToImage();
kinect.setMirror(true);

//---
kinect.enableGesture();
kinect.addGesture("Wave");
kinect.addGesture("Click");
//kinect.addGesture("RaiseHand");
kinect.enableHands();

size(kinect.rgbWidth(), kinect.rgbHeight());


pos2d = new PVector(100, 100);

for(int i = 0; i < 8; i++){
for(int k = 0; k < 4; k++){
flag[i][k] = 1;
}
}
}

int px = 0, py = 0, vx = 5, vy = 16;
void draw(){
kinect.update();
image(kinect.rgbImage(), 0, 0);

drawHands();
ellipse(px, py, 30, 30);
rect(pos2d.x - 50, kinect.rgbHeight()- 70, 100, 20);
reflec();
racket();
panel();
}

void panel(){
int offset = 50;
for(int i = 0; i < 8; i ++){
for(int k = 0; k < 4; k++){
if(flag[i][k]==1){
rect(offset + k*150 , i*35, 100, 30);
}else continue;
}
}

}


void reflec(){
px += vx;
py += vy;
if(px < 0 || px > kinect.rgbWidth()){
vx = -vx;
}
if(py < 0 || py > kinect.rgbHeight()){
vy = -vy;
}

for(int i = 0; i < 8; i ++){
for(int k = 0; k < 4; k++){
if(flag[i][k]==1){
if(abs(50 + k*150 + 50 - px) < 50 &&
abs(i*35 - py) < 15){
flag[i][k]=0;
vy = -vy;
}
}else continue;
}
}
}

void racket(){
if(abs(pos2d.x - px) < 100 && py > kinect.rgbHeight() - 75){
vy = -vy;
}

}

void drawHands(){
for(Map.Entry entry : hands.entrySet()){
int id = (Integer)entry.getKey();
PVector pos3d = (PVector)entry.getValue();

pos2d = new PVector();
kinect.convertRealWorldToProjective(pos3d, pos2d);

//ellipse
stroke(255, 0, 0, 128);
strokeWeight(32);
point(pos2d.x, pos2d.y);

//drawPos(id, pos3d, pos2d);
}

}



void onRecognizeGesture(String strGesture, PVector idPosition, PVector endPosition){
println("Recognized "+ strGesture);
kinect.startTrackingHands(endPosition);
}

void onUpdateHands(int handId, PVector pos, float time){
hands.put(handId, pos);
}

void onDestroyHands(int handId, float time){
hands.remove(handId);
}
スポンサーサイト
2012/12/23 23:56 processing TB(0) CM(2)
コメント
こんにちは。

興味を持って、ソースコードを張り付けてみたのですが
The function enableScene() does not exist.と出て実行できなくなっていました・・・
何故でしょう・・・
2013/11/15 13:57  URL [ 編集 ]
Re: タイトルなし
> こんにちは。
>
> 興味を持って、ソースコードを張り付けてみたのですが
> The function enableScene() does not exist.と出て実行できなくなっていました・・・
> 何故でしょう・・・

遅くなりました。コメントが投稿されていることに今気づきました...申し訳ありませんm(_ _;)m

必要なライブラリをすべてインストールできていますか?
OpenNI,NITE,Kinectを制御するハードウェアドライバ, simple-openni
以上のものがインストールされているうえで、プログラム先頭に記述してある「import SimpleOpenNI.*;」にエラーがなければ動くと思います。
http://kougaku-navi.net/backyard/archive/KinectInstallManual_130820.pdf

また、OpenNI以外のドライバ(たとえばMicrosoft社が提供しているKinectSDKなど)がインストールされていれば、OpenNIのドライバと競合してしまい、動作しません。その場合はKinectSDKをアンインストールすれば動作すると思います。
2013/12/09 19:38 typeすつーか URL [ 編集 ]















 管理者にだけ表示を許可する

トラックバック
http://stukacoding.blog.fc2.com/tb.php/15-b703ffb9
検索フォーム
ブロとも申請フォーム
QRコード
QR
IPv4枯渇時計
linuxコマンド
ぶくろぐ
本棚です
icat
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。