Softbodyとは
CBBE 3BAをベースに胸のボーンを大幅に増やした体型のようです。胸だけでボーンが50個あるようです。
それから性器が大幅に拡張されているようです。
専用のスケルトンが付属していますので、他のどのModよりも優先させるようにします。
テクスチャはCBBE SE用のものがそのまま使えます。
今回構築する環境
CBBE 3BAと共存させます。
PhysicsはFaster HDT-SMPのみです。CBPCは使いません。
裸体の導入
普通にインストールするだけです。
必要であればBodySlideでメッシュを再生成します。
リファレンスのshape名はSoftbodyです。
3BAとの違いについて
多くのWeightが変更されています。
胸は50個のボーンになっているようです。流石にこれだけあるとぷるんぷるんします。
尻はボーンが2個のままで、見た感じWeightにも差がないように見えましたが、3BAのWeightで塗りなおして3BAのSMPの設定を適用すると揺れがかなり大きくなります。スケルトンまたはメッシュに差があるのでしょうか。詳細は不明です。
ふとももは L FrontThigh/R FrontThigh
がなくなっており、L RearThigh/R RearThigh
で前後をまかなっているようです。また、ふくらはぎの L RearCalf/R RearCalf
もないようです。
また、上腕のボーンもいくつかなくなっているようです。この辺りはWeightを塗りなおさないと非常にクリッピングしやすいです。
Pelvis
と Spine/Spine1/Spine2
のWeightがかわっています。特に Spine2
は大きく異なるため、塗りなおさないと上体をねじった際に脇腹がクリッピングしやすくなります。
メッシュの頂点は、はっきりとわかる違いはないように見えました。
揺れの設定ファイルについて
defaultBBPs.xml
がデフォルト設定、装備に仕込んだXMLファイルがカスタム設定になります。HDT-SMPの揺れの設定を調べてみたで解説しています。
デフォルト設定
本Modには defaultBBPs.xml
が付属しており、3BAのものを上書きするため、調整が必要です。
Shape名が Softbody
の場合、設定がないので揺れません。
Shape名が 3BA
の場合、Body Nipple.xml
を使うように記述されていますが、このファイルが存在しないので、既存の3BA装備は揺れません。
NPCをデフォルトで揺らしたいのであれば正しいファイルを指定します。NPCはデフォルトでは揺らさず、NPCごとにコリジョン装備を使って揺らすのであれば、このままでいいです。
defaultBBPs.xml
の変更はコンソールの smp reset
コマンドでは反映されませんでした。Skyrimの再起動が必要のようです。
カスタム設定
装備に仕込むカスタム設定の方ですが、コリジョン装備であったり、XMLファイルが仕込まれている胴装備を装備している場合、デフォルト設定が無視されて装備側の設定が使われるようです。
カスタム設定が重なると、優先順位は不明ですが上書きされてマージされるようです。
例えば、リファレンスを含むワンピースの胴装備があり、ワンピースをヒラヒラさせるためにXMLファイルが仕込まれているとします。ワンピースの揺れの設定は当然あるでしょうが、リファレンスの揺れの設定は装備によってあったりなかったりします。あるのなら揺れますが、デフォルト設定とは違う揺れ方になるはずです。ない場合にはコリジョン装備を追加で持たせると、ワンピースをヒラヒラさせつつ、リファレンスを好みの揺れ方で揺らすことができます。
Softbody用コリジョン装備を作る場合の注意事項として、コリジョン用shapeが3BAはコリジョン装備側に、Softbodyはリファレンス側(装備側)にあります。よって、Softbody用コリジョン装備はshapeなしで作るのがよさそうです。ただし、本当にshapeが1つもないとOutfit Studioが落ちるので、VirtualGroundだけ残しました。カスタム設定を仕込んである装備にコリジョン用Shapeがないとダメなようです。リファレンスからコリジョン用Shapeを移植しましょう。要するにCBBE 3BAと同じようにすればいいのです。
裸体の揺れについて
ややこしいことになっています。
Softbodyに付属のProjectでメッシュをBuildした場合、メッシュにカスタム設定が仕込まれており、以下の設定ファイルが使われるようになっています。
meshes\actors\character\character assets\softbody.xml
よって、デフォルト設定は無視されます。
Softbodyの検出
Softbody用装備を身に着けているかどうかの判定方法です。2通り思いつきました。
まずは、装備にキーワードを付与しておき、ActorのWornHasKeyword関数で判定する方法です。おそらく負荷が低く、SpellやPerkの条件式でも使えます。KIDまたはSkyPatcherを使ってキーワードを付与しておかないとならないのがデメリットです。
もうひとつは、装備のArmor AddonからNodeを調べる方法です。
Bool Function HasSoftbody()
Form kBodyArmor = PlayerRef.GetWornForm(0x4)
if !kBodyArmor
return false
endif
ArmorAddon kBodyArmorAA = (kBodyArmor as Armor).GetNthArmorAddon(0)
return NiOverride.HasArmorAddonNode(PlayerRef, false, kBodyArmor as Armor, kBodyArmorAA, "Softbody")
EndFunction
SKSEとRaceMenuが必要です。パフォーマンスを稼ぐため、Armorレコードに紐づいている最初のArmor Addonだけを見ています。Shape名はSoftbodyで固定ですが、これは問題ないと思います。
装備のSoftbody化
リファレンスを3BAのものからSoftbodyのものに差し替え、装備のWeightを塗りなおします。
あるいはリファレンスを差し替えるかわりに、CBBE 3BAのリファレンスにSoftbodyのリファレンスのWeightを移す方法もあります。リファレンスが加工されていたり独自のスライダーがたくさんある場合は、そのまま残せるのでかなり楽できます。
装備のShapeにSoftbodyの胸のWeightをそのままコピーすると、当然ながらぷるんぷるんするため、鎧はあからさまにおかしい違和感のある動きになります。
対応装備がまだほとんどなく、WeightのUniboob化も自力でやらないといけないので、かなり大変だと思います。
Uniboob化の注意事項として、胸同士のコリジョンを有効にしていると、Weightの重なり部分で衝突してしまうので、なんとかする必要があります。
横着する方法として、胴はブラや絆創膏、下半身はパンツや絆創膏で固定し、その上に3BAの上着やスカートを履くようにすると、装備のSoftbody化を最小限で済ませられます。胸の揺れ方がSoftbodyと3BAで異なるため、ある程度ゆったり目にしてクリッピングを防止する必要があります。Softbody用のHDT-SMPの設定ファイルには3BA用のボーンを追加します。
Softbodyと3BAを組み合わせる
リファレンスの揺れは申し分ないため、極力さわらないようにします。装備側をSoftbodyに合わせることで、破綻しないようにします。
いくつか作業してみてわかったのが、装備ごとにXMLを最適化する必要があるということです。いっそのこと、装備側にXMLを仕込んでしまうのが手っ取り早いかもしれません。
試行錯誤した結果をまとめます。
CBBE 3BAのボーンをSoftbodyのボーンに追従させる
Softbodyの乳首である Soft_LN00/Soft_RN00
とCBBE 3BAの最前面にあたる L Breast 03/R Breast 03
を、Softbody側を親にして連結させます。完璧に追従させることはできませんでしたが、程度を調整できます。
Softbody-LessCols.xml (xml)
<bone-default>
<mass>0</mass>
<inertia x="0" y="0" z="0"/>
<centerOfMassTransform>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</centerOfMassTransform>
<linearDamping>0</linearDamping>
<angularDamping>0</angularDamping>
<gravity-factor>0</gravity-factor>
<friction>0</friction>
<rollingFriction>0</rollingFriction>
<restitution>0</restitution>
</bone-default>
<bone-default>
<margin-multiplier>0.01</margin-multiplier>
</bone-default>
<bone name="L Breast00"/>
<bone name="R Breast00"/>
<bone-default>
<mass>0.3</mass>
<inertia x="2" y="2" z="2"/>
<centerOfMassTransform>
<basis x="0" y="0" z="0" w="1" />
<origin x="0" y="0" z="0" />
</centerOfMassTransform>
<linearDamping>0.7</linearDamping>
<angularDamping>0.9</angularDamping>
<gravity-factor>0.2</gravity-factor>
<friction>0</friction>
<rollingFriction>0</rollingFriction>
<restitution>0.4</restitution>
</bone-default>
<bone-default>
<margin-multiplier>0.1</margin-multiplier>
</bone-default>
<bone name="L Breast01"/>
<bone name="R Breast01"/>
<bone-default>
<mass>0.2</mass>
<linearDamping>0.7</linearDamping>
<angularDamping>0.8</angularDamping>
<gravity-factor>0.3</gravity-factor>
</bone-default>
<bone name="L Breast02"/>
<bone name="R Breast02"/>
<bone-default>
<mass>0.1</mass>
<linearDamping>0.7</linearDamping>
<angularDamping>0.7</angularDamping>
<gravity-factor>0.4</gravity-factor>
</bone-default>
<bone name="L Breast03"/>
<bone name="R Breast03"/>
<generic-constraint-default>
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<enableAngularSprings>1</enableAngularSprings>
<enableLinearSprings>1</enableLinearSprings>
<linearStiffnessLimited>0</linearStiffnessLimited>
<angularStiffnessLimited>0</angularStiffnessLimited>
<linearLowerLimit x="-2" y="-0.1" z="-0.2" />
<linearUpperLimit x="2" y="0.1" z="0.2" />
<angularLowerLimit x="-0.2" y="-0.02" z="-0.02" />
<angularUpperLimit x="0.2" y="0.02" z="0.02" />
<linearStiffness x="200" y="120" z="120"/>
<angularStiffness x="1000" y="1000" z="1000"/>
<linearDamping x="1" y="1" z="1" />
<angularDamping x="1" y="1" z="1" />
<linearEquilibrium x="0" y="0" z="0" />
<angularEquilibrium x="0" y="0" z="0" />
</generic-constraint-default>
<generic-constraint bodyA="L Breast01" bodyB="L Breast00"/>
<generic-constraint bodyA="R Breast01" bodyB="R Breast00"/>
<generic-constraint bodyA="L Breast02" bodyB="L Breast01"/>
<generic-constraint bodyA="R Breast02" bodyB="R Breast01"/>
<generic-constraint bodyA="L Breast03" bodyB="L Breast02"/>
<generic-constraint bodyA="R Breast03" bodyB="R Breast02"/>
<generic-constraint-default>
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<enableAngularSprings>1</enableAngularSprings>
<enableLinearSprings>1</enableLinearSprings>
<linearStiffnessLimited>0</linearStiffnessLimited>
<angularStiffnessLimited>0</angularStiffnessLimited>
<linearLowerLimit x="-2" y="-0.1" z="-0.2" />
<linearUpperLimit x="2" y="0.1" z="0.2" />
<angularLowerLimit x="-0.2" y="-0.02" z="-0.02" />
<angularUpperLimit x="0.2" y="0.02" z="0.02" />
<linearStiffness x="200" y="120" z="120"/>
<angularStiffness x="1000" y="1000" z="1000"/>
<linearDamping x="1" y="1" z="1" />
<angularDamping x="1" y="1" z="1" />
<linearEquilibrium x="0" y="0" z="0" />
<angularEquilibrium x="0" y="0" z="0" />
</generic-constraint-default>
<generic-constraint bodyA="L Breast03" bodyB="Soft_LN00"/>
<generic-constraint bodyA="R Breast03" bodyB="Soft_RN00"/>
<generic-constraint bodyA="L Breast02" bodyB="Soft_LN00"/>
<generic-constraint bodyA="R Breast02" bodyB="Soft_RN00"/>
L Breast 02/R Breast 02
も連結させると、さらに凝固になるようでした。
ずれることを利用して、あえてずれた方がいい装備に向いています。
Softbodyの揺れを調整する
装備側の加工なしに揺れ方を調整する方法です。
COCO Shadow Assassinのように、胸の上部が露出しており、下部の揺れを抑える場合、以下のように調整しました。
- 南半球の
linearLowerLimit/linearUpperLimit/angularLowerLimit/angularUpperLimit
を小さくして下部へのクリッピングを防ぐ- 影響度は低いみたいで、とりあえず1/10にしてあまり動かないように
- 乳头(乳首)の
linearLowerLimit/linearUpperLimit/angularLowerLimit/angularUpperLimit
を小さくする- 全体への影響度が大きいみたいで、小さくしすぎると胸自体が揺れなくなってしまうので、1/2から1/10の間で調整する
- 上部が大きく開いていてクリッピングの心配が無い装備なら、上方向はあまり小さくしない
装備にSoftbodyのWeightを塗る
Softbodyの乳首である Soft_LN00/Soft_RN00
を装備に塗る方法です。ずれては困る装備に向いています。
塗らない部分にマスクをかけて、Normalize Weightsにチェックを入れた状態で、Weightを最大にして、こんな感じで塗ります。

