読者です 読者をやめる 読者になる 読者になる

雑誌(VRFREEK)の付録でVR体験

週末、本屋に行ったらVRFREEKという雑誌を見かけたので、手にとって見たら、VRゴーグルが付録としてついてくるということで、即断即決で買ってきました。 完全に付録目当てなので記事に関してはノーコメント。

VRFREEK(ブイアールフリーク) 2016年 03 月号 [雑誌]: DTMマガジン 増刊

組み立ては非常に簡単で、2分程度で終わります。レンズは最初から組み込まれているので、単純に箱の部分を組み立てるだけとなっています。

f:id:oki-lab:20160321193707j:plain:w400

使い方は、VR対応のアプリを実行してレンズの反対側にスマホをセットすればOKです。この辺りはGoogleのCardboardと同じです。

いくつかのアプリを試してみた感想としては、やはりCardboardと同程度の没入感です。そのままではそれほどでもありませんが、部屋の電気を消すとそれなり、という感じです。 実はCardboardは眼鏡をかけたまま見れないという、眼鏡人にとって致命的な欠点があるので、眼鏡を掛けている人はこの雑誌の方が良いと思います。

Cardboard VR v2 2015

最後に試してみたアプリを紹介します。なお全てAndroid用となっています。

YouTube - Google Play の Android アプリ
 言わずと知れたYouTubeのアプリ。360°見渡せる動画が大量にアップロードされています。検索フィルタで360°という項目があるので、それを使えば一発で検索できます。

VR Roller Coaster - Google Play の Android アプリ
 VRといえばジェットコースターのアプリということで、一つご紹介。

VR Bike - Google Play の Android アプリ
 傾きでバイクを操作するゲーム。

Lamper VR: Firefly Rescue - Google Play の Android アプリ
 クオリティの高いアクションゲーム。向いている方向に移動するというのが独特の操作感で、慣れないと思うように動けません。

恐らく、VRゴーグルが付録になったのはこの雑誌が初めてだと思いますが、こういうのが増えていって、もっとVRが一般的になって欲しいです。

Leap MotionでMMDモデルに触れたことを検出する

前回の記事oki-lab.hatenablog.jp

Leap Motionを使ってMMDモデルに触れるようになりましたので、次はモデルに触れたことを検出できるようにしてみます。 f:id:oki-lab:20160228151446p:plain

まずは、下記のスクリプトを用意します。

using UnityEngine;
using System.Collections;

public class ModelTrigger: MonoBehaviour {
    private GameObject controller = null;
    private string[] touchInfo=new  string[3];

    // Use this for initialization
    void Start () {
        controller = GameObject.Find("TriggerController");
    }
    
    // Update is called once per frame
    void Update () {
    
    }

    void OnTriggerEnter(Collider other){
        touchInfo[0]=transform.root.gameObject.name;
        touchInfo[1]=transform.parent.gameObject.name;
        touchInfo[2]=other.gameObject.name;
        controller.SendMessage("Touch",touchInfo);
    }

    void OnTriggerExit(Collider other) {
        //Debug.Log(other.gameObject);
    }
}


using UnityEngine;
using System.Collections;

public class TriggerController : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }
    
    // Update is called once per frame
    void Update () {
    
    }

    void Touch(string[] touchInfo){
        Debug.Log(touchInfo[0]+","+touchInfo[1]+","+touchInfo[2]);
    }

}

次に、triggerControllerをLeap Motionの手のモデルのBoneにアタッチし、そのモデルのPrefabをHandControllerにアタッチし直します。

f:id:oki-lab:20160228150618p:plain

最後に、空のGameObjectを作成し、ModelTriggerのスクリプトをアタッチすれば完了です。

f:id:oki-lab:20160228151348p:plain

上のスクリプトでは、左右どちらの手のどの指がどのオブジェクトに触れたのかを、コンソール上に表示するようにしています。 これを応用すれば、特定の部位に触れた時に、所定のリアクションをさせることも出来ると思います。


Unity5入門 最新開発環境による簡単3D&2Dゲーム制作

ネットワーク機能を使ったアプリケーション間の通信 (Unity)

今まで特に注目していませんでしたが、Unity5にネットワーク機能が実装されているということで、少し試してみました。

サーバープログラム

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;

public class SocketServer : MonoBehaviour {

    // Use this for initialization
    void Start () {
        SetupServer();
    }
    
    // Update is called once per frame
    void Update () {
    
    }

    public void SetupServer(){
        NetworkServer.Listen("127.0.0.1",2000);
        NetworkServer.RegisterHandler(MsgType.Connect,OnConnected);
        NetworkServer.RegisterHandler(888,OnReceive);
    }

    public void OnConnected(NetworkMessage netMsg)
    {
        Debug.Log("Connected to client");
    }

    public void OnReceive(NetworkMessage netMsg)
    {
        Debug.Log("Received");
        var recvMsg=netMsg.ReadMessage<StringMessage>();
        Debug.Log(recvMsg.value);
    }

}

クライアントプログラム

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;

public class socketClients : MonoBehaviour {
    NetworkClient myClient;

    // Use this for initialization
    void Start () {
        SetupClient();
    }
    
    // Update is called once per frame
    void Update () {
    
    }

    class Message:MessageBase{
        public string text;
    }


    public void SetupClient(){
        myClient=new NetworkClient();
        myClient.RegisterHandler(MsgType.Connect, OnConnected);
        myClient.Connect("127.0.0.1", 2000);
    }

    public void OnConnected(NetworkMessage netMsg){
        Debug.Log("Connected to server");

        var myMsg=new StringMessage("test");
        myClient.Send(888,myMsg);
    }

    public void OnReceive(NetworkMessage netMsg)
    {
        Debug.Log(netMsg.ToString());
    }
}

基本的に以下のリンク先のドキュメントの応用です。

Unity - マニュアル: ネットワークのクライアントとサーバー

サーバーにクライアントから文字列を送るだけのプログラムですが、最低限、通信は出来ますので問題はないと思います。

上のプログラムはUnityアプリ同士のものですが、本当はC++で書かれたソケット通信用のプログラムと通信したいです。 ちょっと調べただけだと良く分からなかったので、時間があったらもう少し調べて試してみます。

TensorFlowでディープラーニングを試してみる

最近巷で話題のディープラーニングですが、手を出すには敷居が高いと考えていた方も多いと思います。
そんな中、Googleディープラーニングに対応した機械学習オープンソースのライブラリを公開しましたので、試してみました。

下準備

セットアップの方法は、こちらに記載されています。 私はUbuntuで試してみました。なお、64 bitにしか対応してないようです。

$ sudo apt-get install python-pip python-dev
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl

手書き数字認識

チュートリアルとして、手書き数字の認識が用意されています。Google曰く、機械学習のプログラムの"Hello World"に当たるのが、この数字の認識だそうです。

MNIST For ML Beginners
チュートリアルは上記のリンク先にありますが、チュートリアル中のコードを動かすには、input_data.pyが必要です。 リンク先からコピペするか、下記で色々まとめて、ダウンロードしておきます。

git clone https://github.com/tensorflow/tensorflow 

後はチュートリアル中に出てくるコードをコピペしていくと、ひとつのプログラムになります。

import input_data
import tensorflow as tf

#load images
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

#place holder
x = tf.placeholder(tf.float32, [None, 784])

#weight
W = tf.Variable(tf.zeros([784, 10]))
#bias
b = tf.Variable(tf.zeros([10]))

#normalize
y = tf.nn.softmax(tf.matmul(x, W) + b)

#placeholder
y_ = tf.placeholder(tf.float32, [None, 10])

#cross entropy
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))

#minimize cross_entropy using the gradient descent algorithm
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

#initialize all variables
init = tf.initialize_all_variables()

sess = tf.Session()
sess.run(init)

#training step
for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

#correct boolean list
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
#cast to float point numbers
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

#show result
print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})

以上のコードを実行すると、学習が始まり結果が出ます。(画像は勝手にダウンロードしてくれます) 特に数字をいじらなければ、約91%になります。それなりに高い数字のようにも思いますが、あまり良くない数字だそうです。これは次のチュートリアルで更に高精度になるようです。

