Softbody 3.00
Softbodyの3.00が公開されていたので調べてみました。
Softbody Ultraという体形が追加されていました。胸が片側71ボーンの合わせて142ボーン、尻が片側14ボーンの合わせて28ボーンになっていました。
胸はぱっと見で申し分なさそうで、むしろ50ボーンとあまりかわっていないように思いました。
問題は尻で、あきらかに動きがおかしく、環境に原因があるか、特定の用途にのみ使うことを想定しているようです。動きに関しては設定をチューニングすることで改善する余地がありそうです。
それ以上に問題なのが、Shapeが分割されていることです。Skyrimはボーンの数が79個までという制約があるらしいのですが、これを見る限りではShapeに制約がかかっているようです。よって分割して制約を解決したのだと思われます。
試しにShapeを1つに結合してみましたが、速攻でCTDしました。
Shapeを分割したことでボーン数に余裕ができたのか、1.66では省かれていたボーンが3.00では復活しています。CBBE 3BAの仕様に戻ったと言えます。
Shapeが分割されるデメリットとして、RaceMenuのオーバーレイが正常に乗らなくなります。どうやらShape1個にしか乗りません。
それから、装備にWeightを移植する際に、ボーンが79個を超えないように注意する必要があります。場合によっては装備側のShapeを分割する必要が出てきます。
そして、Partitionが無数にわかれています。これはSMPでヒラヒラする装備にそのままWeightを移植するとCTDしてしまうと思われますので、やはり対策が必要になってきます。
やりたいこと
Softbody 1.66で構築した環境に3.00を入れてみました。
可能な限り実現したいことは以下になります。
- 胸と尻をSoftbody 3.00仕様にして揺らす。
- RaceMenuのオーバーレイを正しく適用する。
- モーフを適用できるようにする。
- NPCに影響が出ないようにする。
以下は妥協した点です。
- 既存の装備をすべてそのまま使えるようにするのは難しいため、専用装備を用意。
胸と尻をSoftbody 3.00仕様にして揺らす
1つのShapeが79ボーンまでという制約があるため、胸と尻を1つのShapeに詰め込むのは無理です。しかし、Shapeを分割するとオーバーレイが適用されなくなります。
そこで、胴のリファレンスを腰の位置で分割し、上半分を胴体 (Body) として残し、下半分は足 (Feet) に組み込みました。これで足に尻の28ボーンをすべて入れて揺らすことに成功しました。
胸は片方で71ボーンもあるためどうやっても無理なので、仕方なくSoftbody 1.66のWeightのままとしました。
RaceMenuのオーバーレイを正しく適用する
オーバーレイは元々Body、Hands、Feet、Faceの4か所に適用でき、FeetのテクスチャはBodyと同じものを使う仕様になっているため、特に何もせずそのまま正常に適用可能です。
モーフを適用できるようにする
モーフはShapeがいくつであろうが、スロットが何番であろうが適用されるため、これは問題にはなりませんでした。
NPCに影響が出ないようにする
ブーツを履くと足 (Feet) のリファレンスと入れ替わります。足のリファレンスに腰まで含めているため、ブーツを履くと腰から下が消えてしまいます。
理屈ではブーツにも足のリファレンスを入れていけばいいのですが、数が多すぎて現実的ではないため、NPCはCBBE 3BAのままとしました。
よって、今回の実装はプレイヤー専用となります。
プレイヤー用に足装備を複製してスロットに60番を設定したものを履くようにしました。足がクリッピングを起こす場合はモーフで対応しました。
SMPの揺れを調整する
3BAの胸や尻のボーンは奥から手前に向かって伸びています。それを踏まえて設定するわけですが、Softbodyは伸び方や数がまったく異なります。
胸に関してはオリジナルの設定で不満はなかったため特にいじってはいません。
尻は動きがおかしいので調整しました。尻のボーンは腰から下に向かって伸びているため、設定の考え方が少し変わります。尻に密着しているタイトスカートのようなイメージです。
尻なので上下の動きを大きく、前後は控えめにした方がいいと思うのですが、ボーンが上から下に向かって数珠つなぎでぶら下がっているためか、前後の動きは下に行くほど大きくなるように見えました。
これがおかしいくらい飛び出してしまうため、問題となるボーンを NPC L PreButt/NPC R PreButt と連結してブレーキをかけました。
設定のサンプル
設定のサンプルは以下になります。
Softbody 3.00下半身 (xml)
<?xml version="1.0" encoding="UTF-8"?>
<system xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="FSMP-Validator" xsi:schemaLocation="FSMP-Validator ./hdtSMP64.xsd">
// No Bounce
<!--
<bone name="NPC L Calf [LClf]"/>
<bone name="NPC R Calf [RClf]"/>
<bone name="NPC L Foot [Lft ]"/>
<bone name="NPC R Foot [Rft ]"/>
<bone name="NPC Head [Head]"/>
<bone name="NPC L Clavicle [LClv]"/>
<bone name="NPC R Clavicle [RClv]"/>
<bone name="NPC L Breast"/>
<bone name="NPC R Breast"/>
<bone name="NPC L Forearm [LLar]"/>
<bone name="NPC R Forearm [RLar]"/>
<bone name="NPC L ForearmTwist1 [LLt1]"/>
<bone name="NPC R ForearmTwist1 [RLt1]"/>
<bone name="NPC L ForearmTwist2 [LLt2]"/>
<bone name="NPC R ForearmTwist2 [RLt2]"/>
<bone name="NPC L UpperArm [LUar]"/>
<bone name="NPC R UpperArm [RUar]"/>
<bone name="NPC L UpperarmTwist1 [LUt1]"/>
<bone name="NPC R UpperarmTwist1 [RUt1]"/>
<bone name="NPC L UpperarmTwist2 [LUt2]"/>
<bone name="NPC R UpperarmTwist2 [RUt2]"/>
<bone name="NPC Spine [Spn0]"/>
<bone name="NPC Spine2 [Spn2]"/>
<bone name="NPC Spine1 [Spn1]"/>
<bone name="NPC Pelvis [Pelv]"/>
<bone name="Belly"/>
<bone name="NPC Belly"/>
<bone name="NPC L Hand [LHnd]"/>
<bone name="NPC R Hand [RHnd]"/>
<bone name="NPC R Finger00 [RF00]"/>
<bone name="NPC R Finger01 [RF01]"/>
<bone name="NPC R Finger02 [RF02]"/>
<bone name="NPC R Finger10 [RF10]"/>
<bone name="NPC R Finger11 [RF11]"/>
<bone name="NPC R Finger12 [RF12]"/>
<bone name="NPC R Finger20 [RF20]"/>
<bone name="NPC R Finger21 [RF21]"/>
<bone name="NPC R Finger22 [RF22]"/>
<bone name="NPC R Finger30 [RF30]"/>
<bone name="NPC R Finger31 [RF31]"/>
<bone name="NPC R Finger32 [RF32]"/>
<bone name="NPC R Finger40 [RF40]"/>
<bone name="NPC R Finger41 [RF41]"/>
<bone name="NPC R Finger42 [RF42]"/>
<bone name="NPC L Finger00 [LF00]"/>
<bone name="NPC L Finger01 [LF01]"/>
<bone name="NPC L Finger02 [LF02]"/>
<bone name="NPC L Finger10 [LF10]"/>
<bone name="NPC L Finger11 [LF11]"/>
<bone name="NPC L Finger12 [LF12]"/>
<bone name="NPC L Finger20 [LF20]"/>
<bone name="NPC L Finger21 [LF21]"/>
<bone name="NPC L Finger22 [LF22]"/>
<bone name="NPC L Finger30 [LF30]"/>
<bone name="NPC L Finger31 [LF31]"/>
<bone name="NPC L Finger32 [LF32]"/>
<bone name="NPC L Finger40 [LF40]"/>
<bone name="NPC L Finger41 [LF41]"/>
<bone name="NPC L Finger42 [LF42]"/>
<bone name="NPC L PreRearThigh"/>
<bone name="NPC R PreRearThigh"/>
<bone name="NPC L PreFrontThigh"/>
<bone name="NPC R PreFrontThigh"/>
<bone name="NPC L PreRearCalf"/>
<bone name="NPC R PreRearCalf"/>
<bone name="NPC L Toe0 [LToe]"/>
<bone name="NPC R Toe0 [RToe]"/>
<bone name="NPC Root [Root]"/>
<bone name="NPC L Thigh [LThg]"/>
<bone name="NPC R Thigh [RThg]"/>
<bone name="Soft_R100"/>
<bone name="Soft_R200"/>
<bone name="Soft_R300"/>
<bone name="Soft_R400"/>
<bone name="Soft_R500"/>
<bone name="Soft_R600"/>
<bone name="Soft_R700"/>
<bone name="Soft_R800"/>
<bone name="Soft_L100"/>
<bone name="Soft_L200"/>
<bone name="Soft_L300"/>
<bone name="Soft_L400"/>
<bone name="Soft_L500"/>
<bone name="Soft_L600"/>
<bone name="Soft_L700"/>
<bone name="Soft_L800"/>
<bone name="VaginaDB00"/>
<bone name="VaginaDF00"/>
<bone name="VaginaDR00"/>
<bone name="VaginaDL00"/>
-->
// 尻 v1.66
<bone name="NPC L PreButt">
<mass>0.000000</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>
<friction>0</friction>
<rollingFriction>0</rollingFriction>
<restitution>0</restitution>
</bone>
<bone name="NPC R PreButt">
<mass>0.000000</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>
<friction>0</friction>
<rollingFriction>0</rollingFriction>
<restitution>0</restitution>
</bone>
<bone name="NPC L Butt">
<mass>2.7</mass>
<inertia x="5" y="5" z="5"/>
<centerOfMassTransform>
<basis x="0" y="0" z="0" w="1"/>
<origin x="-1" y="0" z="1"/>
</centerOfMassTransform>
<linearDamping>0.9</linearDamping>
<angularDamping>0.8</angularDamping>
<gravity-factor>0</gravity-factor>
<friction>0.5</friction>
<rollingFriction>0</rollingFriction>
<restitution>1</restitution>
</bone>
<bone name="NPC R Butt">
<mass>2.7</mass>
<inertia x="5" y="5" z="5"/>
<centerOfMassTransform>
<basis x="0" y="0" z="0" w="1"/>
<origin x="-1" y="0" z="1"/>
</centerOfMassTransform>
<linearDamping>0.9</linearDamping>
<angularDamping>0.8</angularDamping>
<friction>0.5</friction>
<rollingFriction>0</rollingFriction>
<restitution>1</restitution>
</bone>
// 尻 v3.00
<bone-default>
<mass>1</mass>
<inertia x="1" y="1" z="1"/>
<centerOfMassTransform>
<basis x="0" y="0" z="0" w="1" />
<origin x="0" y="0" z="0" />
</centerOfMassTransform>
<linearDamping>0.6</linearDamping>
<angularDamping>0.3</angularDamping>
<gravity-factor>1</gravity-factor>
<friction>0.5</friction>
<rollingFriction>0</rollingFriction>
<restitution>0.5</restitution>
<margin-multiplier>0.1</margin-multiplier>
</bone-default>
<bone name="L_SoftButt101"/>
<bone name="L_SoftButt102"/>
<bone name="L_SoftButt103"/>
<bone name="L_SoftButt104"/>
<bone name="L_SoftButt201"/>
<bone name="L_SoftButt202"/>
<bone name="L_SoftButt203"/>
<bone name="L_SoftButt204"/>
<bone name="L_SoftButt205"/>
<bone name="L_SoftButt301"/>
<bone name="L_SoftButt302"/>
<bone name="L_SoftButt303"/>
<bone name="L_SoftButt304"/>
<bone name="L_SoftButt305"/>
<bone name="R_SoftButt101"/>
<bone name="R_SoftButt102"/>
<bone name="R_SoftButt103"/>
<bone name="R_SoftButt104"/>
<bone name="R_SoftButt201"/>
<bone name="R_SoftButt202"/>
<bone name="R_SoftButt203"/>
<bone name="R_SoftButt204"/>
<bone name="R_SoftButt205"/>
<bone name="R_SoftButt301"/>
<bone name="R_SoftButt302"/>
<bone name="R_SoftButt303"/>
<bone name="R_SoftButt304"/>
<bone name="R_SoftButt305"/>
// Thigh v1.66
<bone name="NPC L RearThigh">
<mass>2</mass>
<inertia x="1" y="1" z="1"/>
<centerOfMassTransform>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="1"/>
</centerOfMassTransform>
<linearDamping>0.9</linearDamping>
<angularDamping>0.8</angularDamping>
<gravity-factor>0</gravity-factor>
<friction>0.5</friction>
<rollingFriction>0.5</rollingFriction>
<margin-multiplier>0.2</margin-multiplier>
<restitution>0.5</restitution>
</bone>
<bone name="NPC R RearThigh">
<mass>2</mass>
<inertia x="1" y="1" z="1"/>
<centerOfMassTransform>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="1"/>
</centerOfMassTransform>
<linearDamping>0.9</linearDamping>
<angularDamping>0.8</angularDamping>
<gravity-factor>0</gravity-factor>
<friction>0.5</friction>
<rollingFriction>0.5</rollingFriction>
<margin-multiplier>0.2</margin-multiplier>
<restitution>0.5</restitution>
</bone>
// Thigh v3.00
<bone name="NPC L FrontThigh">
<mass>2</mass>
<inertia x="1" y="1" z="1"/>
<centerOfMassTransform>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="1"/>
</centerOfMassTransform>
<linearDamping>0.9</linearDamping>
<angularDamping>0.8</angularDamping>
<gravity-factor>0</gravity-factor>
<friction>0.5</friction>
<rollingFriction>0.5</rollingFriction>
<margin-multiplier>0.2</margin-multiplier>
<restitution>0.5</restitution>
</bone>
<bone name="NPC R FrontThigh">
<mass>2</mass>
<inertia x="1" y="1" z="1"/>
<centerOfMassTransform>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="1"/>
</centerOfMassTransform>
<linearDamping>0.9</linearDamping>
<angularDamping>0.8</angularDamping>
<gravity-factor>0</gravity-factor>
<friction>0.5</friction>
<rollingFriction>0.5</rollingFriction>
<margin-multiplier>0.2</margin-multiplier>
<restitution>0.5</restitution>
</bone>
// Default
<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</margin-multiplier>
</bone-default>
// 尻 v3.00
<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="-0.1" y="-0.1" z="-1" />
<linearUpperLimit x="0.1" y="0.1" z="0.1" />
<angularLowerLimit x="-0.01" y="0" z="-0.01" />
<angularUpperLimit x="0.01" y="0" z="0.01" />
<linearStiffness x="600" y="600" z="600"/>
<angularStiffness x="100" y="100" z="100"/>
<linearDamping x="1" y="1" z="1"/>
<angularDamping x="0.2" y="0.2" z="0.2"/>
<linearEquilibrium x="0" y="0" z="0" />
<angularEquilibrium x="0" y="0" z="0" />
</generic-constraint-default>
<generic-constraint bodyA="R_SoftButt101" bodyB="R_SoftButt100"/>
<generic-constraint bodyA="R_SoftButt102" bodyB="R_SoftButt101"/>
<generic-constraint bodyA="R_SoftButt103" bodyB="R_SoftButt102"/>
<generic-constraint bodyA="R_SoftButt104" bodyB="R_SoftButt103"/>
<generic-constraint bodyA="R_SoftButt105" bodyB="R_SoftButt104"/>
<generic-constraint bodyA="R_SoftButt201" bodyB="R_SoftButt200"/>
<generic-constraint bodyA="R_SoftButt202" bodyB="R_SoftButt201"/>
<generic-constraint bodyA="R_SoftButt203" bodyB="R_SoftButt202"/>
<generic-constraint bodyA="R_SoftButt204" bodyB="R_SoftButt203"/>
<generic-constraint bodyA="R_SoftButt205" bodyB="R_SoftButt204"/>
<generic-constraint bodyA="R_SoftButt206" bodyB="R_SoftButt205"/>
<generic-constraint bodyA="R_SoftButt301" bodyB="R_SoftButt300"/>
<generic-constraint bodyA="R_SoftButt302" bodyB="R_SoftButt301"/>
<generic-constraint bodyA="R_SoftButt303" bodyB="R_SoftButt302"/>
<generic-constraint bodyA="R_SoftButt304" bodyB="R_SoftButt303"/>
<generic-constraint bodyA="R_SoftButt305" bodyB="R_SoftButt304"/>
<generic-constraint bodyA="R_SoftButt306" bodyB="R_SoftButt305"/>
<generic-constraint bodyA="L_SoftButt101" bodyB="L_SoftButt100"/>
<generic-constraint bodyA="L_SoftButt102" bodyB="L_SoftButt101"/>
<generic-constraint bodyA="L_SoftButt103" bodyB="L_SoftButt102"/>
<generic-constraint bodyA="L_SoftButt103" bodyB="L_SoftButt104"/>
<generic-constraint bodyA="L_SoftButt104" bodyB="L_SoftButt105"/>
<generic-constraint bodyA="L_SoftButt201" bodyB="L_SoftButt200"/>
<generic-constraint bodyA="L_SoftButt202" bodyB="L_SoftButt201"/>
<generic-constraint bodyA="L_SoftButt203" bodyB="L_SoftButt202"/>
<generic-constraint bodyA="L_SoftButt203" bodyB="L_SoftButt204"/>
<generic-constraint bodyA="L_SoftButt204" bodyB="L_SoftButt205"/>
<generic-constraint bodyA="L_SoftButt205" bodyB="L_SoftButt206"/>
<generic-constraint bodyA="L_SoftButt301" bodyB="L_SoftButt300"/>
<generic-constraint bodyA="L_SoftButt302" bodyB="L_SoftButt301"/>
<generic-constraint bodyA="L_SoftButt303" bodyB="L_SoftButt302"/>
<generic-constraint bodyA="L_SoftButt303" bodyB="L_SoftButt304"/>
<generic-constraint bodyA="L_SoftButt304" bodyB="L_SoftButt305"/>
<generic-constraint bodyA="L_SoftButt305" bodyB="L_SoftButt306"/>
<generic-constraint-default>
<frameInLerp>
<translationLerp>0</translationLerp>
<rotationLerp>0</rotationLerp>
</frameInLerp>
<linearLowerLimit x="-0.1" y="-0.1" z="-2" />
<linearUpperLimit x="0.1" y="0.1" z="2" />
<angularLowerLimit x="-0.01" y="0" z="-0.1" />
<angularUpperLimit x="0.01" y="0" z="0.1" />
<linearStiffness x="600" y="600" z="600"/>
<angularStiffness x="100" y="100" z="100"/>
<linearDamping x="1" y="1" z="1"/>
<angularDamping x="0.2" y="0.2" z="0.2"/>
</generic-constraint-default>
<generic-constraint bodyA="R_SoftButt101" bodyB="R_SoftButt201"/>
<generic-constraint bodyA="R_SoftButt102" bodyB="R_SoftButt202"/>
<generic-constraint bodyA="R_SoftButt103" bodyB="R_SoftButt203"/>
<generic-constraint bodyA="R_SoftButt104" bodyB="R_SoftButt204"/>
<generic-constraint bodyA="R_SoftButt201" bodyB="R_SoftButt301"/>
<generic-constraint bodyA="R_SoftButt202" bodyB="R_SoftButt302"/>
<generic-constraint bodyA="R_SoftButt203" bodyB="R_SoftButt303"/>
<generic-constraint bodyA="R_SoftButt204" bodyB="R_SoftButt304"/>
<generic-constraint bodyA="R_SoftButt205" bodyB="R_SoftButt305"/>
<generic-constraint bodyA="L_SoftButt101" bodyB="L_SoftButt201"/>
<generic-constraint bodyA="L_SoftButt102" bodyB="L_SoftButt202"/>
<generic-constraint bodyA="L_SoftButt103" bodyB="L_SoftButt203"/>
<generic-constraint bodyA="L_SoftButt104" bodyB="L_SoftButt204"/>
<generic-constraint bodyA="L_SoftButt201" bodyB="L_SoftButt301"/>
<generic-constraint bodyA="L_SoftButt202" bodyB="L_SoftButt302"/>
<generic-constraint bodyA="L_SoftButt203" bodyB="L_SoftButt303"/>
<generic-constraint bodyA="L_SoftButt204" bodyB="L_SoftButt304"/>
<generic-constraint bodyA="L_SoftButt205" bodyB="L_SoftButt305"/>
<generic-constraint-default>
<frameInLerp>
<translationLerp>0</translationLerp>
<rotationLerp>0</rotationLerp>
</frameInLerp>
<linearLowerLimit x="-10" y="-1" z="-10" />
<linearUpperLimit x="10" y="1" z="10" />
<angularLowerLimit x="-0.5" y="0" z="-0.5" />
<angularUpperLimit x="0.5" y="0" z="0.5" />
<linearStiffness x="600" y="600" z="600"/>
<angularStiffness x="100" y="100" z="100"/>
<linearDamping x="1" y="1" z="1"/>
<angularDamping x="0.2" y="0.2" z="0.2"/>
</generic-constraint-default>
<generic-constraint bodyA="R_SoftButt202" bodyB="NPC R PreButt"/>
<generic-constraint bodyA="R_SoftButt203" bodyB="NPC R PreButt"/>
<generic-constraint bodyA="R_SoftButt204" bodyB="NPC R PreButt"/>
<generic-constraint bodyA="R_SoftButt302" bodyB="NPC R PreButt"/>
<generic-constraint bodyA="R_SoftButt303" bodyB="NPC R PreButt"/>
<generic-constraint bodyA="R_SoftButt304" bodyB="NPC R PreButt"/>
<generic-constraint bodyA="L_SoftButt203" bodyB="NPC L PreButt"/>
<generic-constraint bodyA="L_SoftButt204" bodyB="NPC L PreButt"/>
<generic-constraint bodyA="L_SoftButt302" bodyB="NPC L PreButt"/>
<generic-constraint bodyA="L_SoftButt302" bodyB="NPC L PreButt"/>
<generic-constraint bodyA="L_SoftButt303" bodyB="NPC L PreButt"/>
<generic-constraint bodyA="L_SoftButt304" bodyB="NPC L PreButt"/>
// 尻 v1.66
<generic-constraint-default>
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<linearLowerLimit x="-1" y="-1" z="-8"/>
<linearUpperLimit x="1" y="1" z="19"/>
<angularLowerLimit x="-0.1" y="-0.1" z="-0.2"/>
<angularUpperLimit x="0.1" y="0.1" z="0.2"/>
<linearStiffness x="600" y="600" z="600"/>
<angularStiffness x="100" y="100" z="100"/>
<linearDamping x="1" y="1" z="1"/>
<angularDamping x="0.2" y="0.2" z="0.2"/>
</generic-constraint-default>
<generic-constraint bodyA="NPC L Butt" bodyB="NPC L PreButt"/>
<generic-constraint bodyA="NPC R Butt" bodyB="NPC R PreButt"/>
// Thigh v1.66
<generic-constraint bodyA="NPC L RearThigh" bodyB="NPC L PreRearThigh">
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<linearLowerLimit x="-10" y="-10" z="-5"/>
<linearUpperLimit x="10" y="20" z="5"/>
<angularLowerLimit x="-0" y="-0" z="-0.3"/>
<angularUpperLimit x="0" y="0" z="0.3"/>
<linearStiffness x="1000" y="1000" z="1000"/>
<angularStiffness x="0" y="0" z="300"/>
<linearDamping x="2" y="50" z="2"/>
<angularDamping x="0" y="0" z="0"/>
<linearEquilibrium x="0" y="0" z="0"/>
<angularEquilibrium x="0" y="0" z="0"/>
</generic-constraint>
<generic-constraint bodyA="NPC R RearThigh" bodyB="NPC R PreRearThigh">
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<linearLowerLimit x="-10" y="-10" z="-5"/>
<linearUpperLimit x="10" y="20" z="5"/>
<angularLowerLimit x="-0" y="-0" z="-0.3"/>
<angularUpperLimit x="0" y="0" z="0.3"/>
<linearStiffness x="1000" y="1000" z="1000"/>
<angularStiffness x="0" y="0" z="300"/>
<linearDamping x="2" y="50" z="2"/>
<angularDamping x="0" y="0" z="0"/>
<linearEquilibrium x="0" y="0" z="0"/>
<angularEquilibrium x="0" y="0" z="0"/>
</generic-constraint>
// Thigh v3.00
<generic-constraint bodyA="NPC L FrontThigh" bodyB="NPC L PreFrontThigh">
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<linearLowerLimit x="-10" y="-10" z="-5"/>
<linearUpperLimit x="10" y="20" z="5"/>
<angularLowerLimit x="-0" y="-0" z="-0.3"/>
<angularUpperLimit x="0" y="0" z="0.3"/>
<linearStiffness x="1000" y="1000" z="1000"/>
<angularStiffness x="0" y="0" z="300"/>
<linearDamping x="2" y="50" z="2"/>
<angularDamping x="0" y="0" z="0"/>
<linearEquilibrium x="0" y="0" z="0"/>
<angularEquilibrium x="0" y="0" z="0"/>
</generic-constraint>
<generic-constraint bodyA="NPC R FrontThigh" bodyB="NPC R PreFrontThigh">
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<linearLowerLimit x="-10" y="-10" z="-5"/>
<linearUpperLimit x="10" y="20" z="5"/>
<angularLowerLimit x="-0" y="-0" z="-0.3"/>
<angularUpperLimit x="0" y="0" z="0.3"/>
<linearStiffness x="1000" y="1000" z="1000"/>
<angularStiffness x="0" y="0" z="300"/>
<linearDamping x="2" y="50" z="2"/>
<angularDamping x="0" y="0" z="0"/>
<linearEquilibrium x="0" y="0" z="0"/>
<angularEquilibrium x="0" y="0" z="0"/>
</generic-constraint>
</system>
尻の enableAngularSprings/enableLinearSprings がなんだかよくわからなかったので0にしたところ、ふとももの動きが安定しなくなり、smp reset を実行するたびに直ったり狂ったりするようになりました。これが書かれているのは generic-constraint-default の中なので、後続の generic-constraint に伝達されることを前提に記述されているのでしょうか。
不具合
尻のWeightを塗った装備が揺れない
尻のWeightを塗った装備が揺れません。
HDT-SMPの仕様として、Skeletonに存在しないボーンはSMPのデフォルト設定では揺れないようです。
Skeletonに存在しないボーンを装備に追加して揺らしたい場合、装備にカスタム設定を仕込む必要があるようです。スカートをヒラヒラさせるにはカスタム設定を仕込まなければならないのと同じ理屈と思われます。
胸 (Softbody1.66) やふともも (CBBE 3BA) ではこのような問題は起こりません。なぜならSoftbodyに付属のSkeletonには胸のボーンが含まれているからです。ふとももはCBBE 3BA由来なので元々含まれています。
Softbody 3.00に付属のSkeletonには、1.66時代の胸のボーンはありますが、3.00の胸や尻のボーンは含まれていません。ですから1.66の胸のWeightを引き続き使っていれば胸は揺れ、3.00の尻のWeightを移植してもそのままでは尻は揺れないというわけです。
それで結局どうなのか
尻がたゆんたゆんするようになりました。すごくいいですね。
ただ、普段から3人称視点にして、カメラが尻を大きく映すようにしなければ3BAとの違いはわかりません。
もっとも、TAWOBAのような尻丸出しの恰好でなければ尻が見えないので、恩恵はほとんどありません。
