这里介绍的是PMX格式的解析


  • 网站研运

    相关的索引大小参考

    ○Index参照のバイトサイズ
    各データのIndex参照値は データの総数に対して 1,2,4バイトで最适化。対象は、顶点
    テクスチャ(内部テーブル管理)
    材质
    ボーン
    モーフ
    刚体の各项目。参照している侧のIndex値が可変サイズになります。各データサイズについてはPMXヘッダに记载されます。 ※データ数の范囲とバイトサイズの関系 顶点 8/16bitのみ符号なしとして扱います。・顶点 符号なし
    [バイトサイズ] : 顶点数范囲
    1 : 0 ~ 255
    2 : 256 ~ 65535
    4 : 65536 ~ 2147483647 ※符号ありになるので注意
    ・ボーン/テクスチャ/材质/モーフ/刚体 符号あり
    [バイトサイズ] : データ数范囲
    1 : 0 ~ 127
    2 : 128 ~ 32767
    4 : 32768 ~ 2147483647 ※ボーンや刚体などは 1を非参照値として扱います。材质は材质モーフにより 1:全材质とみなします。
    ※PMDエディタ内ではIndex参照は基本的にすべて int(符号あり32bit) で管理しています。

    PMX文件结构构造

    ●PMXのデータ构造概要 先头 PMXヘッダ

    モデル情报

    顶点数 [int]
    顶点 * 顶点数

    面数 [int]
    参照顶点Index * 面数

    テクスチャ数 [int]
    テクスチャパス * テクスチャ数

    材质数 [int]
    材质 * 材质数

    ボーン数 [int]
    ボーン * ボーン数

    モーフ数 [int]
    モーフ * モーフ数

    表示枠数 [int]
    表示枠 * 表示枠数

    刚体数 [int]
    刚体 * 刚体数

    Joint数 [int]
    Joint * Joint数 终了
    各要素数は int (4バイト) で固定。各データ内部は可変サイズで记录されるので注意。


  • 网站研运

    模型的头

    ●PMXヘッダ 4 : byte[4] | "PMX " | ASCIIで 0x50,0x4d,0x58,0x20 ※末尾空白に注意 (PMX1.0は"Pmx "になっているので间违えないように)
    4 : float | ver (2.0) ↑ここまでマジックナンバー 1 : byte | 后続するデータ列のバイトサイズ PMX2.0は 8 で固定
    n : byte[8] | byte * バイトサイズバイト列 - byte
    [0] - エンコード方式 | 0:UTF16 1:UTF8
    [1] - 追加UV数 | 0~4 详细は顶点参照 [2] - 顶点Indexサイズ | 1,2,4 のいずれか
    [3] - テクスチャIndexサイズ | 1,2,4 のいずれか
    [4] - 材质Indexサイズ | 1,2,4 のいずれか
    [5] - ボーンIndexサイズ | 1,2,4 のいずれか
    [6] - モーフIndexサイズ | 1,2,4 のいずれか
    [7] - 刚体Indexサイズ | 1,2,4 のいずれか

    模型的名称等

    ●モデル情报 4 + n : TextBuf | モデル名
    4 + n : TextBuf | モデル名英
    4 + n : TextBuf | コメント
    4 + n : TextBuf | コメント英

    模型的顶点

    ●顶点 ○追加UVについて
    PMXの顶点には追加UV(中身は4Dベクトル)を最大4つまで格纳することが可能。追加数はヘッダで指定される。
    尚、追加UV数はファイルサイズに大きく影响するので、不要なら入れない状态が望ましい。 ○ウェイトについて
    1顶点につき最大4ボーンまでのウェイト情报を格纳可能。
    格纳方法は対応ボーン数及びSDEFに関连し、 BDEF1
    BDEF2
    BDEF4
    SDEF の 4パターンに分类される(1byteで形式记录)
    记录されるデータは、(ボーンIndex参照をintとして仮定) BDEF1 : int | 4 | ボーンのみ
    BDEF2 : int,int,float | 43 | ボーン2つと、ボーン1のウェイト値(PMD方式)
    BDEF4 : int
    4, float4 | 48 | ボーン4つと、それぞれのウェイト値。ウェイト合计が1.0である保障はしない
    SDEF : int,int,float, float33
    | 4
    12 | BDEF2に加え、SDEF用のfloat3(Vector3)が3つ。実际の计算ではさらに补正値の算出が必要(一応そのままBDEF2としても使用可能) と可変サイズになるので注意。
    [顶点データ] 12 : float3 | 位置(x,y,z)
    12 : float3 | 法线(x,y,z)
    8 : float2 | UV(u,v) 16 * n : float4[n] | 追加UV(x,y,z,w) PMXヘッダの追加UV数による
    n:追加UV数 0~4 1 : byte | ウェイト変形方式 0:BDEF1 1:BDEF2 2:BDEF4 3:SDEF ※変形方式により継続データが异なる/参照Indexは-1:非参照の场合があるので注意

    BDEF1 ->
    n : ボーンIndexサイズ | ウェイト1.0の単一ボーン(参照Index)

    BDEF2 ->
    n : ボーンIndexサイズ | ボーン1の参照Index
    n : ボーンIndexサイズ | ボーン2の参照Index
    4 : float | ボーン1のウェイト値(0~1.0), ボーン2のウェイト値は 1.0-ボーン1ウェイト

    BDEF4 ->
    n : ボーンIndexサイズ | ボーン1の参照Index
    n : ボーンIndexサイズ | ボーン2の参照Index
    n : ボーンIndexサイズ | ボーン3の参照Index
    n : ボーンIndexサイズ | ボーン4の参照Index
    4 : float | ボーン1のウェイト値
    4 : float | ボーン2のウェイト値
    4 : float | ボーン3のウェイト値
    4 : float | ボーン4のウェイト値 (ウェイト计1.0の保障はない)

    SDEF ->
    n : ボーンIndexサイズ | ボーン1の参照Index
    n : ボーンIndexサイズ | ボーン2の参照Index
    4 : float | ボーン1のウェイト値(0~1.0), ボーン2のウェイト値は 1.0-ボーン1ウェイト
    12 : float3 | SDEF-C値(x,y,z)
    12 : float3 | SDEF-R0値(x,y,z)
    12 : float3 | SDEF-R1値(x,y,z) ※修正値を要计算 ↑ウェイトここまで 4 : float | エッジ倍率 材质のエッジサイズに対しての倍率値

    模型的面

    ●面 n : 顶点Indexサイズ | 顶点の参照Index ※3点(3顶点Index)で1面
    材质毎の面数は材质内の面(顶点)数で管理 (同PMD方式)

    模型的材质等属性

    ●テクスチャ材质内で参照されるテクスチャパスのテーブル 4 + n : TextBuf | テクスチャパス ※材质からはこちらのIndexを参照。テクスチャ/スフィア/个别Toonで一括して利用
    ※共有Toon -> toon01.bmp~toon10.bmp はテクスチャテーブルには入れないので注意 ※PMDと同様にモデル位置を基准としてサブフォルダ指定が可能
    パス区切りについてはシステム侧で认识可能な文字(''or'/'など)とし、PMXとして固定はしない。


  • 网站研运

    模型的材质

    ●材质 4 + n : TextBuf | 材质名
    4 + n : TextBuf | 材质名英
    16 : float4 | Diffuse (R,G,B,A)
    12 : float3 | Specular (R,G,B)
    4 : float | Specular系数
    12 : float3 | Ambient (R,G,B)
    1 : bitFlag | 描画フラグ(8bit) 各bit 0:OFF 1:ON
    0x01:両面描画, 0x02:地面影, 0x04:セルフシャドウマップへの描画, 0x08:セルフシャドウの描画,
    0x10:エッジ描画 16 : float4 | エッジ色 (R,G,B,A)
    4 : float | エッジサイズ n : テクスチャIndexサイズ | 通常テクスチャ, テクスチャテーブルの参照Index
    n : テクスチャIndexサイズ | スフィアテクスチャ, テクスチャテーブルの参照Index ※テクスチャ拡张子の制限なし
    1 : byte | スフィアモード 0:无効 1:乗算(sph) 2:加算(spa) 3:サブテクスチャ(追加UV1のx,yをUV参照して通常テクスチャ描画を行う) 1 : byte | 共有Toonフラグ 0:継続値は个别Toon 1:継続値は共有Toon

    共有Toonフラグ:0 の场合
    n : テクスチャIndexサイズ | Toonテクスチャ, テクスチャテーブルの参照Index 共有Toonフラグ:1 の场合
    1 : byte | 共有Toonテクスチャ[0~9] > それぞれ toon01.bmp~toon10.bmp に対応

    ↑どちらか一方なので注意
    4 + n : TextBuf | メモ : 自由栏/スクリプト记述/エフェクトへのパラメータ配置など 4 : int | 材质に対応する面(顶点)数 (必ず3の倍数になる)

    模型的骨骼

    ●ボーン 4 + n : TextBuf | ボーン名
    4 + n : TextBuf | ボーン名英
    12 : float3 | 位置
    n : ボーンIndexサイズ | 亲ボーンのボーンIndex
    4 : int | 変形阶层
    2 : bitFlag*2 | ボーンフラグ(16bit) 各bit 0:OFF 1:ON
    ○ボーンフラグ
    0x0001 : 接続先(PMD子ボーン指定)表示方法 > 0:座标オフセットで指定 1:ボーンで指定
    0x0002 : 回転可能
    0x0004 : 移动可能
    0x0008 : 表示
    0x0010 : 操作可
    0x0020 : IK
    0x0100 : 回転付与
    0x0200 : 移动付与
    0x0400 : 轴固定
    0x0800 : ローカル轴
    0x1000 : 物理后変形
    0x2000 : 外部亲変形 ※それぞれの机能详细は后述の机能概要で行います。
    ↓フラグによって継続する格纳データが変化するので注意
    接続先:0 の场合
    12 : float3 | 座标オフセット, ボーン位置からの相対分接続先:1 の场合
    n : ボーンIndexサイズ | 接続先ボーンのボーンIndex

    回転付与:1 または 移动付与:1 の场合
    n : ボーンIndexサイズ | 付与亲ボーンのボーンIndex
    4 : float | 付与率

    轴固定:1 の场合
    12 : float3 | 轴の方向ベクトル

    ローカル轴:1 の场合
    12 : float3 | X轴の方向ベクトル
    12 : float3 | Z轴の方向ベクトル ※フレーム轴算出方法は后述

    外部亲変形:1 の场合
    4 : int | Key値

    IK:1 の场合 IKデータを格纳
    n : ボーンIndexサイズ | IKターゲットボーンのボーンIndex
    4 : int | IKループ回数 (PMD及びMMD环境では255回が最大になるようです)
    4 : float | IKループ计算时の1回あたりの制限角度 > ラジアン角 | PMDのIK値とは4倍异なるので注意
    4 : int | IKリンク数 : 后続の要素数
    <IKリンク>
    n : ボーンIndexサイズ | リンクボーンのボーンIndex
    1 : byte | 角度制限 0:OFF 1:ON

    角度制限:1の场合
    12 : float3 | 下限 (x,y,z) > ラジアン角
    12 : float3 | 上限 (x,y,z) > ラジアン角

    </IKリンク>

    • IKリンク数

    模型的形变

    ●モーフ ○モーフ种类
    格纳可能なモーフは大别して、顶点モーフ
    UVモーフ
    ボーンモーフ
    材质モーフ
    グループモーフの5种类。さらにUVモーフは、UV/追加UV1~4の计5种类に分类される。
    ※追加UV数によっては不要なUVモーフが格纳されることがあるが、モーフ侧は特に削除などは行わないので注意。
    それぞれ、
    ○顶点モーフ
    n : 顶点Indexサイズ | 顶点Index
    12 : float3 | 座标オフセット量(x,y,z)
    ○UVモーフ
    n : 顶点Indexサイズ | 顶点Index
    16 : float4 | UVオフセット量(x,y,z,w) ※通常UVはz,wが不要项目になるがモーフとしてのデータ値は记录しておく
    ○ボーンモーフ
    n : ボーンIndexサイズ | ボーンIndex
    12 : float3 | 移动量(x,y,z)
    16 : float4 | 回転量 クォータニオン(x,y,z,w)
    ○材质モーフ
    n : 材质Indexサイズ | 材质Index > 1:全材质対象
    1 : オフセット演算形式 | 0:乗算, 1:加算 详细は后述
    16 : float4 | Diffuse (R,G,B,A) 乗算:1.0/加算:0.0 が初期値となる(同以下)
    12 : float3 | Specular (R,G,B)
    4 : float | Specular系数
    12 : float3 | Ambient (R,G,B)
    16 : float4 | エッジ色 (R,G,B,A)
    4 : float | エッジサイズ
    16 : float4 | テクスチャ系数 (R,G,B,A)
    16 : float4 | スフィアテクスチャ系数 (R,G,B,A)
    16 : float4 | Toonテクスチャ系数 (R,G,B,A)
    ○グループモーフ
    n : モーフIndexサイズ | モーフIndex ※仕様上グループモーフのグループ化は非対応とする
    4 : float | モーフ率 : グループモーフのモーフ値 * モーフ率 = 対象モーフのモーフ値を个々のモーフオフセットとする。


  • 网站研运

    [モーフデータ] 4 + n : TextBuf | モーフ名
    4 + n : TextBuf | モーフ名英 1 : byte | 操作パネル (PMD:カテゴリ) 1:眉(左下) 2:目(左上) 3:口(右上) 4:その他(右下) | 0:システム予约 1 : byte | モーフ种类 - 0:グループ, 1:顶点, 2:ボーン, 3:UV, 4:追加UV1, 5:追加UV2, 6:追加UV3, 7:追加UV4, 8:材质 4 : int | モーフのオフセット数 : 后続の要素数
    オフセットデータ * n | モーフ种类に従ってオフセットデータを格纳 ※异なる种类の混合は不可
    ※材质モーフの演算形式について
    复数のモーフからの呼び出しを考虑して、乗算用の材质モーフ値と加算用の材质モーフ値は别管理が望ましい。
    想定している动作は、モーフ设定の分だけ乗算分を乗算/加算分を加算して保持、描画时に、材质値 x 乗算値 + 加算値 でモーフ适用を行う。
    乗算/加算仕様があるのは、初期状态で完全透过(A:0)→非透过(A:1) といったモーフ构造を乗算のみでは作成できないため。
    また乗算0+加算により、(元の材质値に関わらず)任意の指定値への変换も简易になる。テクスチャ(テクスチャ/スフィア/Toon)のモーフA値(非透过度)はテクスチャのRGB透过合成(乗算:白(1,1,1)との比率混合/加算:黒(0,0,0)との比率混合)に使用。
    描画に使用するテクスチャA値はモーフ适用后も元のテクスチャの値を使うこと。

    骨骼、形变以及表示框架

    ●表示枠ボーン/モーフを共通化して格纳可能
    PMDエディタでは Root用とPMD互换の表情枠を特殊枠として初期配置される。 4 + n : TextBuf | 枠名
    4 + n : TextBuf | 枠名英 1 : byte | 特殊枠フラグ - 0:通常枠 1:特殊枠 4 : int | 枠内要素数 : 后続の要素数
    <枠内要素>
    1 : byte | 要素対象 0:ボーン 1:モーフ

    要素対象:0の场合
    n : ボーンIndexサイズ | ボーンIndex 要素対象:1の场合
    n : モーフIndexサイズ | モーフIndex

    </枠内要素>

    • 枠内要素数
      ※PMXの初期状态では、表示枠:0(先头) -> "Root"(特殊枠指定) | 枠内に ボーン:0(先头ボーン)を追加。対応されれば枠のルート位置への设定用
      表示枠:1 -> "表情"(特殊枠指定) | PMD変换时は枠内に 表情枠 と同様の配置 (一部复制処理などで自动的に追加される场合あり) という特殊枠が配置されます。特殊枠判定は、特殊枠フラグ1及び枠名で判断(编集时に误って削除しないように注意)

    刚体

    ●刚体 ※パラメータはPMDの刚体と同様 4 + n : TextBuf | 刚体名
    4 + n : TextBuf | 刚体名英 n : ボーンIndexサイズ | 関连ボーンIndex - 関连なしの场合は-1
    1 : byte | グループ
    2 : ushort | 非冲突グループフラグ
    1 : byte | 形状 - 0:球 1:箱 2:カプセル
    12 : float3 | サイズ(x,y,z)
    12 : float3 | 位置(x,y,z)
    12 : float3 | 回転(x,y,z) -> ラジアン角
    4 : float | 质量
    4 : float | 移动减衰
    4 : float | 回転减衰
    4 : float | 反発力
    4 : float | 摩擦力
    1 : byte | 刚体の物理演算 - 0:ボーン追従(static) 1:物理演算(dynamic) 2:物理演算 + Bone位置合わせ

    关节

    ●Joint ※パラメータはPMDのJointと同様
    4 + n : TextBuf | Joint名
    4 + n : TextBuf | Joint名英
    1 : byte | Joint种类 - 0:スプリング6DOF | PMX2.0では 0 のみ(拡张用)

    Joint种类:0 の场合
    n : 刚体Indexサイズ | 関连刚体AのIndex - 関连なしの场合は-1
    n : 刚体Indexサイズ | 関连刚体BのIndex - 関连なしの场合は-1
    12 : float3 | 位置(x,y,z)
    12 : float3 | 回転(x,y,z) -> ラジアン角
    12 : float3 | 移动制限-下限(x,y,z)
    12 : float3 | 移动制限-上限(x,y,z)
    12 : float3 | 回転制限-下限(x,y,z) -> ラジアン角


  • 网站研运

    12 : float3 | 回転制限-上限(x,y,z) -> ラジアン角 12 : float3 | バネ定数-移动(x,y,z)
    12 : float3 | バネ定数-回転(x,y,z)

    杂项

    -- ■机能概要 ●追加UV PMXの各顶点には4つまで4Dベクトルを追加配置可能。
    内部データ的にはPMXヘッダの指定に系わらず常に 4つの4Dベクトルを配置しておくことが望ましい。・エフェクトから见た顶点バッファ例(セマンティックとの関系) struct PmxVertex{ float3 Position : POSITION;
    float3 Normal : NORMAL; float2 UV : TEXCOORD0; float4 UVA1 : TEXCOORD1;
    float4 UVA2 : TEXCOORD2;
    float4 UVA3 : TEXCOORD3;
    float4 UVA4 : TEXCOORD4; ...
    }; ※UVモーフの対象になっている追加UVがPMXファイルの顶点に存在しない场合でも、
    (0,0,0,0)がデフォルト値として配置されていれば、UVモーフ→エフェクトから任意の処理が可能になると思われます。 ●ボーン変形 □変形顺序
    ボーンの変形顺序は 1. 物理前/后
    2. 阶层顺
    3. Index顺にて调整(正规化)后、顺に変形を行う。1つのボーンにおけるローカル変形処理はIKからのリンク参照を除いて1回のみ。例:
    A, 前,阶层2,Index0
    B, 后,阶层1,Index1
    C, 前,阶层0,Index2
    D, 后,阶层0,Index3
    E, 前,阶层0,Index4
    F, 前,阶层1,Index5 ↓ C, 前,阶层0,Index2
    E, 前,阶层0,Index4
    F, 前,阶层1,Index5
    A, 前,阶层2,Index0 <物理演算> D, 后,阶层0,Index3
    B, 后,阶层1,Index1 という顺序で変形処理を行う。
    □変形パラメータ
    1つのボーンが所持する変形パラメータは以下の通り・ユーザー操作による 回転/移动量 | PMDエディタ内ではスケール値も所持
    ・ボーンモーフによる 回転/移动量
    ・付与ありの场合 付与回転/付与移动量 | 保存しておくことで多重付与が可能になる
    ・IKリンクの场合 IK回転量・ボーン変形処理によるローカル変形状态
    ・顶点など形状変形用のグローバル変形状态 ※回転はクォータニオン、移动は3Dベクトル、変形状态は同次変换行列を想定
    □付与について付与は付与亲ボーンの・ユーザー操作による 回転/移动量
    ・ボーンモーフによる 回転/移动量
    ・付与ありの场合 付与回転/付与移动量
    ・IKリンクの场合 IK回転量上记変形量を自分自身の変形量にさらに加える変形を行う。
    回転/移动は别项目としてそれぞれ追加される(片方だけでもOK) 付与亲の亲子変形によるボーン変形状态は付与対象ではないので注意。付与変形を行った后、付与した変形量をボーン内に保存し、
    别の付与ボーンから付与亲参照された场合にその変形量を渡す→多重付与构造当然ながら付与ボーンでも亲子関系による通常のボーン変形は可能となる。
    □変形パラメータの适用顺序 0. すべてのボーンのローカル/グローバル変形状态を初期化

    1. ユーザー操作の回転/移动量をすべてのボーンに设定
    2. ボーンモーフによる回転/移动量を対応するボーンに设定 3. 変形顺序の正规化
    3. 正规化后の顺にボーン変形を行う 4.1. ボーンのローカル変形(详细は后述)
      4.2. IKの场合IK変形
      以上の手顺ですべてのボーンを変形。物理変形后の适用は、物理変形によるグローバル変形量をローカル変形量に一旦戻し、
      それを亲参照する変形を継続することで行われる。 □ローカル変形顺序 ※暂定设定なので顺序など変更になるかもしれません
      ※PMDエディタ0.1.3.6以降、IKリンクの回転顺序を変更(MMDのIK変形と合致させるため/前→后) ・回転量(クォータニオン)の计算
      [亲付与回転量(or 亲回転 * 亲回転モーフ) * 付与亲のIKリンク]:付与率 * 回転 * 回転モーフ * IKリンク

  • 网站研运

    计算例:
    0. 回転量を単位回転量として开始 1. 当该ボーンが付与の场合 :
    1.1 付与亲が付与ボーンの场合 : * 付与亲の付与回転量(※后述) <> 付与ボーンではない场合 : * 付与亲の回転 * 付与亲の回転モーフ
    1.2 付与率が1以外の场合 : 2.1/2.2の回転量を付与率で补正(Quaternion.Slerp()想定)
    1.3 付与亲がIKリンクの场合 : * 付与亲のIKリンク回転量 1.4 付与亲のIKリンク~回転モーフ(付与率で补正済み)~回転モーフ を当该ボーンの付与回転量として保存(别の付与ボーンの付与亲になった场合の多重付与変形用)
    ※付与回転量 → { [亲付与回転量(or 亲回転 * 亲回転モーフ) * 付与亲のIKリンク]:付与率 * 回転 * 回転モーフ } 2. 当该ボーンの回転量追加 : * 回転 * 回転モーフ 3. 当该ボーンがIKリンク回転量を持つ场合 : * IKリンク回転量 ※IKリンク回転量は当该ボーンが付与参照される间に别のIKボーンによって変形/更新される可能性があるので、
    それを考虑して付与回転量から一旦外す形(付与参照时に再计算)になっています。
    乗算顺序が少々怪しいのと、付与亲のIKリンクは参照时に确定されてしまうなどの问题がありますが、暂定的にこのような计算顺序としておきます。
    ・移动量(3Dベクトル)の计算
    [亲付与移动量(or 亲移动 + 亲移动モーフ)]*付与率 + 移动 + 移动モーフ

    计算例:(基本的に回転と同じ) 0. 移动量を0移动量として开始 1. 当该ボーンが付与の场合 :
    1.1 付与亲が付与ボーンの场合 : + 付与亲の付与移动量(※后述) <> 付与ボーンではない场合 : + 付与亲の移动 + 付与亲の移动モーフ
    1.2 付与率が1以外の场合 : 1.1の移动量を付与率で补正(付与率乗算でOK) 1.3 亲付与移动量(付与率で补正済み)~移动モーフ を当该ボーンの付与移动量として保存(别の付与ボーンの付与亲になった场合の多重付与変形用)
    ※付与移动量 → { [亲付与移动量(or 亲移动 + 亲移动モーフ)]:付与率 + 移动 + 移动モーフ } 2. 当该ボーンの移动量追加 : + 移动 + 移动モーフ

    算出された回転/移动の両値から、ローカル行列 = (スケール行列) * 回転行列 * 移动行列を计算、亲ボーンからのオフセット及び亲のローカル行列に合成する。当该ボーンがIKボーンの场合、(IKボーン/IKターゲットの位置関系より)IKリンクのIK回転量を再计算 → ボーンのIKリンク回転量を更新。
    PMXのIK変形はIKボーンの変形顺序时にそのまま変形を行う(PMDのように全ボーン変形后などの顺序固定ではないので注意)
    以上の手顺ですべてのボーンのローカル変形を更新。物理変形后の适用は、物理変形によるグローバル変形量をローカル変形量に戻し、
    それを亲参照する変形を継続することで行われる。 □変形顺序による変形量の参照について亲子変形による伝达が必要な変形は、亲→子顺にボーン変形を呼び出す必要がある。
    子→亲の顺序では正しく変形しない。ユーザー操作量を参照する付与伝达の场合は、付与亲の変形前にボーン変形が呼び出されても正常に変形する
    (ただし1段阶のみ/多重付与を行う场合は付与亲が先に変形されている必要がある) ボーンモーフを参照する付与の场合も同様である。
    □制限轴 PMDの捩りボーンと同系の仕组み。捩りボーン同様ボーンの内部変形量には関与しない。
    操作时の移动及び回転轴を指定した轴方向で固定化する机能を有する。
    □ローカル轴操作上のローカルフレームを任意に定义するための轴方向パラメータ。
    X/Zで指定するが、それらが直交関系ではない场合もあるので以下の计算式で补正する。 Y = Vector3.Cross(Z, X); // Vector3.Cross():ベクトル积
    Z' = Vector3.Cross(X, Y); ※PMDでは腕関连のみ子ボーンの方向をX、手前を-Zとする轴でローカルフレームが自动作成される模様。
    □外部亲変形指定されたボーンはモデル外部のボーンを亲ボーンとして変形することが可能。
    その场合の识别用IDとしてKey値(int)が用意されている。この构成を利用することで、例えばモデルをアクセサリのように特定のモデルの特定ボーンに関系付ける构造や、
    腕IKを使った手同士の接続及び操作モデルによる一括操作を実现することが可能となる。 ※ただし、これらの机构を接続するための外部仕様が非常にややこしいので、実现の可能性は低いと思われる。
    □ボーンの属性(フラグ値)について 0x0001 : 接続先
    0x0002 : 回転可能
    0x0004 : 移动可能
    0x0008 : 表示
    0x0010 : 操作可
    0x0020 : IK
    0x0100 : 回転付与
    0x0200 : 移动付与
    0x0400 : 轴固定
    0x0800 : ローカル轴
    0x1000 : 物理后変形
    0x2000 : 外部亲変形とあるが、この中でボーンの変形特性に系わる属性は 0x0020 : IK
    0x0100 : 回転付与
    0x0200 : 移动付与
    0x1000 : 物理后変形
    0x2000 : 外部亲変形のみで、残りの 0x0001 : 接続先
    0x0002 : 回転可能
    0x0004 : 移动可能
    0x0008 : 表示
    0x0010 : 操作可
    0x0400 : 轴固定
    0x0800 : ローカル轴は、表示及び操作时の制限项目になる。
    ボーンの変形特性や内部値には関与しないので注意。
    □PMDとの互换性 IK/回転影响下 以外のボーン构造は问题なく変换可能。
    上记2种类は、亲子系列での変形后、特定タイミングでさらに特定の変形を行うので、
    基本的に1ボーン1度のみの変形が基准であるPMXのボーン构造ではうまく変换できない场合がある。 PMD→PMX 変换では、 IKボーン及びそのIKを亲としている系列の変形阶层を 0→1
    回転影响下以下の変形阶层を 0→2 にすべて変换して対応しているが、ボーン构造によってはこの変换では异なる変形様式になる可能性があるので注意。対応方法としては、PMDの复数回変形の构造に対して、PMX侧も复数のボーン构造(分割したボーンは亲子结合or付与结合)を
    用いることが考えられる。


  • 网站研运

    虽然过去了四年了,但是还是很有参考的价值的。
    这边儿正在继续努力地根据参考文献制作编辑器哦。



  • 不是有个webgl的mmd编辑器么


  • 网站研运

    @MidoriYakumo 哪里哪里?有介绍链接么?



  • @MidoriYakumo 这个基于WebGL制作的编辑器,好像只支持PMD格式。🍋



  • 留着备用。这个链接