流石にコードをコピペしただけでは、何やってるのか良く分からないと思うので、チュートリアルの文章は読む必要があります。
普通のニューラルネットワークはともかく、ディープラーニングに関しては、日本語の情報が少ないので、中々苦労しますが、色んなことが出来そうですので、このライブラリ公開を機に、手を出してみては如何でしょうか。


深層学習 (機械学習プロフェッショナルシリーズ)

SmartWatch3 SWR50レビュー

いつか買おうと思っていたスマートウォッチを、先週ようやく購入しましたので、レビューしてみたいと思います。 開封時の写真を撮り忘れたので開封の儀の様子は省略。

詳しい説明書はないので、最初に起動した時に、スマホとどうやって接続するのか分かりませんでしたが、時計をスマホに近づけるとAndroid Wearのダウンロードページに遷移しました。このアプリはAndroid 4.3以上じゃないと使えません。多分Bluetooth Low Energy関係のためだと思いますが、スマートウォッチを買おうとしている人は要注意。

ソニー Bluetooth4.0 リストバンド型活動量計 ブラックSONY SmartWatch 3 SWR50-B

良い点・悪い点

とりあえず一週間使ってみて感じた良い点、悪い点は以下の様なものです。

良い点

・操作していない時でも、画面表示し続ける。
・欲しい情報を常に表示出来る。(天気予報・為替情報など)
スマホを出さずにメールが読める。

f:id:oki-lab:20151128101010j:plain:h300 f:id:oki-lab:20151128101005j:plain:h300

悪い点

・バッテリーが一日しか持たない。
・コンセントから充電すると発熱する。
・USBの差込口が挿しづらいところにある。

f:id:oki-lab:20151128101014j:plain:h300

スマートウォッチは操作していない時に表示が消えるものだと思っていましたが、少なくともこの機種は省エネモードで常に表示されます。また、腕に着けている時に、画面を見るために腕を手前に持ってくると勝手にバックライトが点きますので、いちいち時間確認のためにボタンを押す必要はありません。
悪い点で気になるのはやはり、バッテリーの持ち時間です。基本的に、日中使って夜寝てる間に充電をするというサイクルになりますが、充電を忘れると、その日は殆どつかえないことになります。スマホ同様、これから性能は上がっていくでしょうが、今はまだ一日が限界のようです。

対応アプリ

現時点で私が使用しているアプリは、以下のものです。

Gmail
Google Now
・Ingress
・Fit
・Line News
・ヤフー・ニュース

個人的に好きなのはニュースアプリです。トップニュースの通知だけでなく、全文読むこともできるので、スマホ無しで確認できるのは高評価。

総評

まだそれほど使い込んでいるわけではありませんが、まだ発展途上な感じがしますので、誰にでもオススメできる、というものではないと思います。但し、新しいガジェットが好きな人にはオススメします。また、まだアプリが充実しているとはいえませんので、新規分野のアプリを作ってみたい人も試してみて欲しいです。私も、自分が欲しい情報てんこ盛りのWatch Faceを作ろうかと思っています。とりあえず、天気予報・為替情報・株価・ニュースを表示するようにしたいです。

Android Wearアプリ開発入門 (Software Design plus)

UnityとLeap Motionで初音ミクに触ってみる

先日Leap Motionを購入したので、Unityを使って遊んでみました。

 

【国内正規代理店品】 Leap Motion 小型モーションコントローラー 3Dモーション キャプチャー システム

 

Leap Motionのセットアップ

まず初めに、Unityのプロジェクトを新規作成してから、Asset StoreからLeap Motionのアセットをダウンロードします。

Leap Motion Core Assets

 

このアセットさえあれば、とりあえずLeap Motionを使って手を表示させることは可能です。ちゃんと動くかどうか確認するためには、

HandControllerというPrefabをシーン上にドラッグ&ドロップすればOKです。

この状態でゲームをRunすれば、自分の手の動きに追従する3Dモデルが表示されるはずです。

 

lm1

 

もし、何も表示されない場合、Leap Motionが正しく動作していない可能性があります。その場合、下記をコマンドプロンプトに入力すると上手くいくかもしれません。

