2016年7月31日日曜日

[Google VR][Unity]GazeInputModuleで注視しているボタンをクリックさせる

デフォルトだとタッチ操作が必要になる。環境によってはタッチ操作用の磁石がないので修正。
まずタイマー用の変数と、クリック動作させるかのパラメーターを追加。

    float clickTimer = 0f;
    float clickTimerMax = 1f;
    public float ClickTimer
    {
        get
        {
            return clickTimer;
        }

        set
        {
            clickTimer = value;
        }
    }
    public float ClickTimerMax
    {
        get
        {
            return clickTimerMax;
        }

        set
        {
            clickTimerMax = value;
        }
    }

    [SerializeField]
    bool GazeTimeClickMode;

あとはUpdateCurrentObjectを書き換えて、タイマーカウント終了時にExecuteEventsでクリックさせる。

    private void UpdateCurrentObject()
    {
        // Send enter events and update the highlight.
        var go = pointerData.pointerCurrentRaycast.gameObject;
        HandlePointerExitAndEnter(pointerData, go);
        // Update the current selection, or clear if it is no longer the current object.
        var selected = ExecuteEvents.GetEventHandler<ISelectHandler>(go);
        if (selected == eventSystem.currentSelectedGameObject)
        {
            ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, GetBaseEventData(),
                                  ExecuteEvents.updateSelectedHandler);
            if (GazeTimeClickMode && selected != null)
            {
                ClickTimer = ClickTimer - Time.fixedDeltaTime;
                if (ClickTimer <= 0f)
                {
                    pointerData.pointerPress =
                        ExecuteEvents.ExecuteHierarchy(go, pointerData, ExecuteEvents.pointerDownHandler)
                        ?? ExecuteEvents.GetEventHandler<IPointerClickHandler>(go);
                    ExecuteEvents.Execute(pointerData.pointerPress
                        , pointerData, ExecuteEvents.pointerClickHandler);
                    ClickTimer = ClickTimerMax;
                }
            }
        }
        else
        {
            ClickTimer = ClickTimerMax;
            eventSystem.SetSelectedGameObject(selected, pointerData);
        }
    }

調べるのが大変だった・・・

2015年6月21日日曜日

Wii Uに動画を表示させようと四苦八苦した件

Wii Uは自分で持ってるMP4動画とか画像とかをSDカードやらDVDやらDLNA使って読み込むことが
でき
ない。
私が思うにWiiU用アプリやらWebアプリやらがもっと作られるといいな~と想定されていたのだと思うがそうはならなかったようだ。
開発ライセンス必要だしね。
というわけで、Railsで単純な動画アップローダーを作った。
例によってソースのみ。
herokuにもデプロイしてあるんだけど個人用みたいな扱いにしたいからBasic認証掛けてある。アップロードしたかった方は申し訳ない。
Githubからソース落として自力でデプロイしてくれたまえ。
後学の為に苦労した点とかまとめます。
  1. BASIC認証
    これは思ったより簡単だった。ApplicationControllerにちょっと書き加えるだけ。
    class ApplicationController < ActionController::Base
      # Prevent CSRF attacks by raising an exception.
      # For APIs, you may want to use :null_session instead.
      protect_from_forgery with: :exception
      before_filter :basic
      private
      def basic
        upass = ENV["USER_PASS"]
        u = upass.split(":")[0]
        p = upass.split(":")[1]
    
        authenticate_or_request_with_http_basic do |user, pass|
          user == u && pass == p
        end
      end
    end
    環境変数はめんどいからコロン区切りにしてある。
  2. ファイル暗号化
    アップロードしたファイルは暗号化してDBへぶち込むようにしてある。
    Herokuの規約上、暗号化したほうが安全だと判断しました。
    これもmodelにちょっと書き足すだけ。
class Video < ActiveRecord::Base
  def encryptor
    secret = ENV["ENC_KEY"]
    ::ActiveSupport::MessageEncryptor.new(secret)
  end

  def video_data=(val)
    encryptor = self.encryptor
    write_attribute("video_data",encryptor.encrypt_and_sign(val))
  end

  def video_data
    encryptor = self.encryptor
    encryptor.decrypt_and_verify(read_attribute("video_data"))
  end
