20210513のUnityに関する記事は5件です。

#10「仮想空間上に曲面ディスプレイを作成して大画面で広角カメラ映像を見る」【初心者】HTC VIVE Pro Eyeを使ってUnityでVRの開発を行ってみる.

はじめに Unityでモノづくりをする上で欠かせないもの...3Dオブジェクト... 普通にゲームを作る分には配布データが大量に出回っていますがXR開発用のものはまだまだ数や種類が少ないため簡単なオブジェクトを作っていきます. やはり湾曲ディスプレイは首を動かすことで臨場感を感じられるのでVR上で超巨大ディスプレイを作りたいなと思い立ったはいいが何も知識がなかったので0からメモしていきます. 初心者なので非効率な部分や雑な部分も多いですがご容赦ください. 環境一覧 SteamVR 1.15.19 Unity 2020.1.17f1 SRanipalRuntime 1.3.2.0 SDK SteamVR Plugin 2.7.2 sdk1.14.15 Vive SRanipalRuntime Plugin 13.3.0 インテル® Core™ i7-7700K NVIDIA GeForce GTX 1070 環境作成編 #1 Unityのセットアップをする 2021年 1月更新 #2 プロジェクトを作ってみる 2021年 1月更新 #3 VR開発のための環境を整える 2021年 2月更新 コントローラやHMDから入力を得る #4 VIVEコントローラのボタン入力を取得する 2021年 2月更新 #5 トリガーの押し具合やトラックパッドの位置情報の入力を取得する 2021年 2月更新 #6 ヘッドマウントディスプレイとコントローラの位置座標と回転を取得する 2021年 2月更新 #7 VIVE Pro Eyeの視線トラッキングを有効化(セットアップ)する 2021年 4月更新 #8 VIVE Pro Eyeのアイトラッキングを使って瞬きや視線を取得する 2021年 4月更新 #8-おまけ VIVE Pro Eyeのアイトラッキングで計測できるデータについて(適宜更新) 2021年 4月更新 AR機能を使用してみる #9 VIVE Pro Eyeのフロントカメラの解像度(性能)とAR機能を有効化について 2021年 5月更新 実際にアプリを追加してみる #10 仮想空間上に曲面ディスプレイを作成して大画面で広角WEBカメラ映像を見る(この記事)2021年 5月更新 今回の記事では, 1.Blenderでプロジェクトを作成する. 2.ベジエ曲線から曲面ディスプレイを作成していく. 3.UVエディターでテクスチャ(映像描画をする場所)を設定する. 4.実際にUnity上で動かして確認してみる. という流れ. 1.Blenderでプロジェクトを作成する. ゲーム作成の強き味方であるオープンソースの統合型3DCGソフトウェアBlenderを今回は使用します. まずは公式サイトからダウンロードしてインストールしてください. Blender.jp←ここから この記事で使用しているのは2.91.2です. 起動すると何を作るか聞かれるのでとりあえず「全般」を選びます. 唐突に箱が目の前に現れます. とりあえず今回は選択して右クリックからかDeleteボタンで削除しちゃいます. これで作り次始める準備は完了です.初期設定などは特にいじらなくても簡単なものは作れますのでここまでは比較的優しいです. 2.ベジエ曲線から曲面ディスプレイを作成していく. 今回は巨大曲面ディスプレイを作りたいので骨組みとなるベジエ曲線を追加します. Blenderの画面上にカーソルを置いて「Shift+A」で追加のタブを開けるのでカーブのベジエを選びます. するとなんとも弱々しい感じの線が出てきます. ベジエカーブを選択状態にした状態でビュー画面右上のしまわれているタブを開きます. するとトランスフォームというパラメータ調整画面が出てきます. まずは大きさを変更し,押し出しがしやすいように位置を上にあげます. 大きさを変更したら左上のタブから編集モードに切り替えます. 編集モードにするとベジエそのもののサイズから曲線の設定に変わります. 今回は線そのものではなく直線の位置を変えることで歪みをきれいに出すので頂点を選択して位置を整えていきます. ベジエカーブの2つの線を同じ角度で置くときれいな曲線ができます. 左上のタブからオブジェクトモードに戻し,ベジエを選択した状態で右クリックをしてメッシュに変換します. 再び編集モードに戻すと点と線のデータに変換されています. 範囲選択ですべての点を同時に選択した状態で編集モードの状態で左側に表示される押し出しを選択します. 押し出しを選択すると上にどのように押し出すか選択できるのでXYZモードに切り替えます. まずはモニターの大きさを出します. ペラッペラだとモニターっぽさがなくなるので先ほど同様点をすべて選択して厚みを出しておきます. こんな感じのものが完成しました.一応大きさはトランスフォームから変更できます. 3.UVエディターでテクスチャ(映像描画をする場所)を設定する. テクスチャを張りたい範囲を囲むように頂点を選択するか,モード切替タブの右に選択方法切り替えがあるので囲むように辺を選択をする. 選択した状態で右クリックをしてシームをマークを選択する. シームとは切り込みのことで,赤い線でマークがつきUV展開するのが楽になります. 問題なくシームが入っていればモード切替タブの右に選択方法切り替えがあるので囲テクスチャを貼る面を選択する. "U"キーか右クリックの面をUV展開から「展開」を選択します. このままでも編集できますが分かりやすいように画面左上をつまんで右にスライドして2画面に分割します. こんな感じで分割されます. 左側の画面をモード切替からUVエディターに変更します. すると先ほど展開したUVがオブジェクトの頂点と辺に合わせて表示されます. 基本綺麗にいきませんがシームをマークするとだいぶましになります. 頂点を選択して右上の隠れたタブから座標を数値で見れるので綺麗にUVを調整していきます.(この作業が地獄) こんな感じで隙間なく綺麗に調整し直します. あとは出力するだけなのでファイルからエクスポートの「FBX」形式を選びます. 出力の設定としては「エンプティ」「アーマチュア」「メッシュ」「その他」を選択します. もしサイズ感が違ったりした場合にはトランスフォームからサイズの調整はできます.メッシュ貼り直すのは地獄なのでワンチャン調整できます. サイズを変えてもテクスチャは歪まないです.(場合によっては歪むので頑張って再設定してください) 4.実際にUnity上で動かして確認してみる. とりあえず作ったオブジェクトをUnityプロジェクト上から見えるところに追加しておきます. VR用のカメラを設定したうえでオブジェクトを追加します. 正面に来るように位置を調整しておきます. 正面から見るとこんな感じ. 歪みに影ができると綺麗に映像が映らないのでPointライトを等間隔に4つほど設置します. 最後にいつもどおりC#スクリプトを作成してこの湾曲ディスプレイに落とし込みます. こんかいはとりあえずWebCameraTestというスクリプトを作成します. WebCameraTest.cs using UnityEngine; using UnityEngine.UI; public class WebCameraTest: MonoBehaviour { void Start() { //PCに接続されているカメラデバイスをすべて配列に格納 WebCamDevice[] devices = WebCamTexture.devices; //1台以上検知されれば処理,されなければebカメラが検出できません!とログに出す if (devices.Length > 0) { //配列に格納されたデバイスから使いたいカメラを選択する,devices[数字].nameとなっているが動かなければ数字を変えてみる. WebCamTexture myWebCameTexture = new WebCamTexture(devices[0].name); //どのゲームオブジェクトのテクスチャに貼るかを選択,今回造ったオブジェクトはcurvedという名前なのでcurved GameObject curved = GameObject.Find("curved"); //テクスチャへの描画処理,オブジェクト名.GetComponent curved.GetComponent<Renderer>().material.mainTexture = myWebCameTexture; myWebCameTexture.Play(); } else { //エラーログ Debug.LogError("Webカメラが検出できません!"); } } } 実際に動かすとこんな感じ.部屋が汚いのは許してください... ここに前回の視線計測システムをいれるとVR上でもしっかりとどこを見ていたのかを記録できますし,瞳孔などのデータをとれば動眼反射なんかも計測できるので色々と使えそうではあります. 次回はAR機能なんかをいじっていきたいなと思っています.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity] Google Maps Static APIで得た画像をTexture2Dに変換する

