SpriteStudio / SS5PlayerForUnity

OPTPiX SpriteStudio 5 Player for Unity
http://www.webtech.co.jp/spritestudio/
MIT License
39 stars 15 forks source link

全般 Zソートにつきまして #106

Open ghost opened 9 years ago

ghost commented 9 years ago

Zソートに関して質問がございます。

アニメーションの再生にてZソートに関して下記のような記述がございました。


「スプライトのtransformのPosition.zを参考に、描画するカメラのClipPlaneの「Near」と「Far」の区間を「1.0f~0.0f」とし・スプライトがこの区間の中に入っている時のCameraからの距離(最遠:0.0f~最近:1.0f)とした値に、本値を乗算したものを描画順序の考慮に入れます。」

上記の説明を見る限りではCamera座標系でのZで描画順をソーティングしているように見受けられますが、 こちらで検証してみた限りではCamera座標系ではなく ワールド座標系でのZでソーティングされているような挙動になっているように見受けられました。 こちらはCamera座標系で描画順が決定されている間違いないでしょうか?

検証した環境は下記の通りです。 Unity4.3.1f3 SpriteStudio 1.1.18

ご確認の程、よろしくお願い致します。

MasamiYitsuse commented 9 years ago

Katsumasa様

お世話になっております。 ご指摘の通り、現状ですと、ワールド座標系でのZソートになっております。

また、ご指摘を受けての検証を行っている最中に、(Ver.1.0系から)Ver.1.1.x系にバージョンアップした際の仕様変更に関して失念していたことを思い出しました。 大変申し訳ございません。 ※後述もしておりますが、それらの点について、Wikiのマニュアルへの欠筆に気づきました。お詫び申し上げますとともに、後日Wikiへの加筆・改筆を行いたいと思います。 ※そのため、混乱防止のため当Issueでの前記してあった1件の返信コメントを削除いたしました。


これは、理屈上「(シーンに設置され・特定のViewの下に配置して・表示しようとしているSpriteStudioからインポートしたデータ全ての)ワールド座標を回転させる」ということに他なりませんが…… カメラの指定などに対して、Camera2D(ないしは通常のパースペクティブカメラ)のtransformの設定ではなく、その直下にあるViewのtransformに対して与える ……ことで、ご希望の実装(カメラの操作)を行うことが可能でしょうか?

ViewのGameObjectは(その下についている)SpriteStudioからインポートしたデータ群の表示位置・スケール・角度などを制御する目的(及び、ドローコール削減及び複数の使用マテリアルの描画順序を正常に保つための描画マネージャ機能)で設置されています。 ※このあたりについては、ドキュメントを欠筆していることに今気づきました。申し訳ございません(本ViewについているScript_SpriteStudio_DrawManagerView.csの機能が、Ver.1.0系の頃は全てのアニメーションのRootパーツの制御をもつScript_SpriteStudio_PartsRoot.cs内の機能として実装されておりましたが、Ver.1.1.x系へのバージョンアップの際にドローコールの軽減のご要望が多かったことから現状の仕様に変更した際に、ドキュメントの更新漏れがありました)。

お忙しい中大変お手数とは存じますため、大変恐縮ではありますが、(Viewの操作でご希望の実装が再現できるかを)ご検討の程頂けますと非常に助かります。


追伸: Viewは、1つのカメラの下に複数個置くことが可能ですので、用途別に使い分けることが可能です(例えば3D空間内に同居するようなものと、UIなどの表示物などを、別々のViewの下に配置して・それぞれViewで別々な表示位置や「Renderer Setting」などの設定を行うことができます)。 また、OrthoではないPerspectiveのカメラの下に置くことも可能です。

なお、「View3D」と名前の付いたPrefabが、ユーザー様の設置した独自のカメラの下におくためのViewとしてPrefabにしてありますが、Viewを単独でPrefab化してあるだけで、機能自体はViewと一切変わりません。 但し、3D描画物と同居させた場合に、表示したい各SpriteStudioからインポートしたデータのtransform.Scaleで大きさを(3D描画物と)あわせる必要があります。

複数のView・Camera2Dを設置する(主にCamera2Dを複数個設置する)場合、諸注意点がございますので、下記Issueももご参照下さいますと助かります。 https://github.com/SpriteStudio/SS5PlayerForUnity/issues/101

追伸2: Viewを傾けたりしたことで表示メッシュそのものも傾いてしまうので、その点は補正ないし追加の処理が必要になるかもしれません(ビルボードのようにカメラに正対することにはならないためです)。 ビルボード的な自動補正機能が必要な場合、ご要望頂けますと非常に助かります(同時に、開発スタッフにもにも当該機能拡張を提案しておきます)。

ghost commented 9 years ago

MasamiYitsuse様

お世話になっております、木村です。

返信ありがとうございました。 ご提示頂いた方法でも出来るかと思うのですが、 可能であれば直観的に分かり易い方法で実装出来ないかと考えております。

