🙌

FBXの変換についての台所事情

2022/12/16に公開

この記事はNeos VR Advent Calendar 2022の16日目になります。

要は「VRM to GLB for Neos」を作ったのでそのバックグラウンドと、今回その延長として提供することにしたFBX_asciiFBX_binaryの使用方法、FBXの変換の台所事情についてまとめる感じです。

tl;dr

もしFBXでファイルがある場合:

せぎゅさんからフォークして公開しているFBX_ascii(をBatで使えるようにしたもの)にファイルをD&D。正常に変換されると[<元ファイル名>-ascii]の形式で出力されます。


 テクスチャファイルのファイル名のみ確認して変更して、絶対パスになっているのを相対パスに変更してください(テクスチャにはWearと書いてあるはずなのにBodyになっているとか)。
その後、テクスチャファイルを相対パスとして合っている場所に移動させれば、Neosに入れる準備は完了です。テクスチャを入れる前提になっていない場合がたまにありますが、その場合はあきらめて入れたあとにWikiを参考に導入お願いします。


テキストはBoothで「こここや」さんが販売されています「ソラハ」ちゃんのものを一部引用しています。作者さんの作業時のディレクトリが見えてしまっているので隠しています。なお、Neosにはclothに相当するコンポーネントがありませんのでこの手順で編集してもこのままNeosで使用することはできません。ご了承ください。
アバターについてはこちら: ソラハちゃん

テキストで編集した後Blenderで編集したい場合は、編集したFBXをFBX_binary(をBatで使えるようにしたもの)にD&Dすることでバイナリに変換され、Blenderで編集が可能になります。一部絶対パスに戻る場所がありますが、相対パスが想定されている項目は相対パスのままですので、Blenderでも認識します。

もしVRMでファイルがある場合

Blenderで安定して変換できます。
 拙作VRM_to_GLBを使用して変換してもらえればglbまで変換できるので、このglbをNeosに導入しましょう。
ボーン名称など一部おかしい点がある場合は、glb出力後残してくれる[_manual]と記載がある方をお使いください。
日本語非公式WikiNeosサーチの両方に記事があります。詳しくはそちらをどうぞ。

FBX_ascii,FBX_binaryについて

基本的にはsaguvitaさん提供のこちらのQiita記事にほぼほぼすべて乗っています。変更した点として、FBXのバージョン指定を可能にしました。
引数のしていない場合はFBX2013にしています。これはNeosが使用することのできるFBXは2011-2013までのものでないと使用できないとの記載に合わせた形になります。

FBXのデータ形式について

FBXの形式には「バージョン」という概念があり、また大別して「バイナリ」と「文字」の2種類の形式があります。
バージョンについては https://help.autodesk.com/view/FBX/2020/ENU/?guid=FBX_Developer_Help_cpp_ref_fbxio_8h_html を読んでね、以上に言えることはないですが、Blenderが解析している時期を考えてもFBX2013あたりを使っておいた方がNeos的には安全な印象があります。
また、FBXの形式として変換をした際に副産物としてメモ帳で開ける形式に変換することもできます(ASCII形式)。これにより本来であればアバターを実際に入れてみるまでテクスチャが入るかどうか想像(という名の博打)をしなければいけなかったのが、データを実際に見てテクスチャのURLが変になっている場合はその場で手修正してあげることで治すことが出来るようになります。
こういった使い道を見出すことで、Neosにアバターを入れたいけどテクスチャの入れ方すらわからない!という人に対して一助になればいいなと思い、FBX_asciiを作った次第です。

因みに、もしNeosに限らず一般ソフトで使用したい場合は、そのソフトの開発時期を確認した上で変換することをお勧めします。最新版のFBXの場合、破壊的変更が含まれていますので対応していないビューアでは読み込めません。