Google Maps Static API を使うと、 https://maps.googleapis.com/maps/api/staticmap?center=新宿&zoom=14&size=400x400&key=YOUR_API_KEY のようにURLを指定するだけで、下のようなpng画像がかえってきます。 つまり、これをUnityの UnityWebRequest に渡せばテクスチャを得ることができます。 ・・・と思ったのですが、公式サンプル通り using UnityEngine; using System.Collections; using UnityEngine.Networking; public class MyBehaviour : MonoBehaviour { void Start() { StartCoroutine(GetTexture()); } IEnumerator GetTexture() { UnityWebRequest www = UnityWebRequestTexture.GetTexture("https://maps.googleapis.com/maps/api/staticmap?center=新宿&zoom=14&size=400x400&key=YOUR_API_KEY"); yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.Log(www.error); } else { Texture myTexture = ((DownloadHandlerTexture)www.downloadHandler).texture; } } } とすると InvalidCastException: Specified cast is not valid. というエラーが出てTextureに変換してくれません・・・。 (Unity2020.3,7f1) www.downloadHandler.data にはちゃんとデータが入っているようなのですが、何のデータかわからずキャストできないようです。もしかしてURLの最後が.pngじゃないからとか? 自前でデータコンバーター書かなきゃダメなのか・・・と一瞬半泣きになったのですが、そういえばpngファイルからTexture2Dにする方法があったような、と調べたところ、 Texture2D texture = new Texture2D(400,400); texture.LoadImage(webRequest.downloadHandler.data); という方法が見つかりました。 400,400のところはgoogleMapsに渡したsize=400x400の値ですが、2,2など適当な値でもLoadImageが調整してくれるようです。 ということで、 using UnityEngine; using System.Collections; using UnityEngine.Networking; public class MyBehaviour : MonoBehaviour { void Start() { StartCoroutine(GetTexture()); } IEnumerator GetTexture() { UnityWebRequest www = UnityWebRequestTexture.GetTexture("https://maps.googleapis.com/maps/api/staticmap?center=新宿&zoom=14&size=400x400&key=YOUR_API_KEY"); yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.Log(www.error); } else { Texture2D texture = new Texture2D(2,2); texture.LoadImage(webRequest.downloadHandler.data); } } } で、無事テクスチャを取得することができました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityでビルドエラーになっているのにVisual Studioでは赤線の表示がないとき(「その他のファイル」の直し方)

