LoginSignup
3
2

More than 1 year has passed since last update.

【Blender/glTF】BlenderのglTF出力でtangent情報が出ない原因と解決法

Last updated at Posted at 2021-09-08

概要

注:筆者は3D関連の経験が半年程度 かつ アーティストではないため、Blenderに関しての知識が浅い。

glTFから読み込んだ3Dモデルで法線マップを使った描画をする処理を書いていると、tangent情報が正しく取得できないことがあった。
エクスポート時に「ジオメトリ > タンジェント」を有効にしてるのに、うまく行かない。

これを解決する手段を、忘備を兼ねて記しておく。
※ Blender 2.83.9 と 2.93.4にて確認

シェーダー、glTFパーサ、そのほかライブラリソースなど一通り疑った。どこにも問題はない。
そこで、glTFファイルでの記述を見に行くと…

**略**
"meshes" : [
        {
            "name" : "Cylinder",
            "primitives" : [
                {
                    "attributes" : {
                        "POSITION" : 0,
                        "NORMAL" : 1,
                        "TEXCOORD_0" : 2
                    },
                    "indices" : 3,
                    "material" : 0
                }
            ]
        }
**略**

無いやんけ、"TANGENT"!!!!

あと、シェーダー側でUVから良い感じにtangent算出する方法もあるらしいけど、今回はそれは無しという方向で……

原因と解決法

原因

GitHubのIssueにあった。
https://github.com/KhronosGroup/glTF-Blender-IO/issues/172

For calc_tangents to work, the mesh needs be all tris/quads, and there has to be a UVMap.

つまり…

  • すべてのメッシュが3角or4角である(n-gonはダメ)
  • UVマップ情報が存在する必要がある

この2点が必要だそうだ。

解決法1:n-gonの撲滅

前者は分かりやすい。
対策は、面をすべて三角/四角化するだけなので比較的簡単である。

「Ctrl + T」で自動で面を三角化するのが一番手っ取り早い。

もし、n-gonな面を放射状(ホールケーキを切り分ける感じ)に三角メッシュが生成されるように変換したければ、
面を差し込み & そこで生まれた頂点を中央にマージしてあげるといいだろう。

ちなみに、n-gonのみを選択するには、「選択 > 特徴で全選択 > 頂点数で選択」で、頂点数を 4、タイプを大きいにするとよい。
(n-gonを探し出して撲滅する際に役立つ)

解決法2:UVマップ情報を追加

さて、後者のUVマップ情報についてだ。
該当のオブジェクトについて、「オブジェクトデータプロパティ > UVマップ」を確認してみよう。

image.png

何もない!!!
これが原因。 「+」ボタンを押してUVマップを追加してあげよう。
筆者の場合は、ネット上から拾った素材がこの状態で長時間悩まされた。

参考にしたサイト

Tangent are not exported · Issue #172 · KhronosGroup/glTF-Blender-IO - https://github.com/KhronosGroup/glTF-Blender-IO/issues/172
Blender での n ゴンの使い方 - https://dskjal.com/blender/how-to-use-ngon.html

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2