﻿MeshSimplification　パラメーター説明

2014.08.11 各種パラメーターについての説明を加筆・修正
2014.07.31 追加したパラメーターについて追加、ドキュメントの整理
2014.03.24 公開されていないオプションの説明の削除と、オプション引数を追加しました。
2014.02.24 新規計算方式リリースに合わせて、ReadMeを一新しました。


#################################################

パラメーター設定例

#################################################

-prq=1.0 -prtrll1=0.25 -prpf=1
頂点のみを考慮して、入力の面数の25％を目標に削減します。
ハードエッジ、オープンエッジ、特徴エッジなどは考慮しません。
特に削減率を下げる要因もない、初期設定による簡略化です。

-prq=1.0 -prtrll1=0.25 -prpf=5 -prfa=60 -prfela=40
頂点、UVを考慮して簡略化をおこないます。
特徴エッジの識別角を60度にしていして、特徴的な形状の保護を行います。
連続する特徴エッジのなす角度が40度未満のエッジが削減されます。

-pr -prq=1.0 -prtrll1=0.25 -prpf=7 -propp=2 -prluhe=45 -pruw=0.3
UV、法線を考慮し、UVハードエッジの保護を行います。法線ハードエッジは識別しません。
UVハードエッジは連続するエッジが45度未満の場合に縮退の対象となり、
UVのコストは、0.3倍されUVの影響を抑えています。

-pr -prtrll1=0.25  -prpf=7 -propp=2 -prq=1.0 -proela=30 -prluhe=30 -pruw=0.0 -prms
prmsで分かれたShapeを結合して、簡略化を実行します。
地形データなど、複数のShapeに分かれている場合には、-propp=1で頂点共有モードで実行するか
Shape結合を行う事で形状を保持した簡略化が行えます。


#################################################

削減率の設定

#################################################

以下のパラメーターで、基本的な削減率の設定を行います。
メッシュ簡略化は、指定された削減率までポリゴンを減らすことを目標におこないますが
他のパラメーターの設定によって、目標に到達する前に処理を打ち切る場合があります。

//------------------------------------------
TargetRate (--polygon_reduction_targetrate_lod_level_*)
//------------------------------------------
ポリゴンリダクションを行う場合の、削減後のポリゴン数を元のモデルに対してXX％で指定します。
10000ポリゴンの元モデルに対して、0.2を指定した場合は、2000ポリゴンのモデルを目標に簡略化を行います。
（※１）削減ポリゴン数はその他のパラメーターとの兼ね合いがあるため、必ずしも指定ポリゴン数に達するわけではありません。
（※２）限界に達した時点を処理を終えます。
型：Double 最小値:0.0 最大値:1.0 規定値:0.2

//------------------------------------------
Quality (--polygon_reduction_quality)
//------------------------------------------
縮退可能なエッジのコストを設定します。
初期コストの最大値から、XX％までを削除可能なエッジとしてマークします。
0.1を指定した場合、最大値の10％までを削除可能なエッジとして扱うことができます。

（※１）削減率の上がりにくい形状では、1.0をお試し下さい

型：Double 最小値:0.0 最大値:1.0 規定値：0.1


//#################################################

境界エッジ、特徴的エッジの設定