fbxio.hより引用し翻訳
Version 7700 FBXSDK_TC_MILLISECONDを46186158から141120に変更し、~23.976、~29.97、72、96fpsなどのフレームレートを正確にサポートするようにしました。この新しい値は、Maya 2018ですでに使用されており、MotionBuilder 2019でも使用される予定です。この変更はタイミングにしか影響しませんが、バージョン7500との互換性を壊すには十分な大きさです。しかし、採用の問題を最小限に抑えるために、このバージョンでの変更はグローバル設定で変更可能です。デフォルトでは、古い値を使い続け、新しい値には「オプトイン」で有効化します。時間の経過とともに、"opt in"がデフォルトになり、ファイルのバージョンは8000に引き上げられます(以前のバージョンのFBX SDKは、新しいファイルに互換性がないことを検出できるように)。その間、新しい精度で保存された7700ファイルは、以前のFBX SDK(2016,2017、2018)BUTで全く悪いタイミングでまだ読み込まれることが予想されます。

変換についての台所事情

本当はFBXなど使わず最初からGLTF形式に変換できるのが理想形と考えています。というのも、FBXの形式はプロプライエタリなもので、SDKは提供されているものの保存するデータの保存形式について明確に決まりがあるわけではないからです。
 ただ、世の中にあります様々なツールをかけてみたのですが、Blender以外はメッシュがおかしくなったり、そもそもglbとして正しく出力できなかったりと様々です。
Blenderで変換している物もメッシュとしては正確ですが、スケールがNeosで自動認識できずその点だけ頭を抱えています。
 以下はMaya FBXとしてKarinちゃんの改変前提になっていない方で変換を試してみています。
 ModelconvでASCII化したところ、FBX Version: 7700となっておりこのままではNeosに持ち込むことが出来ません。
(Karinちゃんは改変前提のFBXも用意してくれているので、一般向けにはそちらで問題ないですが…テストって大事ですからね)。

  • Blender: 以下のようなpythonを書いてbatを書いたところ、変換はできたもののスケールがおかしい。スケールだけ直せばものにできそう。

下の縁の部分が本来自分たちが生活してるところ。天井人みたいになってる(
サイズだけ直せば割と何とかなりそう。指も正確。

# Licnese under NYSL

import bpy
import sys
import os
import argparse
if '__main__' == __name__:
    parser = argparse.ArgumentParser()
    parser.add_argument('--input', required=True)
    parser.add_argument('--output', required=True)
    parser.add_argument('--fbx', required=False)
    parser.add_argument('--maya', required=False)
    
    args = parser.parse_args(sys.argv[sys.argv.index('--') + 1:])
    
    input = args.input
    output = args.output
    fbx = args.fbx
    maya = args.maya

    if(maya == True):
        bpy.ops.import_scene.fbx(filepath=input, use_anim=False, automatic_bone_orientation=True, force_connect_children=True, ignore_leaf_bones=True, use_prepost_rot=False)   
    else:
        bpy.ops.import_scene.fbx(filepath=input, use_anim=False, use_prepost_rot=False)

    if fbx:
        bpy.ops.export_scene.fbx(filepath=output, embed_textures=True, path_mode='COPY', object_types={'ARMATURE', 'MESH'}, global_scale=0.01)
    else:
        bpy.ops.export_scene.gltf(filepath=output, export_format="GLB")

  • modelconv: binzumeさん制作の個人ツール。どうやらglbの出力にバグを抱えているようで、正常に出力されないです(gltf-validatorにかけたところエラーが出てNeosに入らない。gltf-viewerでは見えるのでもしかするとGLB->GLBで治るかも?法線が反転してるけど直った(法線直すぐらいはNeosで出来る)ものの、指がおかしい。これ別記事にします)


今までで一番きれいに出ているが…


下になるのがほぼ正解のところ、上の様に指がおかしくなってしまう(写真ではわかりづらいが、変換すると相当おかしいことに気づく

  • FBX2gltf: facebookが作成していたFBX->gltfに変換するツール。正確に出そうな気配はしているものの、一部モデルにてメッシュが壊れてしまう問題に見舞われています。

GLBについて

そのうち書きます。

Discussion