Softbodyで遊ぶ

体型・装備

Softbodyで遊んでみたときのおぼえがき。

Softbodyとは

CBBE 3BAをベースに胸のボーンを大幅に増やした体型のようです。胸だけでボーンが50個あるようです。

それから性器が大幅に拡張されているようです。

専用のスケルトンが付属していますので、他のどのModよりも優先させるようにします。

テクスチャはCBBE SE用のものがそのまま使えます。

今回構築する環境

CBBE 3BAと共存させます。

PhysicsはFaster HDT-SMPのみです。CBPCは使いません。

裸体の導入

普通にインストールするだけです。

必要であればBodySlideでメッシュを再生成します。

リファレンスのshape名はSoftbodyで、裸の時はどうやら以下の設定ファイルが使われるようです。

meshes\actors\character\character assets\softbody.xml

3BAとの違いについて

胸は50個のボーンになっているようです。流石にこれだけあるとぷるんぷるんします。

尻はボーンが2個のままで、見た感じWeightにも差がないように見えましたが、3BAの設定とWeightを適用すると揺れがかなり大きくなります。スケルトンまたはメッシュに差があるのでしょうか。詳細は不明です。

ふとももは前面がなくなっています。ふくらはぎもないようです。

また、上腕のボーンもいくつかなくなっているようです。この辺りは非常にクリッピングしやすいです。

メッシュの頂点は、はっきりとわかる違いはないように見えました。

着衣時の揺れについて

コリジョン装備で制御するようです。コリジョン装備を身に着けていないと揺れません。このあたりの仕様は3BAと同じようです。

この仕様をうまく使うことで、身に着けているものに応じてコリジョン装備を使い分けることで、3BAとSoftbodyを切り替えることができます。

Softbody用コリジョン装備はどうやらまだないようなので、自作する必要があると思います。

3BA用コリジョン装備を元に作る場合の注意事項として、コリジョン用shapeが3BAはコリジョン装備側に、Softbodyはリファレンス側にあります。よって、Softbody用コリジョン装備はshapeなしで作るのがよさそうです。ただし、本当にshapeが1つもないとOutfit Studioが落ちるので、VirtualGroundだけ残しました。

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を塗りなおします。

胸のWeightをそのままコピーすると、当然ながらぷるんぷるんするため、鎧はあからさまにおかしい違和感のある動きになります。

対応装備がまだほとんどなく、WeightのUniboob化も自力でやらないといけないので、かなり大変だと思います。

Uniboob化の注意事項として、胸同士のコリジョンを有効にしていると、Weightの重なり部分で衝突してしまうので、なんとかする必要があります。

横着する方法として、胴はブラや絆創膏、下半身はパンツや絆創膏で固定し、その上に3BAの上着やスカートを履くようにすると、装備のSoftbody化を最小限で済ませられます。胸の揺れ方がSoftbodyと3BAで異なるため、ある程度ゆったり目にしてクリッピングを防止する必要があります。Softbody用のHDT-SMPの設定ファイルには3BA用のボーンを追加します。

3BA用の揺れの設定

Softbodyによるリファレンスの揺れは申し分ないため、極力さわらないようにします。

3BA側の揺れをある程度Softbodyに合わせます。完璧に合わせるのは難しいですが、両者を連結させるといい感じに追従させることができます。追従はSoftbody側を親にします。

以下はCaenarvonさんのNarukami – hdt SMP (CBBE 3BA – BHUNP)をSoftbody化した時の設定例です。ゆったりした着物なのでマージンを大きくとればほとんどクリッピングしません。COCO Body Breast 09のスライダーを複製して20%ほど常時適用するようにしました。

	<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" z="-1" />
		<linearUpperLimit x="2" y="0" z="1" />
		<angularLowerLimit x="-0.4" y="-0.1" z="-0.1" />
		<angularUpperLimit x="0.4" y="0.1" z="0.1" />
		<linearStiffness x="200" y="120" z="120"/>
		<angularStiffness x="1000" y="1000" z="1000"/>
		<linearDamping x="1" y="1" z="0.1" />
		<angularDamping x="1" y="1" z="1" />
		<linearEquilibrium x="0" y="0" z="-7" />
		<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"/>

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

	<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.95</linearDamping>
<angularDamping>0.95</angularDamping>
<gravity-factor>0.5</gravity-factor>
<friction>0</friction>
<rollingFriction>0</rollingFriction>
<restitution>0.2</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>
</bone-default>
<bone name="L Breast02"/>
<bone name="R Breast02"/>
<bone-default>
<mass>0.1</mass>
</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="-1" y="-1" z="-1" />
<linearUpperLimit x="1" y="1" z="1" />
<angularLowerLimit x="-0.2" y="-0.1" z="-0.1" />
<angularUpperLimit x="0.2" y="0.1" z="0.1" />
<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="2" />
<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="-3" y="-3" z="-3" />
<linearUpperLimit x="3" y="3" z="3" />
<angularLowerLimit x="-0.05" y="-0.05" z="-0.05" />
<angularUpperLimit x="0.05" y="0.05" z="0.05" />
<linearStiffness x="200" y="200" z="200"/>
<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"/>

不具合

風との相性は最悪のようです。胸が潰れます。

胸がずっとわずかに振動しっぱなしです。すべての装備をNon-Playableのものも含めて脱いでも、コリジョンを無効にしても、屋内の無風状態でも振動するので、原因はわかっていません。

タイトルとURLをコピーしました