カテゴリー別アーカイブ: Unity

Kinect v1-Win7 Unity

標準

kinect v1で動作確認→kinect v2へ応用、ということを考えて(v1は自宅置き)、v1で動かす方法をあれこれ思い出していました。

ひとつは、こちらでblog記事にした、Unity Wrapperを使う方法。playbackフォルダにモーションを保存でき、それを再生も出来るのですが、どうやって、汎用モーションの形にするのかがわからず、中座。

もうひとつは、Kinect with MS-SDK(スクリプト/アバターシステム RF Solutions)。kinect v2用のKinect Mocap Animator(10$)が出ているためか、こちらのバージョンは無料になって提供されています。

https://www.assetstore.unity3d.com/jp/#!/content/7747

Unity アセットストアにあるので、そのままインポートしてきます。

=====
<Kinect Gestureの使い方> 引用

2つの方法あり。

1.Main Cameraについている、KinectManagerを見てほしい。

There are two lists – “Player1 Gestures” (these are the gestures expected from player 1) and “Player2 Gestures” (expected from player 2).

The gestures in these lists will be detected during the entire game.

2.もうひとつは、KinectGestures.GestureListenerInterfaceを使ってコーディングする方法である。

For an example look at the KinectScripts/Extras/SimpleGestureListener.cs-script. Here is a short description of its methods:リスナースクリプトの例を載せてある。

UserDetected() can be used to start gesture detection programmatically.

UserLost() can be used to clear variables or to free the allocated resources. You don’t need to remove the gestures added by UserDetected()-method explicitly. They are removed automatically, before the invocation of UserLost().

GestureInProgress()-method is invoked when a gesture is started, but not yet completed or cancelled.

GestureCompleted() is invoked when the gesture is completed. You can add your own code there to handle the completed gestures.

GestureCancelled() is invoked, if the gesture is cancelled.

3.登録されているジェスチャーについて

①右手をあげる/左手をあげる RaiseRightHand / RaiseLeftHand – left or right hand is raised over the shoulder and stays so for at least 1.0 second.
②サイポーズ Psi – both hands are raised over the shoulder and the user stays in this pose for 1.0 seconds.
③Tポーズ Tpose – the hands are to the sides, perpendicular to the body (T-pose), for 1.0 seconds.
④ストップジェスチャー Stop – right hand is down and left hand is slightly to the side, but below the waist, or left hand is down and right hand is slightly to the side, but below the waist.右手または左手を手首位置より下で少し横に振る
⑤波 Wave – right hand is waved left and then back right, or left hand is waved right and then back left. 右手なら、左にウェーブしてから右に戻す。左手ならその逆。
⑥スワイプレフト SwipeLeft – right hand swipes left.右手を右から左にスワイプする
⑦スワイプライト SwipeRight – left hand swipes right.左手を右にスワイプする
⑧スワイプアップ/スワイプダウン SwipeUp / SwipeDown – swipe up or down with left or right hand
⑨クリック Click – left or right hand stays in place for at least 2.5s. Useful in combination with cursor control.右手または左手をその場所に少なくとも2.5秒止める。
⑩右手カーソルまたは左手カーソル RightHandCursor / LeftHandCursor – pseudo gesture, used to provide cursor movement with the right or left hand.
⑪ズームアウト ZoomOut – left and right hands are to the front and put together at the beginning, then the hands move in different directions.両手を自分の前であわせ、横に開く
⑫ズームイン ZoomIn – left and right hands are at least 0.7 meter apart and to the front at the beginning, then the hands get closer to each other. 70cmぐらい離した両手を自分の前で近づけること
⑬ホィール Wheel – left and right hands are shoulder size apart and to the front at the beginning, then the hands start to turn an imaginary wheel left (positive angle) or right (negative angle).肩幅に離した両手を前に出し、ホィールを回すように右回転させるか左回転させる
⑭ジャンプ Jump – the hip center gets at least 15cm above its last position within 1.5 seconds. 腰が少なくとも1.5秒以内に15cm以上浮くこと
⑮スクワット Squat – the hip center gets at least 15cm below its last position within 1.5 seconds 1.5秒以内に、腰が15cm以上沈むこと
⑯プッシュ Push – push forward with left or right hand within 1.5 seconds 1.5秒以内に右手または左手を前に押し出すこと
⑰プル Pull – pull backward with left or right hand within 1.5 seconds 右手または左手を1.5秒以内に後ろに引くこと

4.オリジナルジェスチャーの加え方

Here are some hints on how to add your own gestures to the Kinect gesture-detection procedure. You need some C# coding skills and a bit of basic understanding on how the sensor works. It reports the 3d-coordnates of the tracked body parts in the Kinect coordinate system, in meters.
To add detection of custom gesture, open Assets/KinectScripts/KinectGestures.cs. Then:
1. Find the Gestures-enum. First you need to add the name of your gesture at the end of this enum.
2. Find the CheckForGesture()-function. There is a long switch() there, and its cases process the detection of each gesture, defined in the Gestures-enum. You need to add a case for your gesture at the end of this switch(), near the end of the script. There you will implement the gesture detection.
3. For an example on how to do that, look at the processing of some simple gestures, like RaiseLeftHand, RaiseRightHand, SwipeLeft or SwipeRight.
4. As you see, each gesture has its own internal switch() to check and change the gesture’s current state. Each gesture is like a state machine with numerical states (0, 1, 2, 3…). Its current state along with other data, is stored in an internal structure of type GestureData. This data-structure is created for each gesture that needs to be detected in the scene.
5. The initial state of each gesture is 0. At this state, the code needs to detect if the gesture is starting or not. To do this, it checks and stores the position of a joint, usually the left or right hand. If the joint position is suitable for a gesture start, it increments the state. At the next state, it checks if the joint has reached the needed position (or distance from the previous position), usually within a time interval, let’s say within 1.0 – 1.5 seconds.
6. If the joint has reached its target position (or distance) within the time interval, the gesture is considered completed. Otherwise – it is considered cancelled. Then, the gesture state may be reset back to 0 and the gesture-detection procedure will start again.
To add detection of your own gestures, first try to understand how relatively simple gestures, like RaiseHand or Swipes, work. Then find a gesture similar to the one you need. Copy and modify its code to fit your needs. Hope this helps for a start 😉

Support, Examples and Feedback
E-mail: rumen.filkov@gmail.com; Web: http://rfilkov.com Skype: roumenf Twitter: roumenf

 

広告

Unity Treeで桜を作れるか

標準

CG Cookieのコースで学んでUnity Treeを使いこなせるかチャレンジ

(紹介動画-Free)

https://cgcookie.com/lesson/introduction-44/

(ここから先は、自分用メモとして)

だいたいのセットは、スタンダードアセットの環境系(Environment)にそろっているので、そのパッケージをインポートしておく。

木全体:Seed(適当に)。Area Spread(枝葉の広がり範囲)。オフセット(地面下に伸ばしたいとき)

LODクオリティ(初期設定0.8程度 あげればクオリティハイ、下げればローポリ)

幹や枝の設定:曲がり具合、直径の減衰具合、太陽に向く具合、根本の広がりなど。

途中で枝が折れた表現も可能(マテリアルもそれ用のをつけることが出来る)。

:どれぐらいの位置にどれぐらいの分量の設定可能。

出来上がったツリーは、自動的に(?)プレファブ設定されているので、テライン上にブラシで配置することが可能。

あるいは、少ない花の絵のみで、こういうのも綺麗→木蓮とかコブシの木に最適かも。

 

風の影響範囲

create→3Dオブジェクト→Wind Zone

木の幹、枝、葉っぱへと風の影響を設定していく。

 

Unity Particle

標準

参考にさせていただいたスライド
http://sssslide.com/speakerdeck.com/unitydojo/21unitydao-chang-pateikurujiang-zuo

1.パーティクルシステムのモジュール

1)基本

Main

初期速度、大きさ、色など。調整時はLoopで行うとよい。
カーブデータはプリセットライブラリとして保存できる。ただし、元のアニメーションカーブとの互換性はない。
移動距離などで消すにはCollisionを使う工夫もあり(Lifetime Lossを1にすると衝突時に消える)

Emission

時間に依存して放出するTimeと距離に依存して放出するDistanceのオプションあり。距離に応じる場合は、Simulation SpaceをWorldにする。

2)移動

Shape

Skinned Mesh Rendererを使うことで、キャラクター全体からパーティクル放出可能。
Start Speedをマイナスにすると、その形状の内向きにパーティクルを出せる。

Velocity Over Lifetime

Limit Velocity over Lifetime

原則させたい場合有効。Dampenは減速率。

Inherit Velocity

MainモジュールがWorldスペースのとき有効。オブジェクト自体の速度をパーティクルに反映させるときに使う。(裾を引く光など?)

Force Over Lifetime

徐々に早くなるミサイルなど。

External Forces

風の範囲設定(Wind Zone)を使ったときに使う

3)色

Color Over Lifetime

時間によって色を変える場合。アルファとカラー別々にMax8つまで補完登録可能。

Color By Speed

4)大きさ

Size Over Lifetime

Size By Speed

5)回転

Rotation Over Lifetime

Rotation By Speed

6)イベント

Noise

Collision

Triggers

Sub Emitters

Birth(誕生時)、Collision(衝突時)、Death(消失時)の3つに、どのタイミングでサブパーティクルを出現させるか設定可能。

7)アニメーション・描画

Texture Sheet Animation

テクスチャのコマ画像などを順番に読み取り、変更させるスプライトアニメーションとして設定したい場合。升目の数は、2のべき乗。

Lights

Trails

Custom Data

Renderer

2.打ち上げ花火考察

(0)舞台

太陽(Directional Light)を回転上向きにして沈める(たとえば、回転X:-15、Y:180など)

(1)打ち上げ

①Particle Systemを新規作成【HANABI】。リセットしたのち回転X:-90に設定。
Mainパネル Start Lifetime 3, Start Speed 20, Gravitiy 0.5
Emissionパネル Rate:0.5
Shapeパネル Angle:5
Rendererパネル MaterialをParticle Firework

これで2秒に1回打ち上げられる(Emission レイトが0.5)

②炎の軌跡作成用に
Sub EmittersのBirth追加【UCHIAGE】
Sub Emitter のマテリアルをParticle Fireworkに変更。
EmissionをRate over Timeを0にし、Rate over Distanveを30に設定

追跡する炎はStart Life time 1, Start Speed -1, Start Size0.4などに設定。
ShapeはConeにする。
これで、後ろに拡散するイメージが完成。

③Color over Lifetimeを使って、色が白→黄→オレンジと変化で設定

④Size over Lifetimeを使って、なだらかに凸カーブで最後がゼロになる曲線カーブを選択

(2)爆発(拡散する火花と煙)

①最初の【HANABI】パーティクルに、Sub EmissionをDeathのものを2つ追加【HIBANA】【KEMURI】

【HIBANA】Start Lifetimeを2つの定数の間(Random between 2 constants)に設定。0.8と1.0。
Start Speed 40-60。Gravity Modifier 3。
Emissionパネル Bursts追加。Min, Maxとも300に。
Limit Velocity Over Lifetimeを有効にし、Speedカーブを減速するものに変更。Dampen 0.1に。

ひとまず、ここまでで、飛び散る火花イメージ。

【KEMURI】Start Size 40。
3D Start Rotation Z軸 -180 180
Start Color のアルファ値 30
Emission Bursts。Min,Maxとも1に。
フェードインフェードアウト表現のため、Color Over Lifetimeのアルファ値を0→255→0 と変化。
Size over Lifetime 50%スタートで徐々に大きくなるカーブに。
Inherit Particle Color(元のパーティクルの色継承)をオフにし、独自にColor over Lifetimeで色をつける。

【HIBANA】を華やかに。Trailsパネルを有効にする。
Lifetime 0.6-1.0。Die with Particlesをオフに。Width over Trailを0.5。
Color over Trailでアルファ値を100に。

(3)消失(煌き)

①爆発後に起きる煌きを作成。【HIBANA】のSub Emitters→Deathに【KIRAMEKI】追加。
Start Lifetime 0.6-1。
Start Size 1-3。
Emission BurstsをMin,Maxとも1。
Velocity over Lifetimeを (-5,-5,-5),(5,5,5)でランダムに(風にやや流される感じが出る)
Color over Lifetimeでアルファを0,1,0,1,0,1,0とすばやく変化させて、点滅するイメージを出す。

 

Unity上でリアルタイムにダンスをさせたい!MMD変換でもいい。New

標準

2017/5/3 バージョン

こちらsimplestarさんの記事「UnityでMMDのPMXを表情モーフ付きでダンスするFBXとしてアセット利用する話」(2016-11-27)を参考に

1. Stereoarts Homepage さんのページでMMD4Mecanim (Beta) の最新版を入手

 

現在バージョン→2017/04/23 Unity 5.6 / 2017.1 への対応, その他不具合修正

MMD4Mecanim_Beta_20170423.zip

チュートリアル(基本編・応用編)がついているのでそれを参照する

解凍フォルダ中に、 MMD4Mecanim.unitypackage というUnity用パッケージがあるので、それをUnityプロジェクトにインポートする。

利用制限→WebPlayerでの利用不可。

 

2.MMDモデルの準備

 

Tda式アペンドミクさんが好きなので →作者様ブログ http://u16hp.blog134.fc2.com/

→配布場所(読んでね.txtを読むこと) https://bowlroll.net/file/4576

モデルフォルダの中身を、assetsフォルダに置く。(上の、MMD4Mecanimフォルダと同じ場所)

自動的に、(モデル名).MMD4Mecanimファイルが出来上がっている