はじめに スクリプトにビルドエラーが有る場合   UnityのConsoleや左下のステータスでエラーが有ることが表示されます。 これらの項目をダブルクリックすることにより、Visual Studioが開き該当の箇所を直したいわけなんですが、 なぜか、赤線が表示されないことがあります。 左上が「その他のファイル」になってないかを確認する 実は、ここが「その他のファイル」になっていると、スクリプトがビルドエラーだとしても 赤線で表示されません。 直し方 Unityの「Edit」→「Preferences...」を開きます。 「Preference」画面の「External Tools」の「External Script Editor」を 「Visual Studio 〇〇」にするようにしてください。 それっぽいものが複数出てる場合はどれを選んでも大丈夫だと思います。 これを設定後、Visual Studioを閉じて UnityからVisual Studioを開き直したら、ちゃんと赤線が表示されるようになると思います。 要因 C#のファイルを、Unityソリューションとして開いていないのが原因であり、 うまく行かなかったときは、ただ単にC#ファイルを開くモードになっていた。 どういうときにこうなるのか (原因は不明) 原因は不明です。今まで何もなかったのに、突然なったという声も聞いたり Colabと連携しているときになったりとか、Unityのバグとかに起因するかもしれません。 なにか分かる人がいればコメントください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【OculusQuest開発メモ】ビルドするまでにやらないといけないこと