Log in to reply
 

走马观花

最近的回复

  • C

    Qt for MCU需要商业授权的

    read more
  • Qt for MCUs

    搭建Qt for MCUs PC端开发环境。qt for mcus提供了一个完整的图形框架和工具包,包含了在MCUs上设计、开发和部署gui所需的一切。它允许您在裸机或实时操作系统上运行应用程序。

    先决条件

    开发主机环境支持仅限于Windows 10

    MSVC compiler v19.16 (Visual Studio 2017 15.9.9 or newer) x64

    CMake v3.13 or newer (you can install it using the Qt Online installer) x64

    使用Qt联机安装程序安装Qt for MCUs,该安装程序可通过Qt帐户下载

    安装Qt 5.14和Qt Creator 4.11 or higher

    安装链接

    › Qt: https://account.qt.io/downloads
    › CMake: https://cmake.org/download/
    › Python 2.7 32-bit: https://www.python.org/downloads/release/python-2716/
    › Arm GCC: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnutoolchain/gnu-rm/downloads
    › J-Link Software Pack: https://www.segger.com/downloads/jlink/JLink_Windows.exe
    › J-Link OpenSDA Firmware: https://www.segger.com/downloads/jlink/OpenSDA_MIMXRT1050-EVKHyperflash
    › STM32CubeProgrammer: https://www.st.com/en/development-tools/stm32cubeprog.html
    › STM32 ST-LINK Utility: https://www.st.com/en/development-tools/stsw-link004.html​​​​​​​

    Qt Creator设置 启用Qt Creator插件 选择“帮助>关于插件”,然后从列表中选择“MCU支持(实验性)”插件,重新启动Qt Creator以应用更改
    替代文字 为MCU创建Qt工具包

    选择工具>选项>设备>MCU

    选择Qt for MCUs-Desktop 32bpp作为目标

    如果尚未设置,请提供Qt for MCUs安装目录的路径。

    单击Apply应用。

    替代文字

    替代文字
    替代文字

    注意:

    编译器要选X64,Qt版本要选64bit,CMake Tool选x64

    打开恒温器项目demo

    选择文件>打开文件或项目。。。

    打开CMakefiles.txt文件来自thermo文件夹的文件。

    选择Qt作为MCU-桌面32bpp套件。

    单击“配置项目”以完成。

    替代文字

    问题

    开发主机环境支持仅限于Windows 10

    C++编译失败,文本大字体.pixelSize.

    文本类型无法正确呈现需要复杂文本布局的unicode序列。对复杂文本使用StaticText

    read more
  • H

    hi 有问题请教你,方便加个联系方式吗

    read more
  • boost.asio是一个很棒的网络库,这回儿我也开始系统地学习起来了。想想当年接触boost,也有八年多了。这次开始接触boost,觉得既熟悉又陌生。熟悉的是小写字母+下划线的命名方式、晦涩的模板、很慢的编译速度以及较大的程序体积,陌生的是asio的各种概念:io服务、接收器、套接字等等:我之前对网络编程不是非常了解。

    于是根据我的理解,参考《Boost.Asio C++网络编程》实现了这样一个简单的客户端和服务端通信的例子,例子非常简单,还不完善,但是幸运的是,可以在本机上互通了。
    下面是客户端的代码:

    #include <iostream> #include <boost/asio.hpp> #include <boost/proto/detail/ignore_unused.hpp> using namespace std; using namespace boost::asio; using namespace boost::system; using namespace boost::proto::detail;// 提供ignore_unused方法 void writeHandler( const boost::system::error_code& ec, size_t bytesTransferred ) { if ( ec ) { cout << "Write data error, code: " << ec.value( ) << "transferred: " << bytesTransferred << endl; } else { cout << "OK! " << bytesTransferred << "bytes written. " << endl; } } int main(int argc, char *argv[]) { ignore_unused( argc ); ignore_unused( argv ); io_service service; ip::tcp::socket sock( service ); ip::tcp::endpoint ep( ip::address::from_string( "127.0.0.1" ), 6545 ); boost::system::error_code ec; sock.connect( ep, ec ); if ( ec ) { cout << "Connect error, code: " << ec.value( ) << ", We will exit." << endl; return ec.value( ); } else { char buf[1024] = "Hello world!"; sock.async_write_some( buffer( buf ), writeHandler ); sock.close( ); } return service.run( ); }

    下面是服务端的代码:

    #include <iostream> #include <boost/asio.hpp> #include <boost/proto/detail/ignore_unused.hpp> using namespace std; using namespace boost::asio; using namespace boost::system; using namespace boost::proto::detail;// 提供ignore_unused方法 void acceptHandle( const boost::system::error_code& code ) { cout << "Accepted." << endl; } int main(int argc, char *argv[]) { ignore_unused( argc ); ignore_unused( argv ); io_service service; ip::tcp::endpoint ep( ip::address::from_string( "127.0.0.1" ), 6545 ); boost::system::error_code ec; ip::tcp::socket sock( service ); ip::tcp::acceptor acceptor( service, ep ); acceptor.async_accept( sock, acceptHandle ); if ( ec ) { cout << "There is an error in server. code: " << ec.value( ) << endl; } return service.run( );// 阻塞运行 }

    运行结果是这样的:
    78448d7b-b3ae-42fc-9e2e-4dd2fbdac2c2-image.png

    我对boost.asio中几个概念的理解:

    io_service,这就是一个类似事件循环的东西,它为io设备提供服务,故名。不管是套接字、文件还是串口设备,都要使用它的服务。它的run()函数相当于启动了一个事件循环。一旦有消息了,即进行响应。这也是实现异步编程的重要基础。 socket,这个类则是套接字,可以处理TCP或者是UDP请求。有同步以及异步的处理方式,也有带异常以及不带异常的处理方式。 acceptor,接收器,仅仅是服务端使用。相当于其余框架中的listener,作接收用的。

    比较浅显,如果有不当之处,敬请指正。

    read more

关注我们

微博
QQ群