バーチャルキャスト+VCIで色のアニメーションを行う
バーチャルキャスト+VCIでマテリアルの色を変化させてみました。
Animationを使って色が変化していくアニメーションを作りたかったのですが、バーチャルキャスト+VCIで扱えるのは「位置・大きさ・回転」のアニメーションのみ。現状マテリアルの色を変化させるなら、スクリプトを書くしかありませんでした。
使う用途があったので、簡単なサンプルを作ってみました。
オブジェクトを1回にぎると色の変化が始まり、2回目で止まります。色の変化は2秒かけて赤→青と変化するようにしました。
止まってから再度にぎると、途中からではなくリセットされた状態(赤にもどる)で変化します。
バーチャルキャスト+VCIで2秒かけて色が変わるアニメーションをメモりました。Unityだと簡単にできるけど、ちょっと大変だった https://t.co/9cptCxiMeh #VCI #バーチャルキャスト pic.twitter.com/OIkwBfIifT
— よーへん(生)🌒V学芸員&サイエンスコミュニケータ (@361Yohen) 2019年5月25日
内容としてはこちらを参考にしました。
virtualcast.jp
下に色がループするバージョンを追記しました。
local state=0 --何秒かけて変化するか local framevalue = vci.me.Time.TotalSeconds --カウント開始 local framestart = 0 local moveflag = 0 local changeColor = 0 local red = Color.__new(1,0,0,1) local blue = Color.__new(0,0,1,1) function update() --moveflagが1になったときに、updateの中身を実行 if moveflag==1 then --print(vci.me.Time.TotalSeconds) --この場合は2秒かけて変化する framevalue = (vci.me.Time.TotalSeconds-framestart)/2 --Color.Lerpで色を徐々に変えていく changeColor = Color.Lerp(red,blue,framevalue) --マテリアルに色を設定 vci.assets._ALL_SetMaterialColorFromName("testMat", changeColor) end end function onUse(use) --カウントスタート framestart = vci.me.Time.TotalSeconds --1のときにupdateの中身を動かす moveflag = 1 if use == "Enn" and state == 0 then print("1回目にぎった") state=1 elseif use == "Enn" and state == 1 then print("2回目にぎったよ") state=0 --updateの中身を止める moveflag = 0 end end
Unity(C#)で書かれた下記のスクリプトをVCI(Lua)用に書き直して、アイテムとアイテムが接触したとき(タッチしたとき)に色が変化して、再度タッチすると止まるものも作ってみました。
prince9.hatenablog.com
また下記のようにアイテムの中にボタンがある場合は、このようにすることで当たり判定をつけることができます。
1.タッチするアイテムとボタンに当たり判定をつける(下の場合はピンクの棒と黄色のボタン)
2.ボタンに「Fixed Joint」をつけて、「Connected Body」にアイテムを指定する(下記の場合は本)。
Fixed Jointをつけておけば、元のアイテム(下記の場合は本)を動かすと同時にボタンも動きます
バーチャルキャストとVCIで、「VCIスクリプト+Unityで制作」のアニメーションできた。同一オブジェクトに適用可能。色のみはVCIで変えざるを得ないから、Luaのmath使ってなんとか https://t.co/9cptCxiMeh #VCI #バーチャルキャスト pic.twitter.com/V7oyxhRym0
— よーへん(生)🌒V学芸員&サイエンスコミュニケータ (@361Yohen) May 26, 2019
■アイテムとアイテムが接触したとき(タッチしたとき)に色相が変化して、再度タッチすると止まるスクリプト
--アイテムの状態を示す変数 local state=0 --カウント開始 local moveflag = 0 --何秒で色が変わるか local duration = 12 --HSVで色指定 local changeColor = 0 function update() --moveflagが1になったときに、updateの中身を実行 if moveflag==1 then --durationの時間ごとに色が変わる local phi = vci.me.Time.TotalSeconds / duration * 2 * math.pi local amplitude = math.cos(phi) print(amplitude) --色相・彩度・明度のうち、色相のみ変化 changeColor = Color.HSVToRGB(amplitude, 1,1); --マテリアル指定 vci.assets._ALL_SetMaterialColorFromName("testMat", changeColor) end end function onCollisionEnter(item, hit) if item == "Bou" and hit == "Shikaku" and state == 0 then --カウントスタート moveflag = 1 print("当たった") state=1 --アニメーションを再生させたいときは、ここに書く -- vci.assets._ALL_PlayAnimationFromName("Animation1", false) elseif item == "Bou" and hit == "Shikaku" and state == 1 then state=0 --updateの中身を止める moveflag = 0 --アニメーションを再生させたいときは、ここに書く -- vci.assets._ALL_PlayAnimationFromName("Animation1", false) end end