Unity + Oculus Quest 2 開発メモ の自分用のメモ(抜粋)でしかありません。 注意 上記サイトに書かれている通りです。 Unity はプラットフォームやグラフィックス周りの基本設定を変えると、プロジェクト全体の再インポートが走るため、まずそのあたりの最低限の設定を済ませてから Oculus Integration をインポートします。 ビルドまでにやることの抜粋 Switch Platform で Android に変更します。 Unity の各設定を変更します。 Build Settings を開いてプラットフォームを Android に、Texture Compression(テクスチャの圧縮方式)を ASTC に変更します。 Player Settings で Player > Other Settings > Graphics APIs の Vulkan を削除します。 Minimum API Level を「Android 6.0 ‘Marshmallow’ (API level 23)」に変更します。 Oculus Integration をダウンロード、インストールします。 XR Plug-in Management を有効化し、以下の手順で Unity の XR サポートを有効にします。 Window > Package Manager を開いて以下二つをインストールします。 XR Plugin Management Oculus XR Plugin Edit > Project Settings > XR Plug-in Management で Android と Standalone の “Oculus” にチェックを入れます
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift で Unity の macOS の Native Plugin を作る

Swift で Unity の macOS の Native Plugin を作る Unity は Native Plugin を作成することで、Unity から提供されていない、OS 固有の機能を使用することができます 例えば maxOS では、Bluetooth の利用などが出来るようになります こちらの記事では、Swift だけで、Unity の iOS の Native Plugin を紹介しています 上記の記事の iOS の Native Plugin のプロジェクトを拡張して、macOS 向けの Native Plugin を作成します iOS 実機向けと、macOS 向けの Native Plugin を同時に開発し、Editor での動作確認を実現することで、開発効率の向上を狙っています 今回は、iOS 向けに作成したプロジェクトをベースに、数字の文字列を整数型に変換する swiftPmPlugin_toNumber 関数を持つ macOS で利用可能な Native Pugin を作成します リポジトリはこちら↓です macOS の bundle をビルドする スタート時の workspace の様子 Swift で作った SwiftPM のライブラリと、動作確認用の Native のアプリターゲットを含むプロジェクトがあります アプリターゲットは今回は必須ではありません Bundle のターゲットを作成する macOS-Plugin project を作成しました project は何でも良いです File > New > Target から Bundle を選んで作成します ここでは、MacOsSwiftPmPlugin と命名しました Package のリンク bundle のターゲットを選択し、general から Frameworks に、SwiftPM のライブラリを追加します Header のリンク MacOsSwiftPmPlugin 内に PrefixHeader.pch を作成します @import {{Swift で作ったパッケージ名}}; を記述します #ifndef PrefixHeader_pch #define PrefixHeader_pch // Include any system framework and library headers here that should be included in all compilation units. // You will also need to set the Prefix Header build setting of one or more of your targets to reference this file. @import SwiftPmPlugin; // <- 追加 #endif /* PrefixHeader_pch */ ビルドをすると Bundle が出力されます nm コマンドを利用すると、swiftPmPlugin_toNumber のシンボルが含まれることを確認できます $ nm /path/to/bundle/MacOsSwiftPmPlugin.bundle/Contents/MacOS/MacOsSwiftPmPlugin | grep swiftPmPlugin_toNumber 0000000000001fe0 T _swiftPmPlugin_toNumber Unity に組み込む サンプルプロジェクトの Unity の Plugins/macOS/ に作成した MacOsSwiftPmPlugin.bundle を配置しました macOS の場合は、DllImport 時に、bundle 名を指定する必要があるため、#if で分けました using System; using System.Runtime.InteropServices; using UnityEngine; public class Cube : MonoBehaviour { #if UNITY_EDITOR_OSX [DllImport("MacOsSwiftPmPlugin")] #elif UNITY_IOS [DllImport("__Internal")] #endif private static extern long swiftPmPlugin_toNumber(string stringNumber); void Update() { Debug.Log("number: " + swiftPmPlugin_toNumber("30")); } } Unity Editor から 実行してエラーが出なければ、Native Plugin の作成成功です さいごに macOS の場合、一度 DllImport すると、Unity Editor を終了するまで保持されます bundle の差し替えだけだと処理が変わらないので注意してください ライブラリの開発時は、iOS 向けのライブラリと同様に、Native 向けのターゲットを Xcode で作成して、デバッグをすると効率的だと思います
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む