net stop LeapService

net start LeapService

(MacLinuxの場合はここを参照)

 

MMDのセットアップ

MMD(MikuMikuDance)のモデルをUnityで使うため、MMD4Mecanimをインポートします。

次に、MMDのモデルの入ったフォルダをUnity上にD&Dで、プロジェクトにコピーします。

そして、Unity上でモデルをクリックすると、下の画像のような利用規約が表示されるので、チェックを入れて、「同意するボタン」を押します。

lm2

そして、次に表示される画面でProcessボタンを押すと変換が始まり、終了すると、MMDのフォルダ内にPrefabができています。

これをシーン上にD&Dするとモデルが表示されます。しかし、この状態では手のモデルはMMDモデルをすり抜けてしまい、触ることは出来ません。そこで、一手間必要となります。

lm4

 

RigidBodyスクリプトを追加

モデルに触るにはまず、Hierarchy上のMMDモデルをクリックし、Physicsタブを選択します。そして、Physics EngineでBullet Physicsを選択、Processを押して、

Join Local Worldのチェックを外します。

lm5

 

次に、Leap Motion側のモデルにRigidBodyのスクリプトを追加していきます。

まず、RigidHandというPrefabをHierarchy上にD&Dで追加し、項目を全展開します。ここで各指のBoneにスクリプトを追加するため、Boneを全て選択して、Add ComponentからMMD4Mecanim Rigid Bodyを追加します。

lm6

そして、今スクリプトを追加したRigidHandのPrefabを再度Projectの方に戻します。

最後に、Hierarchy上のHandControllerにRigidHandをD&Dで追加しなおせば作業完了です。

lm7

 

初音ミクに触る

ここまで色々やった状態でRunすると、ついにモデルに触ることが出来ます。

lm8

今回私は、Tda式初音ミクで試してみました。このモデルのように髪が長いと、触っている感じが分かりやすいです。

Windows 10 プレビュー版をレビュー

Windows 10のプレビュー版が公開されましたのでインストールしてみました。

 

ISOは以下リンク先からダウンロードできます。

なお、ダウンロードするにはWindows Insider Programに登録する必要があります。

 

Windows 10 Insider Preview ISO April Update

 

インストールするには、ISOをDVDかUSBメモリに書き込み、そのメディアを使用します。

私は下記の記事を参考にして、USBメモリを使用しました。

 

Windows 10テクニカルプレビューをUSBメモリーを使って簡単にインストールする方法

 

今回は、既にWindows 7Ubuntuが入っているノートPCにインストールしたのですが、ブートローダーがWindows 10のものになってしまい、Ubuntuが起動できなくなってしまいました。多分なんとかすればUbuntuも起動出来るようになると思いますがこちらは未確認。

 

desktop

 

インストール後のデスクトップ画面が上の画像です。スタートボタンがあり、押すとスタートメニューが出てきます。

 

popup1

 

スタートメニューにはWindows 8のメトロのようなものが表示されます。

そして、ここに表示されているSpartanというのがIEに代わる新ブラウザです。

 

browser

 

普段IEを使っていないので詳しくは分かりませんが、多分IEと同じような使用感だと思います。

(Windows 10でもFirefoxChromeしか使う気なし)

 

そして最後に、一番確認したかったのが、シャットダウンの方法です。

Windows 8でシャットダウンの仕方が分からずググった経験のある人は多いと思いますが、私もその一人です。

 

popup2

 

Windows 10では、Windows 7以前と同じように、スタートメニューからシャットダウンができます。

スタートメニューの中の「仕事率」をクリックするとポップアップが出て、スリープやシャットダウンができます。

ただ、この仕事率という単語がどこから出てきたのが気になります。多分英語版機械翻訳したのでしょうが、まさかPowerの翻訳でしょうか。

 

 

Windows 10をしばらく使った感想ですが、Windows 7の正当後継版だなと感じました。Windows 8でUIに馴染めずアップデートを見送った人も10なら問題なく使えると思います。

アップデートを迷っている人は是非、インストールして試してみて下さい。

製品版ではないので勿論、何が起こっても自己責任で。