現在当方としましてはMasamiYitsuse様からの記述にもございました通り、 他の2D,3Dオブジェクトを同列でSpriteStudioをビルボードとして描画する方法を検討しております。 ※但し、SpriteStudioのオブジェクトと他のオブジェクトのZソートは出来ないことは仕様であると認識しています。

現状SpriteStudioの使い方としましては 下記の階層構造が推奨かと思います。

Camera+       |       +-View+            |            +-Parts(SpriteStudio)

一方、当方としましては上記の理由から下記の階層構造で処理出来ないか模索中です。

Camera View+     |     +-Parts(SpriteStudio) 3DObject1 3DObject2  ・  ・

※カメラ1台でSpriteStudioとそれ以外のオブジェクトをまとめて描画し、  またカメラとViewが親子関係にあるとカメラを動かした際に  SpriteStudioのオブジェクトも一緒に動いてしまうのでCameraとViewの親子関係を解除したいと考えております。

拙い考えて恐縮なのですが、 上記を実現する為にはScript_SpriteStudio_DrawManagerView.csを下記のように変更することで 実現できないかと考えているのですが、如何でしょうか。

・Camera InstanceCameraDrawのアクセス修飾子をpublicに変更  →CameraとViewの親子関係が解除されるとInstanceCameraDrawが未初期化となるので   外部から設定できるようにする為

・DrawEntryObject()メソッドの /* Get Priority */以下を下記のように変更  Vector3 OriginWorld;  if(InstanceCameraDraw==null){   Matrix4x4 MatrixWorld = PartsRootDrawObject.transform.localToWorldMatrix;   OriginWorld = MatrixWorld.MultiplyPoint3x4(Vector3.zero);   }else{   OriginWorld = InstanceCameraDraw.WorldToViewportPoint(PartsRootDrawObject.transform.position);  }

ご確認の程、よろしくお願い致します。

MasamiYitsuse commented 9 years ago

Katsumasa様

お世話になっております。 様々な実証、お手数をおかけしてしまい、大変申し訳ございません。 また、お返事が遅れ、そちらについても申し訳ございません。


まず、シーンの構成についてです。

原理的にはご指摘のシーン構成・改造で、恐らく大丈夫ではないかと思います。 (現在、GitHubに上がっている最新版となる「Ver.1.2.3」のWiki上のドキュメント等を再整備中ですので、そちらを行いつつ)当方でも、早いタイミングで、同種の改造の実験をしてみて、別の改造方法や・他の部分の改造が必要であれば、こちらのIssueで通知させていただければと思います。

シーン構成については、ご指摘の方法(カメラの直下にオブジェクト群がこない形)でのアプリケーションの実装も、スタンダードな形の一つとして見かけることもありますので(特にTPSなどのように、カメラとワールドが切り離されて管理されている場合など)、当方でも具体的に実験・検証させて頂きたく思います。

若干煮え切らない回答で申し訳御座いませんが、(過去3D空間との同居描画での質問が少なかったこともあり)恐らく対象なりと当方でも検証後に具体的な内容をご返信したい意図からですので、何卒ご理解とご容赦の程お願い致します。


他オブジェクトとのZソートについては、ご指摘の通り、行うことができない現状仕様となっております。 ただ、Zバッファ比較については、SpriteStudio側のシェーダで「読み込みと比較」のみはONになっておりますので、(Zバッファに書き込まないだけで)通常の半透明・輪郭アンチエリアス描画ではない3Dオブジェクトとの同居描画は可能だと思われます。 ※一応、3DオブジェクトとのZバッファでの同居描画はVer.1.0からの仕様ではありますので、もし描画で支障などでましたら、別途Issueでご質問等いただけますと助かります。

ただし、Transparentレイヤー(半透明描画性を持ち・事前にUnity内でZソートが行われ・描画されるオブジェクトのための描画レイヤー)については、同居が難しい可能性があるかと思われます(輪郭部分や半透明部分でのZバッファでの不整合が起こってしまうためです)。


ビルボード描画についてですが…… もし、Viewなどを操作してカメラの役割などをさせる場合、 (Camera+) (      |)       View+           |           +-Parts(SpriteStudio) ※Viewの上にCameraがあるかどうかは一旦別問題といたしまして

の方法ではなく (Camera+) (      |)       View+           |           +-ViewInverse               |               +-Parts(SpriteStudio)

などのような構成にして、 Viewの制御と同時に、カメラに正対させたい軸に対してViewInverseに補正値を入れる形でビルボードの指向性を簡便に調整することができるかと思われます。 (上記で諸般の問題が出る場合、各オブジェクトに対して補正を行う必要が出てきます)


とりいそぎ、現状把握できている範囲での取り急ぎでの回答となってしまい、大変申し訳ございません。 お忙しい中とは存じますが、何卒宜しくお願い致します。