Normalize Weightsによって、Breast 01/02/03
が自動的に消えます。
今度は Spine 2
をWeightを最小で塗ります。これを塗らないと影ができるようでした。
装備側に塗るのでまだ楽な方です。
よくわからない不具合として、常に震えます。
リファレンスにCBBE 3BAのWeightを塗る
SoftbodyのリファレンスにCBBE 3BAの Breast 01/02/03
や Spine 2
を塗ることで、揺れを控えめにしたり、揺れなくしたりできます。
リファレンスを塗るのはかなり難しく、特に境界のあたりを綺麗に塗れないと、やわらかい部分とかたい部分が露骨に分かれてしまいます。
実践例
CaenarvonさんのNarukami - hdt SMP (CBBE 3BA - BHUNP)の場合、ゆったりした着物なのでマージンを大きくとればほとんどクリッピングしません。COCO Body Breast 09のスライダーを複製して20%ほど常時適用するようにしました。

TAWOBAのHide Topは、素体の胸の下半分を動かないようにしました。BHUNP EGIL Battle Queenの胴が参考になります。Spine 2で赤く塗りつぶして揺れなくするのです。Hide Topの胴装備はBreast 01のみにして、かろうじて揺れる程度にしました。

TAWOBAのLeather Bikini Aの場合、身体に密着しているためクリッピングしやすく、食い込みは諦めたほうがいいかもしれません。上側がクリッピングしやすいので、手作業で膨らませるスライダーを追加しました。ブラは完全には胸に追従しませんが、それがかえっていい感じになります。

