Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Imported glb model faces wrong direction #742

Closed
infosia opened this issue Feb 12, 2021 · 8 comments
Closed

Imported glb model faces wrong direction #742

infosia opened this issue Feb 12, 2021 · 8 comments

Comments

@infosia
Copy link

infosia commented Feb 12, 2021

Describe the bug

Imported glb model faces wrong direction.

To Reproduce

  1. Download glTF model file -> CesiumMan.glb
  2. Check downloaded glTF file is valid (e.g. Open it in Windows 3D Viewer)
  3. Launch Unity, select UniGLTF -> Import (gltf,glb) from menu
  4. Choose CesiumMan.glb.
  5. Imported glb model faces wrong direction. Front and back faces are reversed

Capture

Expected behavior

Imported model faces front direction

Capture2

Environments (please complete the following information):

  • OS: Windows 10
  • Unity version: Unity 2019.4.10f1
  • UniVRM version: UniVRM-0.66.0_39d5
@0b5vr
Copy link
Contributor

0b5vr commented Feb 12, 2021

I believe it's working as intended? Note that z axis in Unity is opposite from glTF's one.
Is this a regression?

@infosia
Copy link
Author

infosia commented Feb 12, 2021

Seems like it's not a regression (Tested old UniGLTF and it did the same) I would expect that asset importer is taking care of final coordinate accordingly based on asset's coordinate system 🤔 For instance UnityGLTF does the coordinate fix accordingly (and fixes the face direction), I believe Unity's fbx importer does that too...I would expect that's what importers would do 😯

@ousttrue
Copy link
Contributor

とりあえず右手系(GLTF)・左手系(Unity)の変換をするために (x, y, -z) という変換をしています。
今から変えると、過去のデータが突然反対向きになるので混乱しそうです。
とりあえず import/export の関数に x反転か、z反転かを明示する引数を追加するところまでが限界。

@infosia
Copy link
Author

infosia commented Feb 15, 2021

VRM 1.0 で vrm-c/vrm-specification#205 が対応されれば glTF も自然と正面を向きそうな気がしますしインポータの挙動の変更もメジャーバージョンアップのタイミングがいいかもしれませんね。

@ousttrue
Copy link
Contributor

ousttrue commented Feb 16, 2021

importer / exporter が座標変換オプションを持って、ユーザーが用途に応じて選択できるようにします。
デフォルトは vrm0 の仕様に合わせて z-reverse 、これを UniVRM の実装仕様とします。

unity での前 runtime import asset import runtime export editor export
glb +Z? #747 選択できるようにする(defaultはz-reverse) #733 で選択できるようにする(defaultはz-reverse) #747 選択できるようにする(defaultはz-reverse) #746 dialogを新設し選択できるようにする(defaultはz-reverse)
vrm0 +Z z-reverse が仕様 z-reverse が仕様 z-reverse が仕様 z-reverse が仕様
vrm1 vrm-c/vrm-specification#205 +Z x-reverse が仕様 x-reverse が仕様 x-reverse が仕様 x-reverse が仕様

@TokageItLab
Copy link

TokageItLab commented Feb 22, 2021

#223 でも書きましたが恐らく KhronosGroup/UnityGLTFX-Flip が正規の実装であり vrm-0 仕様の Z-Flip は glTF 入出力としては間違っています...。厳密には UniVRM は UniGLTF で Z-Flip 後に UniVRM が 180 度回転するので見た目上は正しく見えるのですが、そもそも回転は UniGLTF の方で行うべきであった(※1)上、 UniVRM も回転を内部的に適用していなかった(例として blender だと回転後にトランスフォームを適用していない状態を変換の最終形としてしまっている)のが問題なのではないでしょうか(※2)。

var positions = mesh.vertices.Select(y => y.ReverseZ()).ToArray();

m_model.transform.rotation = Quaternion.Euler(0, 180, 0);

VRM-0 や VCI との互換性が完全に死ぬので Z-Flip を廃止しろとまでは言いませんが、 glb 入出力に関しては純粋な glTF を扱う事が想定される以上、混乱を避ける為にも Khronos 公式の UnityGLTF に合わせて X-Flip をデフォルトとすべきだと考えます。


※1: X-Flip の場合回転は必要ありません、回転を頂点に適用する前提であれば確かに X-Flip = Z-Flip + Y-Rot(180deg) です
※2: VRM-0 はジョイントの回転(ボーンのローカル方向)は破棄するとして、オブジェクトとしてのノードの回転については定義がない? -Z 向きにしたいのであれば VRM-0 でこの回転は不必要だったのでは...一応 GL 座標系を意識したという結果でしょうか?

@infosia
Copy link
Author

infosia commented Feb 23, 2021

glTF のドキュメントには The front of a glTF asset faces +Z と記載されています Coordinate System and Units。 なので glTF で +Z を向いている方がアセットの正面であり、インポータの挙動としては UnityGLTF のように Unity でも正面を向くように変換するのが期待されると思います。

@ousttrue
Copy link
Contributor

#755, #888 で実装

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants