Perl日記

PerlとかRubyとかPHPとかPythonとか

HTC VIVE CE から VIVE Cosmos Elite に買い替えたメモ

2018年初めの方に買った HTC VIVE CE を VIVE Cosmos Elite に変えた。

www.vive.com

Rift とか Index とか、新しい VR 機器が出るたびにいいなと思っていたけど、ちょうど最近出た VIVE Cosmos Elite が HMD (ヘッドマウントディスプレイ)だけ単品で売るということで思い切って買ってしまった。VIVE Cosmos とかのインサイドアウトの無線の方が動きやすいのはわかるけど、自分はベースステーションと有線の方がなんか改造されてる感があって良さみが深い。

HMD 以外のコントローラとベースステーションは最初の VIVE に同梱されていたやつが使えるとのことで助かった。

そんな感じだったので、セッティングについても PC につける HMD をそのまま変えるだけでいいのかなと思いやってみたけど、SteamVR 上では変更前の VIVE として認識されてしまって映像が表示されなかった。単に PC に接続するインターフェースが HDMI から Display Port に変わったからかもしれないが。

VIVE の公式ページからセットアップの exe をダウンロードして実行、そのまま指示に従って進めると、ちゃんと HMD に映像が出るようになった。よかった。

セットアップの exe がダウンロードできるページ
www.vive.com

コントローラは HMD とペアリングしているらしく、上記のセットアップ中にペアリングすることはできなかったので、いったんスキップして完了までいってから、SteamVR 上のコントローラのペアリング設定でちゃんとペアリングできた。(コントローラの電源ボタンとメニューボタンを同時に押し続けるやつ)

変わったところ
  • 額を中心にして、画面の本体部分が持ち上がるようになった。今まで、取ってつけて取ってつけてがめちゃくちゃ面倒くさかったので、これはとてもよかった。特に Unity で VR アプリの開発するとき、何か変更・実行・装着・確認・取るのプロセスが辛すぎたので、カパッと上げるだけで済むのはマジで助かる
  • 若干目の周りの空間が広くなったのか、メガネをつけての HMD 装着を余裕をもってできるようになった
  • 付属の両耳のスピーカは自分の頭の形のせいなのかめちゃくちゃ扱いづらくて、PC からイヤホン伸ばして聞く方が断然楽だった
  • 解像度が上がって綺麗に見えるようになった分、アプリによってはたまに処理落ちするようになった。GPU の方がボトルネックになったのかもしれない
  • 自分で Unity で作ってた VR アプリがめちゃくちゃ綺麗に見えるようになったのが、正直一番感動した

Unity で Rotation の Z を動かさずに回転する

メモ。

入力に応じてオブジェクトを回転させたいときは、Transform.Rotate() を使う。
しかし、二次元的にそれをそのまま x と y に当てはめていろいろ動かすと、どんどん斜めになってしまう。

カメラ用のスクリプト CameraController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    void Update()
    {
        float x = Input.GetAxis("Vertical");
        float y = Input.GetAxis("Horizontal");

        if (x != 0 || y != 0)
        {
            x = -1 * x * Time.deltaTime * 50f;
            y = y * Time.deltaTime * 50f;

            this.transform.Rotate(new Vector3(x, y, 0));
        }
    }
}

f:id:rightgo09:20191112233958j:plain
最初はまっすぐになってる
f:id:rightgo09:20191112233110j:plain
斜めになった

一度オイラー角に変換してから x と y を加算減算して、またクオータニオンに変換して transform.rotation に代入するといいようだ。
(正直完全に理解してない)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    void Update()
    {
        float x = Input.GetAxis("Vertical");
        float y = Input.GetAxis("Horizontal");

        if (x != 0 || y != 0)
        {
            x = x * Time.deltaTime * 50f;
            y = y * Time.deltaTime * 50f;

            Quaternion rotation = this.transform.rotation;
            Vector3 rotationAngles = rotation.eulerAngles;

            rotationAngles.x = rotationAngles.x - x;
            rotationAngles.y = rotationAngles.y + y;

            rotation = Quaternion.Euler(rotationAngles);
            this.transform.rotation = rotation;
        }
    }
}

f:id:rightgo09:20191112234144j:plain
Z は 0 のまま


これをカメラにアタッチして、写真を撮るカメラにくっつけて、カメラっぽく動かせるようにして遊んでみてた。

f:id:rightgo09:20191112235341g:plain


参考:
bluebirdofoz.hatenablog.com

Unity から YouTube で 360度ライブ配信をしたときに調べてやったまとめ

f:id:rightgo09:20190530084156p:plain
ねこ型オブジェクト

YouTubeライブ配信をするために

360度ライブ配信に関するYouTube のヘルプページ

  • https://support.google.com/youtube/answer/6396222?hl=ja
  • 「現在、YouTube でサポートされている 360° 動画は正距円筒図法によるものだけです」
  • 「360° ライブでは 2160p または 1440p の解像度が推奨されます。」
  • 「最適な動画品質を提供するために 16:9 のアスペクト比を選択します。詳しくは、アスペクト比についての記事をご覧ください。」
  • 手持ちのモニタでは 1920x1080 が限界だったので、フルスクリーンでアプリ起動して、1080p で送った
  • 四方八方の映像を送るので、解像度的にはたぶんこれくらいが限界かもしれない
    • それでもカメラに近寄るとジャギジャギしてしまっていた
    • 4K とかで送れるならそれがベストなのに越したことはない

f:id:rightgo09:20190530083306p:plain
ジャギジャギしている

正距円筒図法 = Equirectangular

  • Unity 2018 のバージョンから RenderTexture.ConvertToEquirect が使えるようになったらしい(よくわかってない)
    • なのでまずは気合で Unity 2018 までバージョンアップします(しました)
Recorder を使う
Facebook のライブラリを使う
  • GitHub - facebook/360-Capture-SDK
  • Unity から直接 YouTube ライブ配信に必要な設定(ストリームキーとか)もできる、なんかすごそうなやつ
  • OBS などを挟まないので、「ちょっと待ってね」シーンとかに切り替えできないのと、後述の資料でちょっと不安な感じだったので、今回はやめておいた
Unity の機能を直接使う

実際に 360度ライブ配信をやってみて、気になったところ

  • HMD 内でレンダリングされている世界と、Equirectangular で出力した映像に、ズレがあった
    • 具体的にはトラッキングしている 3D モデルが腰の位置で高さが固定されてしまって、頭は下に下がらないし、足を曲げても宙に浮いてしまっていた
      • ライブ配信時のコメントで、「浮いてる」とあって、「浮いてないです」と答えてしまったけど、あとでアーカイブ見たら浮いてた(悲)
    • 同じ原因で、メガネも HMD の位置に追随するようにしていたので、自分にはちゃんと見えていても YouTube では縦横無尽に移動するメガネとなってしまった
  • 私の見えている世界が、世界のすべてではなかった……!


f:id:rightgo09:20190530082138p:plain
ねこ型オブジェクトを撫でていたのに、ライブ配信では浮いてしまっていたスクショ

そのほか

  • なんか新しい演出を入れたいなと思って、パーティクルを入れてみた
    • Particle Collection SKJ 2016_Free samples - Asset Store
    • magic_ring ってやつ
    • サイズが大きかったので Scaling Mode を Hierarchy にして普通にサイズ調整して、Play() と Stop() しかやりかた分かんなかったけど
    • Unity のパーティクルシステムは Shuriken っていうの、初めて知った
  • 360 度の世界を見せるのに何かできないかなと考えて、赤いキューブを回転させて、その上にねこを置いた