end
3 . DBへのぶち込み方
最初はテーブルにbinary列を追加してそこにぶち込もうとしたが、全件検索した際にメモリいっぱいになって落ちることが判明。
各列遅延評価してると思ってたけど、そうではないらしい。
結局テーブル分割したから保存部分がめんどくさくなった。
     @user = User.new(user_params)
     @user.filename = file.original_filename
     video = Video.create
     video.video_data = file.read
     video.save
     @user.video_id = video.id
     @user.icon_content_type = file.content_type
     @user.save
4. 動画再生
最初はsend_dataでRailsからデータ送ってたんだけど、それだとvideoタグでの再生がうまくいかんかった。なんでや。GifとかJpegならうまくいったのに…
結局、publicフォルダ以下に直接出力し、後で消すと言う方法をとった。
Dyno死ぬときにpublicフォルダ以下内容も死ぬけど一応トップに戻る際にも消してる。
 def show
    #ファイル出力
    @user = User.find(params[:id])
    File.binwrite(Rails.public_path.join(@user.icon_path), Video.find(@user.video_id).video_data)
  end
MP4への変換とかはHandbrakeなりなんなりでローカルでエンコードしていたから問題なかった。
あと、WebM形式も試したけどうまくいかんかった。
Wii Uで再生可能な動画形式は以下。こうして仕様を公開してくれているのは助かる。
これでそことなく動画をアップロードして再生できるようになったがまだ課題が山積み。
課題はGithubのissueを参照してください(宣伝)

ちなみに今回の投稿はKobitoで書いてからはっつけました。
Windows版Kobito優秀。

2014年8月31日日曜日

せっかく秋葉原アセットが無料公開されたので

Unity向け3D都市モデルデータ「Japanese Otaku City」|ゼンリン
http://www.zenrin.co.jp/product/service/3d/asset/

せっかく秋葉原アセットが無料公開されたのでガンダム踊らせて見た。














そしてOculusでリニアシート視点を実装しようとしたけどコンソールとか足元に焦点が合わなくて挫折。














※RX78-2はリニアシート非搭載です


これでしばらく実物大ガンダム見に行いかなくて良いな!

2014年6月22日日曜日

開発の進捗

ホラーゲーを作ろうとしているんだけど羽ばたくコウモリを作るのにえらい時間かかった。
ボーンを設定するのって、すごく大変なんだね・・・(疲労)



以下参考にしたサイト。

初心者のための!作って学ぶBlenderの基礎:④ボーンを設定する
http://nvtrlab.jp/column/2-4

Vertex Groups and Weight Painting - YouTube
https://www.youtube.com/watch?v=ccmVq_fTPw8

Blenderで3DCG制作日記
http://bmania.blog70.fc2.com/blog-entry-397.html

riotoqll's diary
http://riotoqll.hatenablog.com/entry/2014/02/01/164912

Blender編集モード(Weight Paint)
http://cg.xyamu.net/Blender/entry284.html

ぶれんだすた。 移動・回転・サイズ変更~基本~
http://d.hatena.ne.jp/kaneko1222/20120112/1326363012

Blenderモディファイア(Decimate)
http://cg.xyamu.net/Blender/entry210.html


早く自分の名刺にできるソフトを作りたいなあ。あのソフトの人か!みたいな

2014年6月1日日曜日

Unity(MMD4Mecanim)淡々と今日初めて知ったことをメモ

アニメーション設定をGenericにした場合、一回コンバートした後、fbx内に作られたvmdをAnimaterドラッグ&ドロップすることで使えるようになる。
他から持ってきたvmdは使えない。


右手首を回す場合、60.joint_RightWristを指定する。


この調子だと人様に見せれるレベルになるまでだいぶかかりそうだな

2014年1月26日日曜日

Unityいじり中(2)


Hamamatsu.rbでOculus Riftを持ってくると言った手前、自分で作ったソフトが無いとアレだと思うので必死こいて作成中。
上から落ちてくる物体をひたすら避けるゲームにする予定。
例のジェットコースターのデモがMyノートブックでは動かないからしょうがない。
次は重くてもゲーミングノートを買ったろう。

2014年1月19日日曜日

Unityいじり中

初心者向けの本も買ったし、なんとか人に見せれるレベルのOculus Riftのソフトが作れないか勉強中。

仮想空間のフォトギャラリーみたいのを作ろうとしてるけど、ビルドしたらResourcesがunity default resourcesにまとまってしまうおかげで画像の差し替えができん。
しかしわりとよくできたコードが書けたので満足。