Stormcloaks Bikini armor 3BA HDT-SMP - Tawoba Standalone add-onです。Leather Bikini Aに近いですが、面積がより少ないため、クリッピングしやすいです。対策として絆創膏を貼りました。

体型の特性上、胸の露出が多い装備が向いています。



負荷について
単純にボーンの数が多いので、3BAと比べると負荷は高いはずです。
特にコリジョンの処理は重いので、不要な状況ではコリジョンを無効にしたほうがいいです。屋外で風を有効にしてあり、胸同士のコリジョンを有効にしていると、常時衝突してとても重くなります。コリジョンはプレイヤーだけに限定するとか、プレイヤーでも入浴時や睡眠時のみに限定するなどして対策したほうがいいでしょう。
Softbodyに付属のHDT-SMPの基本設定ファイル config.xml
ですが、デフォルトで autoAdjustMaxSkeletons
がfalseになっています。これがtrueだとNPCの揺れが動いたり止まったりを繰り返すようです。falseにするとNPCが多い場所で非常に重くなります。
不具合
Wind機能との相性が悪い
風との相性は最悪のようです。胸が潰れます。
横方向の動きを制限するとマシになります。
常に振動する
胸がずっとわずかに振動しっぱなしです。すべての装備をNon-Playableのものも含めて脱いでも、コリジョンを無効にしても、屋内の無風状態でも振動するので、原因はわかっていません。
linearDampingが原因?
震える。
<linearDamping x="8" y="2" z="5" />
震えない。
<linearDamping x="1" y="1" z="1" />