それをクリックし、規約に同意する。

 

3.モーションを準備

上記MMD4Mecanimフォルダにも歩きVMDは用意されている。

かっこいいダンスないかなーと、男性舞踊 花鳥風月http://sdrv.ms/14OJMjb
(o2さん作 動画http://www.nicovideo.jp/watch/sm8397088)

こちらをダウンロード。

VMDファイルをMMD4Mevanimパネルの指定場所にドラッグ

 

4.変換作業

MMD4Mecanim設定パネルのprocessボタンをクリックし、しばらく待つと、プレファブ形式のミクさんが出来ている。

シーンにドラッグして、設定を初期化する。

rigは、generateのままでないとVMDの再現性が低い。(humanoidリグだと不足設定などが出てくる)

5.Animator Controllerの作成

新規Animator Controllerを作成し、それをミクさんにアタッチして開く。

Animatorウィンドウが開くので、先ほど変換したMikuさんモデル内のモーションデータ(.vmd)をドラッグ。

このコントローラをインスペクタ上で指定する

 

6.オーディオソースの貼り付け

 

オーディオクリップは、wav形式が無難AVIUtlなどのソフトで変換可能。

(音声あり。注意。NHKクリエイティブライブラリーより 初音ミクの音楽 (C)DropBox「流星DANCE」)
そのほかは、Youtubeの解説に書いてあります。

 

7.オリジナルアニメ→ビデオトレス

 

やってみると難しいトレス。いろいろ調べた結果。。。。

(1)Torsoは回転させず、位置あわせに使う。

(2)300フレーム程度(2x8カウントぐらい)をひとまとまりとして作っていく。

(3)根性。。。

がコツのようです。。。

「http://www.nicovideo.jp/watch/sm17450893 モーショントレスのコツ(百舌谷 さん)

■トレースの工程
1. 動画の準備#0:41
2. カメラと初期ポーズを動画に合わせる#1:13
3. センター仮打ち#1:50
4. 足IK#2:30 (①完全に設置②かかとが離れる③一番高い場所④つま先設置⑤かかと設置)
5. 上半身、下半身、頭、首、センター#4:22
6. 足、足首#7:05
7. 肩、腕、ひじ、手首、指#7:57
8. 3~7を繰り返す
9. 目や表情をつけて完成

※追記:仮センターは頭の先端のみを見て判断し打ちます。」

Blenderの場合は、ビデオシーケンスエディターに音楽を置いて作業できるので便利(読み込みは、.wav形式のみかも。AVIUtlで変換可能)

8.お借りしたものたちでリアルタイムモーション(たーのしー♪)

モデルは tda式アペンドミクさん
スクリプトは、StereoartsさんのMMD4Mecanim
モーションは、百舌谷さんの 4つをBlenderのアニメーションコントローラで接続
音楽は、NHKクリエイティブライブラリ 初音ミクの音楽 (C)DropBox「流星DANCE」

作業画面イメージ

画面キャプチャ(Fraps)によるリアルタイムプレイ画面

Game Asset組み立てモジュール02

標準

Unityで組み立てる

1.設計方針をたてる

・16 by 9の長方形画面

2.組み立て

(1)パーツを個々にプレファブ化

①一体化したプレハブとして入っているパーツをひとつづつのプレハブに変える。

②パーツは、自動的に100のスケールで入っているが、大きすぎるので、25のスケールサイズがよい。

→ただ、そうした場合、CTRLでのスナップが大きすぎるので、スナップ設定を移動0.5にする必要がある。

(2)カメラ設定

①パースではなく、平行投影のほうにする

②サイズを大きくする 10程度?

③X軸に45°傾ける。(やや下を見るアングル)

(3)床をタイルで埋める

①おびただしい数の床のコピーが出来てくるとで、エンプティを利用して、フォルダにまとめる。

②建物を適当に配置する。

(4)照明の設置

3.ゲーム用武器の配置

(1)回転砲塔(Cannon Turret)

・Blenderからfbxでインポートしたオブジェクトは、100:100:100になっている(Blenderの1.0がUnityの100)。

・また、Blenderではy軸が前でZ軸が上だが、Unityではy軸が上、z軸が前。

①エンプティオブジェクトをインポートしたオブジェクト、turret_B_Baseのチャイルドとして作成。Cannonと名前をつけ、上に出す。

②Cannonの回転初期値が-90,0,0になっているので、これを0,0,0に直す。

②その下にある、turret_B_pivotを一つ上の階層にあげる(Connonのチャイルドの位置)。プレハブ構成を壊すけれどいいかという警告が出るので、OK(Continue)を押す。これで、Unityの座標軸方向で砲台が回るようになる。