//#################################################
WingedEdge(エッジを参照している面が両サイドにあると考えるデータ構造）で説明します。
境界エッジとは、開放端、つまりエッジが一つの面にのみ参照され、方翼になっている状態です。
特徴的エッジとは、エッジの両翼の面のなす角度が指定の角度以上のものをいいます。
（※１）0の場合、どのエッジも削除されません。
（※２）90度の場合は全てのエッジが削除されます。

（※）境界エッジは、インデックスの違いによって検出されるため、データによっては非常に多い傾向にあり、
保護角を小さくとることで削減数が大きく落ちるだけでなく、保護角が存在することで形状への悪影響が
見られる事があります。したがって規定値では保護を行わない設定になっています。

//----------------------------------------------
Open Edge Lock Angle (--polygon_reduction_open_edge_lock_angle)
//----------------------------------------------
オープンエッジを削除する際に、オープンエッジ同士の連結をみて
エッジ間のなす角度によって、オープンエッジの縮退を抑制するパラメーターです。
0-90 を指定します。規定値は90度となっており、オープンエッジの保護を行いません。
（※１）オープンエッジ同士の連結が３未満になり、穴が埋まる場合はエラーとなります。

型:Double 最小:0.0 最大:90.0 規定値:90.0

//----------------------------------------------
Feature Angle (--polygon_reduction_feature_angle)
//----------------------------------------------
エッジの両翼の面が為す角度によって、エッジが特徴的なエッジであるかどうか？を指定します。
180が指定されている場合は、全てのエッジは特徴的なエッジとは識別しません。

型:Double 最小:0.0 最大:180.0 規定値:180.0

//----------------------------------------------
Feature Edge Lock Angle (--polygon_reduction_feature_edge_lock_angle)
//----------------------------------------------
特徴エッジを削除する際に、特徴エッジ同士の連結をみてエッジ間のなす角度によって、オープンエッジの縮退を抑制するパラメーターです。
0-90 を指定します。規定値は90度であり、特徴的エッジの保護を行わない設定です

型:Double 最小:0.0 最大:90.0 規定値:90.0

//#################################################

ハードエッジの設定

//#################################################

複数のプロパティが一つの頂点にアサインされているような頂点が接続したエッジをハードエッジといいます。
以下のパラメーターで、UV座標、法線、カラーの各プロパティのハードエッジを識別して保護する事が出来ます。
設定に従って、簡略化の際にハードエッジは、ハードエッジの連結を壊さない様に縮退を行います。

ハードエッジの縮退の可否は、連続したエッジの角度できまります。
連続したエッジのなす角度が指定の角度未満の場合は縮退の対象となりますが、
指定角度以上の場合は縮退の優先度が大きく下がるようになっています。

（※）PositionPolicy=ZeroOne時、以外では、角度は絶対的な制約にはなりません
　　　優先度設定で、角度の高いものはかなり後半まで動かないものの、削減率を優先して
　　　動かせるものがなくなり次第、簡略化の対象になります。
（※）既定値の90度の場合には、ハードエッジの識別を行いません。

PositionPolicy=ZeroOne時には、以下にご注意ください
（※）90度未満を指定する場合、ハードエッジが交差する地点は不動です。他にも角度による事無く不動な場合が幾つかあります。
（※）0の場合、どのエッジも削除されません。

//------------------------------------------
UvEdgeLockAngle (--polygon_reduction_lockuvhardedge)
//------------------------------------------
UVハードエッジが縮退可能な条件を、連続したUVハードエッジ同士の最大角度で設定します。
与えられた角度以下のエッジを縮退させます。
ハードエッジの識別は、インデックスの違いによって行われます。
UsedPropsのフラグに、TEXを追加してご利用下さい。

型:Double 最小:0.0 最大:90.0 規定値:90.0

//------------------------------------------
NormalEdgeLockAngle (--polygon_reduction_locknormalhardedge)
//------------------------------------------
Normalハードエッジが縮退可能な条件を、連続したNormalハードエッジ同士の最大角度で設定します。
与えられた角度以下のエッジを縮退させます。
ハードエッジの識別は、インデックスの違いによって行われます。
UsedPropsのフラグに、NOR　を追加してご利用下さい。

型:Double 最小:0.0 最大:90.0 規定値:90.0

//------------------------------------------
ColorEdgeLockAngle (--polygon_reduction_lockcolorhardedge)
//------------------------------------------
Colorハードエッジが縮退可能な条件を、連続したColorハードエッジ同士の最大角度で設定します。
与えられた角度以下のエッジを縮退させます。
ハードエッジの識別は、インデックスの違いによって行われます。
UsedPropsのフラグに、COL　を追加してご利用下さい。

型:Double 最小:0.0 最大:90.0 規定値:90.0

//#################################################

考慮するプロパティ設定

//#################################################
簡略化時に、どのプロパティの数値を利用するかを定義します。

//---------------------------------------------
UsedProps (--polygon_reduction_propflag)
//------------------------------------------
リダクション時に考慮するプロパティを指定するパラメーターです。
            VERT = 0x01, /// 頂点有効
            NOR = 0x02, ///  法線有効
            TEX = 0x04, ///  UV有効
            COL = 0x08, ///  頂点色有効
            BWT = 0x10, /// ブレンドウェイト有効
            BIN = 0x20, /// 従法線有効
            TAN = 0x40, /// 接線有効
            ALL  = 0xFF
となっており、これらの値を、論理和で組み合わせて指定します。
                (int)QEM_USE_PROP.VERT | (int)QEM_USE_PROP.NOR | (int)QEM_USE_PROP.TEX,
とした場合は、頂点と法線、UV座標が考慮されます。

（※１）指定したプロパティのハードエッジを、保護角が指定されている場合に考慮します。
（※２）保護角が90度指定であっても、コストの計算時には指定のプロパティは使われます。
型:Int32 規定値:(int)QEM_USE_PROP.VERT


//#################################################

コスト、簡略化後の位置の計算方法に関する設定

//#################################################

以下のパラメーターで、コスト計算と簡略化後の位置計算に関する設定を行えます。

//----------------------------------------------
PositionPolicy (--polygon_reduction_optimize_position_policy)
//----------------------------------------------
削減後の位置計算オプションです。エッジの縮退を行う際に、新しい位置座標をどのような方法で計算するか？
の方針を与えることが出来ます。
    Center = 0, // 必ずエッジの中心に移動
    ZeroOne = 1,　// いずれかの頂点を使用。Lv０との頂点共有を行います。（頂点を移動しない仕様）
    Optimize = 2, // エッジ上で最も最適な位置を求めて使用します。形状によらず、もっとも無難な設定です。
    CalcOptpos = 3, // 縮退後の位置を計算して、空間中で最適な位置を求めます

一般的な傾向ですが、
Optimize　：機械的、建物、の様な角ばった形状に適している
CalcOptpos：動物、人間など滑らかな形状に適している
ということが言えます。

（※１）ZeroOne時には、頂点共有が行われるため、指定したプロパティの種別に依らず
　　　　あらゆるハードエッジが考慮されます。
（※２）Optimize時には縮退対象のエッジ上のどこかを新頂点位置とするので、形状崩壊が起こりにくいです。
（※３）CalcOptpos時には、新しい頂点位置は最適化によって求められます。
　　　　エラーがある場合には、予測しない位置に移動することが有ります。
        バグとしてご報告頂ければ助かります。
        Marge Shapeと併用する場合には、UVが隣接するShapeのUV情報に引っ張られる傾向があります。
（※４）削減率は
        （削減率高）CalcOption >= Optimize = Center > ZeroOne（削減率低） の順です。

規定値：Optimize

//------------------------------------------
Smoothing (--polygon_reduction_smoothing)
//------------------------------------------
ポリゴンリダクションを行う際に、全体的に平滑化するような計算を行うか？を選択します。
このパラメーターを指定した場合、全体的に形状が平滑化されます。
特徴がはっきりした形状で、より効果的に機能します。
滑らかなオブジェクト（人や動物など）では、特徴的な形状が損なわれる場合があります。
建物などで特に有効です。

型：Bool  true: 有効　false: 無効 規定値:false

//----------------------------------------------
WeightPolicy (--polygon_reduction_policy)
//------------------------------------------
削減時の重み付けの戦略
            AreaBased  = 0, // 面積重視
            AngleBased = 1, // 形重視（正三角形に揃うようにする
            Default = 2     // 特に重み付けはしない（規定値
のどれかを指定します。

既定では、何も重み付けを行いませんが、もっとも形状に関する近似がいい結果が得られます。

AreaBasedを指定した場合、リダクションの結果、出来上がった全てのポリゴンが等面積になることを
重視するように、面積による重み付けが行われます。小さな面を消去したい場合にご利用ください。
AngleBasedを指定した場合、リダクションの結果、出来上がった全てのポリゴンが正三角形になることが
最も良い結果となるような重み付けが行われます。面の形をなるべく同じにしたい場合にご利用ください。

規定値：Default

//------------------------------------------
DistOfs (--polygon_reduction_distoffset)
//------------------------------------------
距離のオフセットです。
通常、エッジ縮退による体積の変化（≒平面との距離）を計算することで
効率的なポリゴンリダクションを行いますが、縮退によって、新頂点位置と平面との距離が変動しない
無限床のようなオブジェクトの場合、体積の変動がないため評価ができません。
そこで、オフセットを加える事で面積変動による評価を行えるようにします。
（※１）他のポリゴンに影響がないような小さな値をご設定頂ければ機能します。
（※２）例えば、0.0001などで十分です。
（※３）PositionPolicy=CalcOptposの際には、最適位置へ影響が出ます。
型：Double 最小値:0 最大値:DoubleMax　規定値:0



//#################################################

コスト計算時の各種ウェイト

//#################################################

各種の考慮するプロパティに応じて、必要な重みづけを行うことができます。
簡略化の結果が、UV座標に影響されすぎて形状が壊れている場合など
各プロパティの影響を考慮したい場合にしようします。
1.0の場合は、プロパティと頂点を対等に扱う事になるため、プロパティに影響されすぎる場合があります。

（※１）多くの場合、規定値で問題ないはずですが、影響が大きすぎる場合に調整などでご利用下さい。
（※２）0.0を与えた場合には、エッジ両端のいずれかを使う実質的に線形補間同等の効果をえます。
　　　　PositionPolicy=CalcOptpos時にプロパティの値が壊れている場合にお試しください。

//----------------------------------------------
Uv Weight (--polygon_reduction_uv_weight)
//----------------------------------------------
UVに対するスケール値、倍精度浮動小数で任意の値を設定可能です。
UVをより強く考慮してリダクションする場合は、より大きな値を設定します。
UVの影響が大きい場合には１より小さな値を設定して影響を弱めます。
7のフラグに、TEX　を追加してご利用下さい。

型:Double 最小:0 最大:DoubleMax 規定値:0.1

//----------------------------------------------
Normal Weight (--polygon_reduction_normal_weight)
//----------------------------------------------
頂点法線に対するスケール値、倍精度浮動小数で任意の値を設定可能です。
頂点法線をより強く考慮してリダクションする場合は、より大きな値を設定します。
頂点法線の影響が大きい場合には１より小さな値を設定して影響を弱めます
7のフラグに、NOR　を追加してご利用下さい。

型:Double 最小:0 最大:DoubleMax 規定値:0.1

//----------------------------------------------
Color Weight (--polygon_reduction_color_weight)
//----------------------------------------------
頂点カラーに対するスケール値、倍精度浮動小数で任意の値を設定可能です。
頂点カラーをより強く考慮してリダクションする場合は、より大きな値を設定します。
頂点カラーの影響が大きい場合には１より小さな値を設定して影響を弱めます
7のフラグに、COL　を追加してご利用下さい。

型:Double 最小:0 最大:DoubleMax 規定値:0.1


//----------------------------------------------
Animation Blend Weight (--polygon_reduction_anim_blend_weight)
//----------------------------------------------
Animation　Blend Weightに応じた頂点重みを計算する場合の基数です。
pow( 設定値, 計算値)で与えられる重みを計算します。
7のフラグに、BWT　を追加してご利用下さい。
型:Double 最小:0 最大:e(ネイピア数) 規定値:1.0

【補足】
重みの計算について
BlendWeight  b=｛x0,x1,x2,x3 ∈R｜
                          0<= x0 <=1.0, 0<= x1<=1.0, 0<= x2<=1.0, 0<= x3<=1.0,
                          x0+ x1+ x2+ x3 = 1.0}
