hololensを試していました。

LINEで送る
Pocket



先日一週間ほどhololensを借りることができました。
最終的には中途半端な話になってしまいそうですが触ってみたので記録を残しておこうと思います。

って前置き無しなのも良くないのでそれなに?って言う方。
hololensの凄さはこの動画を見ると伝わるはずです。

ここ最近はOculusHTC ViveのようなVR機器やgoogle glassなどのメガネ系デバイスが出てきていますが、それらとは一線を画し、別の方向性での未来を感じることができるものでした。

違いとしては、

  • メガネ系デバイスで当然レンズの向こうが見えるので現実世界の上に映像(CG)を重ねることができる
  • リアルタイムで現実世界の形状を認識するので、テーブルの裏側にキャラクターが隠れたり、壁からモンスターが出て来るというような現実世界とリンクしたコンテンツを制作できる
  • hololens単体で動作する(PCが入っている)ので別途スマホを用意したりごついPCとケーブルでつなぐ必要がない。→ワイヤレスなので自由に空間を動き回ることができる!

というところでしょうか。

個人的にはリアルタイムで形状を認識している(メッシュを生成している)というだけで大興奮なのですが、VRのように視界すべてが映像で閉じられた別世界になるのではなく、現実世界を利用できるので「そこにいるから、hololensをつけているから体験できること」というコンテンツを作ることができるので大人数で体験する演劇やライブなどでも有効な使い方があるのではないかと思っています。




で、どんな感じでつくるのかな?ということでUnityで試してみました。

VRが流行ることでより五感を使った体験が重要度を増していると感じているのでhololensの音ってどんな感じだろうと思って音を使った何かを作ろうとしました。

目標としたものは
「壁や床などからボールが自分に飛んできて、それをひたすら避けるゲーム(?)」
です。

開発情報はやはり中村さんの記事を参考にしました。
さすがのスピード、さすがの充実感。
http://www.naturalsoftware.jp/entry/2016/04/07/093200

いざ作るぞ!と気持ちは高まったものの環境構築とかインストールに時間がかかってしまい、
結局本格的に試すまで進められなかったのですが、いざ作ってみると

  • 壁から向かってくるボールのスピードを速くしたかったが音にそこまでの指向性を感じられなかったのでよくわからないまま常にキョロキョロしないとかわすことができなかった
  • 素早くキョロキョロするとなるとhololensの視野角の狭さが気になってしまった(音がなっている方向を向いているつもりでも小さめの視野角にボールがなかなか入らず、音のなる方を向いているのにボールを発見できずに全然かわせない)

ということを嫌というほど実感することができました。(さらに動画まで撮り忘れてしまった・・・)

とはいえどまだまだ開発途中のデバイス、これからデバイスの性能も向上するだろうし、楽しみです。
なんというかSF映画で見た世界を突然現実に体験することができ、また自分がそのコンテンツを作ることができると思うとこれからワクワクしてたまりません。

で、こんなところで時間が無くなりそうだったのでタップするとボールがまっすぐ飛んでいって、壁に跳ね返る、というだけのものを作って一旦返却。

これだけでも現実世界のものにCG世界のオブジェクトが跳ね返り、そこから音がなっていることくらいはわかるようになります。

また借りる機会はあるのでもっと色々と作ってみて経験を積もうと思います。
もっとちゃんとしたアプリを作りたいと思いました。

なんだかんだ新しいことが多く覚えることも新しいことに触れるたびに増えて大変はありますが、新しいもの、未来を感じることができて幸せです。

また借りる機会ができたらもうちょっと音の面も深堀していこうと思います。


#VRもいじってるのにいきなりこっち書くのも順番すっ飛ばしている気がしますが、そちらは後日ということで。
#自宅の風景が映ってしまうのちょっと恥ずかしいですね・・・

[flash astro]Dynamic Sound Generation 2.

LINEで送る
Pocket

またまたですが、Flash Player10 astroのDynamic Sound Generationです。

ボタンを押すと、音が流れます。

パルス波の長さを時間で変えています。

注意:音を止める方法がないので、音を消したい場合はリロードして下さい。

 

これがasだけでできるってのが素晴らしい!!

今、個人的にはこの辺の機能が楽しいなあ。

 

コードはこんなです。

main.as

<code>

package
{
import flash.net.*;
import flash.display.*;
import flash.media.*;
import flash.events.*;
[SWF(backgroundColor=”0xeeeeee”, frameRate=”50″, stageHeight=”200″)]
public class main extends Sprite
{
private var snd:Sound;
private var square:Sprite;
private var sh:Number = 200;
private var btn1:Sprite;
private var btn2:Sprite;
private var btn3:Sprite;
private var btn4:Sprite;
private var btn5:Sprite;
private var btn6:Sprite;
public function main()
{
initBtn();
}
private function initBtn():void
{
btn = new Sprite();
drawBtn(btn);
btn.buttonMode = true;
addChild(btn);
btn.width = btn.height = 20;
btn.x = 0;
btn.y = 0;
btn.addEventListener(MouseEvent.CLICK, click1);
}
private function drawBtn(sp:Sprite):void
{
sp.graphics.beginFill(0xff0000,1);
sp.graphics.drawRect(0, 0, 20, 20);
sp.graphics.endFill();
}
private function click1(e:MouseEvent):void
{
init();
doSamplesCallbackHandler(1);
}
private function init():void
{
snd = new Sound();
if( snd.hasEventListener(“samplesCallback”)) snd.removeEventListener(“samplesCallback”, samplesCallbackHandler);
snd.addEventListener(“samplesCallback”, samplesCallbackHandler);
snd.play();
}
private function samplesCallbackHandler(e:SamplesCallbackEvent):void
{
doSamplesCallbackHandler(1);
}
private var rate:Number = 44100;
private var freq:Number = 440;
private var phase:Number = 0;
private var count:Number = 1;
/**
* generate wave data.
*/
private function doSamplesCallbackHandler(type:int):void
{
//Voice.beep1();
var freq:Number = 220;
for( var i:uint=0; i < 512; i++ )
{
phase += freq/(rate);
var arrange:Number = 1;
var a:Number = 1;
if( i%2==0 ) a = 1;
arrange = a*count;
var phaseAngle:Number = phase * arrange;
var sample:Number = Math.sin(phaseAngle);
//ここで波形をつくってます。
sample = beep1(i);
//左右チャンネルともに同じ波形。
snd.samplesCallbackData.writeFloat(sample);
snd.samplesCallbackData.writeFloat(sample);
}
delim++;
if( delim > 256 ) delim = 0;
}
private var delim:Number = 0;
/**
* generate beep1
* @param i:uint wave counter.
* @return Number
*/
private function beep1(i:uint):Number
{
var res:Number =0;
//delim++;
//if( delim > 256 ) delim = 0;
//if( i < 256 ) res = 50;
//else res = 0;
if( i < delim ) res = 50;
else res = 0;
return res;
}
}
}

</code>