These packages are licensed under CC0.
主にVRChatでの利用を想定しています。
PolychoralAccessory.unitypackage
4次元座標(と法線・閾値)を持つメッシュを3次元投影で表示し、ボーン位置を入力として回転させるシェーダーです。
PolychoralAccessory.prefabには、VRChatアバターの手の上に表示するためのPhysBone、Modular Avatar及びAvatar Menu Creator for MA設定が含まれます。
PolyhedralAccessory.prefabは、多面体の2次元投影の表示のためにPhysBoneの挙動を制限したものです。
アルファベットと数字の組からなるメッシュ及びマテリアルは、その表記が表す対称性に基づき一つの頂点座標から多胞体を生成するもので、ボーン位置を回転の代わりに頂点座標に割り当てています。
こちらのワールドにサンプルアバターがあります。
VRChatワールドで4次元多胞体を描画するためのアセットです。モーションコントローラと設定ウィンドウが付属しており、ワールド内で回転操作や描画スタイル変更等ができます。状態は同期されます。
PC及びAndroid(Quest3以外未検証)に対応していますが、対応のためにはマテリアルが参照するシェーダーを変更する必要があります。EasyQuestSwitchの利用を推奨します。
| マテリアル | シェーダー (PC) | シェーダー (Android) |
|---|---|---|
| CalcDisplay | Face | FaceQuest |
| CalcEdge | Edge | EdgeQuest |
| Line | Line | EdgeQuest |
図形の情報は現状スクリプトに直接書き込まれており、プレハブのShape Numで指定します。0~5が4次元正多胞体、6~10が正多面体(PolyhedraViewer.prefabで動作)です。
上記と同じく、アルファベットと数字の組からなるメッシュ及びマテリアルは頂点座標の変更に対応し、設定ウィンドウの反対側に表示される三角形または四面体に沿って白球を動かすことで、頂点座標を変更できます。こちらは現在色の変更及び同期には対応していません。
上記と同じワールドに設置しています。
4DSDFSliceStacker.unitypackage
4変数の陰関数(特に符号付き距離関数: Signed Distance Function, SDF)で表された3次元超曲面を、格子状に並んだ2次元平面との交差として描画するシェーダーです。
4S3_Grabbable.prefabには、Polychoral Accessoryと同様に、VRChatアバターの手の上に表示し掴んで回転させるためのPhysBone、Modular Avatar設定が含まれます。
4S3_Static.prefabは、デスクトップでの表示のためにPhysBone設定を除き、交差法立体視描画機能を追加したものです。
4S3_Presets.prefabおよび4S3_Custom.prefabは、関連するExpressions Menuを追加するためのアセットです。4S3_Presets.prefabでは、上記ワールドの展示を再現した設定を纏めています。4S3_Custom.prefabでは、ほぼ全ての設定項目を編集できます。使用にはAvatar Menu Creator for MAが必要です。両者を同時に使用することはできません。
描画にDepthテクスチャを使用するため、リアルタイムシャドウのないワールドでは表示されません。アバターに別途影を生成するライトを追加することで常に描画できるようになります。(参考資料)
こちらのワールドに設定項目の説明及びサンプルアバターがあります。
ワールド用浮遊・飛行ギミックです。空中でジャンプを入力することで起動・停止し、起動中は落下しなくなります。浮遊中に、デスクトップならE/Qキー、VRなら右サムスティック上下で上下移動します。FloatingTool.prefabをシーンに追加することで機能します。
Max Speed: 移動の最高速度。Accel: 最高速度に到達するまでの早さ(逆数が所要時間)。速度は線形に増加する。
FlyingSystemのスクリプトを参考にしています。
4D SDF Slice Stackerに導入しています。(一部機能の追加があります)
uGUIコンポーネント(Toggle、TMP_Dropdown、TMP_InputField、Slider)の値をグローバル化するU#スクリプトです。対応するスクリプト(UISyncToggle、UISyncDropdown、UISyncInputField、UISyncSlider)を、各コンポーネントを持つGameObjectにアタッチすることで機能します。
Request Interval: 同期の間隔。値が連続に更新された場合はこの値ごとにRequestSerialization()が実行される。
UISyncSliderLinearは、Sliderの同期を線形補完したい(UdonSyncMode.Linearを使用したい)場合にUISyncSliderの代わりにアタッチします。
Editor/UISyncAutoBinderは、各コンポーネントにUdonBehaviourがアタッチされたとき、UdonBehaviour.SendCustomEvent(OnValueChanged)を自動で追加します。これはコンポーネントの値を同期変数に反映するための処理です。
他のUdonBehaviourがアタッチされている場合、意図しない動作をする可能性があります。動作に問題がある場合は、メニューバーのTools/UI Sync Auto Binderを選択することで停止できます。
VRChatでのuGUIの使用についてはドキュメントを参照してください。基本的にはUI/Text - TextMeshPro (VRC)の追加と、各コンポーネントのNavigationをNoneにすること(加えてScroll barがある場合はScroll Sensitivityを0にすること)で正常に機能するようになります。Sceneビュー上に表示されるアイコンはSceneビュー右上の"Toggle visibility of all Gizmos in the Scene view"でオフにできます。また、日本語を含むFont AssetはTextMesh Pro VRC Fallback Font JPで簡易に設定できます。
反転を含むカメラで深度バッファを参照しながらスクリーンを上書きするワールド用ギミックです。(PC Only)
ポリゴンの表裏は反転(鏡映変換)によって入れ替わります。そのため、カメラの変換行列が鏡映変換を含む場合、GL.invertCulling=trueによって表裏判定を補正する必要があります。しかし、現在のVRChatではGL.invertCullingにアクセスすることができません。代替として、変換行列を反転させてから描画し、描画結果をさらに反転させることで、求める結果を得ることができます。
ところで、複数のカメラで同じレンダーターゲットを指定することで、先のカメラの深度バッファを参照しながら後のカメラの描画を重ねることができます。そして、例えば2台のカメラでの描画において後のカメラのみ反転を含む場合、上記の代替手法を適用するには、先のカメラでの描画結果及び深度バッファを後のカメラのために反転させる必要があります。本ギミックはそのような処理を実装したものです。
Client Simulator上では動作しないため、動作確認はBuildして行ってください。
CameraReflector.prefabは、ワールド内のアバターをオブジェクトの位置からz軸方向に反転させて描画します。異なる用途で用いるにはCameraReflector.csを編集する必要があります。
Camera Count: 上書きに用いるカメラの総数。Camera Depth Offset: このスクリプトで使用するカメラのDepthを設定する。(cameraCount + 1) * 3台のカメラがcameraDepthOffset - (cameraCount + 1) * 3からcameraDepthOffset - 1までのDepthに配置される。いずれのカメラもDepthが負である必要がある。Integrate Layer: 使用していないレイヤー(22-30)を一つ指定する。描画結果のスクリーンへの反映に用いる。Depth Base Layer: 使用するカメラが共通して描画するレイヤーを一つ指定する。深度バッファの書き込みに用いる。Photo Resolution: Photo Cameraに使用するテクスチャの解像度を指定する。StreamはStream Cameraの解像度、すなわちウィンドウサイズに対応する。本ギミックの描画結果は標準のPhoto Cameraには映るがその他のカメラや鏡には映らない。また、指定した解像度でのレンダリングはPhoto Cameraを表示している間毎フレーム実行される。
こちらのワールドにサンプルを設置しています。(CameraReflectorSample.unityとほぼ同一)
近づいて見ても粗くならない直交投影映像を描画するワールド用ギミックです。
カメラの映像をレンダーテクスチャとして撮影してメッシュに描画する場合、メッシュのuv座標に合わせて撮影・描画すると、近づくほどスクリーンに対してテクスチャが引き伸ばされ粗く描画されます。一方、スクリーンに合わせて撮影したテクスチャをメッシュでクリッピングする形で描画することで、どのような位置からも最適な画質で描画できます。VRCMirrorのように撮影カメラの位置がスクリーンカメラと関連するギミックでは後者の実装の方がむしろ自然ですが、撮影カメラが直交投影の場合後者の実装は困難です。本ギミックは特殊な透視投影行列を用いてそのような処理を実装しました。
Client Simulator上では動作しないため、動作確認はBuildして行ってください。
Mirror: オンのときは、OrthogonalMirror.prefabの手前の領域を鏡映して描画する。オフのときは、OrthogonalMirror.prefabの奥の領域をそのまま描画する。Min Depth: 描画する奥行き(Positionの反対側の境界までの距離)の最小値。本ギミックは用いている行列の都合で奥行きが一定にならない。
描画レイヤーやクリアフラグはReferenceCamera.prefabから設定できます。また、OrthogonalMirror.shaderを編集することで透過などの設定ができます。
こちらのワールドにサンプルを設置しています。(OrthogonalMirrorSample.unityと同一)