に対して、
x0= x1= x2= x3=0.25を最大に、x0=1, x1=x2=x3=0（他も一緒）を最小にする
様な重みを考えます。

分散v を
w = (x0 + x1 + x2 + x3)/4
v  =  ((x0 – w)^2 + (x1 – w)^2 + (x2 – w)^2 + (x3 – w)^2)/4
v > 1e-4 かつ v < 1e4
で取り、重みは　pow(basenum, 1.0/v ) にします。

この時、basenumはユーザー入力変数で、 0< basenum <= e(ネイピア数)です
BlendWeightが２つしか設定されていない場合は、残り２つをゼロで扱います。
そうすることで、４つ（最大数）のBlendWeightの割り当てがある頂点を
最も重く扱う効果があります。

狙いとして、１より大きな数では平均的に数値が割り当てられてる場合を重く
１より小さな数では、一つしか値がない場合を重くとる様にすること、また１の
場合は重みなしとして扱う効果があります。


//#################################################

そのほか

//#################################################
//----------------------------------------------
Marge Shape (--polygon_reduction_marge_shape)
//----------------------------------------------
ファイル内のシェイプを結合してから、リダクションを行います。
リダクション後にシェイプを分離します。

型：Bool  true: 有効　false: 無効 規定値:false

-----------------------------------------------------------------------

