パタパタさせる(乳暖簾)
Nordplate Bikini 4の形状がこちらです。
胸に乗っかっているだけで固定されていません。これをSMPで動かしてみました。
ボーンを追加する
以下のボーンを追加します。
- L Plate00
- R Plate00
- L Plate01
- R Plate01
- L Plate02
- R Plate02
ボーンの追加手順は[NINI] Sisterで遊ぶにて解説しています。
階層は以下のようにします。
- L Breast03
- L Plate00
- L Plate01
- L Plate02
- L Plate01
- L Plate00
- R Breast03
- R Plate00
- R Plate01
- R Plate02
- R Plate01
- R Plate00
親ノードの選択ですが、追従させたいボーンを選ぶのがいいと思います。この防具は構造上は首からぶら下がっていますが、胸の上に置かれて静止しているため、首よりは胸の動きの影響のほうが遥かに大きいはずなので、胸の最前面であるBreast03にしました。
試行錯誤していて失敗した例を上げておきます。
Spine2から伸ばした場合は、揺れが胸とは非同期のため、胸の大きな揺れに負けて思うように動いてくれませんでした。
Breast03の先に延長する形でBreast04を追加して、linearUpperLimitを設定して移動させるようにした場合、一応動きはするのですが、控えめな感じがしました。linearは直線的な動きなので、この防具には合っていないように思います。
Plate00とPlate01の2つだけだと、動きが不足しました。1つのボーンの動く範囲は限界があります。Weightの量とSMPの設定でかわってきますが、1つのボーンが45度まで回転するとして、2つ連結すれば90度、3つで135度の回転になります。
Weightを塗る
1つの頂点には最大で4ボーンまで、という制約があるため、Breast01~Breast03の3ボーンを塗ると、残りは1つしかありません。Spineを消してPlate02で塗りました。よって塗れる強さには限界があります。
紐の部分はClavicleやUpperarmTwistを少し削って余白を作り、グラデーションを効かせるように塗ります。
コリジョン
あってもなくてもいいようでした。
CBBE 3BAの胸のコリジョンをそのまま拝借して置きました。
HDT-SMPの設定ファイルを作る
MAGECOREのランタンを参考にさせていただきました。
コリジョンはとにかく負荷が高いので、使わないようにする場合は、可動範囲は外側のみにして内側に動かないようにするのと、linearEquilibriumで静止状態で少し前方に動かすとクリッピングを防止できます。
とはいえ、コリジョンがあってもなくても、大きな力が加わると胸に食い込むのは仕方がないのだと思います。他のスカートなどのSMP装備も大抵食い込むので、そういうものなのでしょう。
TAWOBA_Nordplate_Bikini_4_v2.xml (xml)
<?xml version="1.0" encoding="UTF-8"?>
<system xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="description.xsd">
<bone name="R Breast01"/>
<bone name="L Breast01"/>
<bone name="R Breast02"/>
<bone name="L Breast02"/>
<bone name="R Breast03"/>
<bone name="L Breast03"/>
<bone name="NPC L Breast"/>
<bone name="NPC R Breast"/>
<bone name="NPC L Breast01"/>
<bone name="NPC R Breast01"/>
<bone name="NPC L Clavicle [LClv]"/>
<bone name="NPC R Clavicle [RClv]"/>
<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 L Thigh [LThg]"/>
<bone name="NPC R Thigh [RThg]"/>
<bone name="NPC L Calf [LClf]"/>
<bone name="NPC R Calf [RClf]"/>
<bone name="NPC R RearCalf [RrClf]"/>
<bone name="NPC L RearCalf [LrClf]"/>
<bone name="NPC L FrontThigh"/>
<bone name="NPC R FrontThigh"/>
<bone name="NPC L RearThigh"/>
<bone name="NPC R RearThigh"/>
<bone name="NPC L Butt"/>
<bone name="NPC R Butt"/>
<bone name="NPC L Pussy02"/>
<bone name="NPC R Pussy02"/>
<bone name="NPC L Hand [LHnd]"/>
<bone name="NPC R Hand [RHnd]"/>
<bone name="NPC RT Anus2"/>
<bone name="NPC LT Anus2"/>
<bone name="NPC LB Anus2"/>
<bone name="NPC RB Anus2"/>
<bone name="NPC Head [Head]"/>
<bone name="NPC Pelvis [Pelv]"/>
<bone name="NPC Spine [Spn0]"/>
<bone name="NPC Spine2 [Spn2]"/>
<bone name="NPC Spine1 [Spn1]"/>
<bone name="NPC Belly"/>
<bone name="Clitoral1"/>
<bone name="VaginaDeep1"/>
<bone name="L Plate00"/>
<bone name="R Plate00"/>
<bone-default>
<mass>0.25</mass>
<inertia x="10" y="10" z="10"/>
<centerOfMassTransform>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</centerOfMassTransform>
<linearDamping>0.9</linearDamping>
<angularDamping>0.9</angularDamping>
<friction>0.0</friction>
<gravity-factor>0.95</gravity-factor>
<restitution>0.5</restitution>
</bone-default>
<bone name="L Plate01"/>
<bone name="L Plate02"/>
<bone name="R Plate01"/>
<bone name="R Plate02"/>
<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="0" y="0" z="0" />
<linearUpperLimit x="0" y="0" z="0" />
<angularLowerLimit x="0" y="-0.25" z="-0.1" />
<angularUpperLimit x="0.9" y="0.25" z="0.1" />
<linearStiffness x="100" y="100" z="100"/>
<angularStiffness x="100" y="100" z="100"/>
<linearDamping x="100" y="100" z="100" />
<angularDamping x="100" y="100" z="100" />
<linearEquilibrium x="0" y="0" z="0" />
<angularEquilibrium x="0" y="0" z="0" />
<linearBounce x="0" y="0" z="0"/>
<angularBounce x="0" y="0" z="0"/>
</generic-constraint-default>
<generic-constraint bodyA="L Plate01" bodyB="L Plate00" />
<generic-constraint bodyA="R Plate01" bodyB="R Plate00" />
<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="0" y="-0.5" z="0" />
<linearUpperLimit x="0" y="0" z="0" />
<angularLowerLimit x="0" y="-0.25" z="-0.1" />
<angularUpperLimit x="0.9" y="0.25" z="0.1" />
<linearStiffness x="100" y="100" z="100"/>
<angularStiffness x="100" y="100" z="100"/>
<linearDamping x="100" y="100" z="100" />
<angularDamping x="100" y="100" z="100" />
<linearEquilibrium x="0" y="-0.5" z="0" />
<angularEquilibrium x="0" y="0" z="0" />
<linearBounce x="0" y="0" z="0"/>
<angularBounce x="0" y="0" z="0"/>
</generic-constraint-default>
<generic-constraint bodyA="L Plate02" bodyB="L Plate01" />
<generic-constraint bodyA="R Plate02" bodyB="R Plate01" />
<per-triangle-shape name="BodyC">
<margin>0.01</margin>
<penetration>0</penetration>
<shared>private</shared>
<tag>BodyC</tag>
<no-collide-with-tag>BodyC</no-collide-with-tag>
<can-collide-with-tag>armor</can-collide-with-tag>
<weight-threshold bone="NPC Spine [Spn0]">1</weight-threshold>
<weight-threshold bone="NPC Spine2 [Spn2]">1</weight-threshold>
<weight-threshold bone="NPC Spine1 [Spn1]">1</weight-threshold>
<weight-threshold bone="NPC Pelvis [Pelv]">1</weight-threshold>
<weight-threshold bone="NPC Belly">1</weight-threshold>
</per-triangle-shape>
<per-triangle-shape name="BRA">
<margin>0.1</margin>
<penetration>0</penetration>
<shared>private</shared>
<tag>BodyC</tag>
<no-collide-with-tag>BodyC</no-collide-with-tag>
<can-collide-with-tag>armor</can-collide-with-tag>
<weight-threshold bone="NPC Spine [Spn0]">0.5</weight-threshold>
<weight-threshold bone="NPC Spine1 [Spn1]">0.5</weight-threshold>
<weight-threshold bone="NPC Spine2 [Spn2]">0.5</weight-threshold>
<weight-threshold bone="NPC Pelvis [Pelv]">0.5</weight-threshold>
<weight-threshold bone="NPC Belly">1</weight-threshold>
</per-triangle-shape>
<per-vertex-shape name="Nord_Plate_Armor_F.07">
<margin>0.01</margin>
<shared>private</shared>
<tag>armor</tag>
<can-collide-with-tag>BodyC</can-collide-with-tag>
</per-vertex-shape>
<!--
<per-vertex-shape name="stomach.02.00.001..17">
<margin>0.01</margin>
<shared>private</shared>
<tag>armor</tag>
<no-collide-with-tag>armor</no-collide-with-tag>
<can-collide-with-tag>BodyC</can-collide-with-tag>
<weight-threshold bone="NPC Spine [Spn0]">1</weight-threshold>
<weight-threshold bone="NPC Spine2 [Spn2]">1</weight-threshold>
<weight-threshold bone="NPC Spine1 [Spn1]">1</weight-threshold>
<weight-threshold bone="NPC Pelvis [Pelv]">1</weight-threshold>
<weight-threshold bone="NPC Belly">1</weight-threshold>
<weight-threshold bone="L Breast01">1</weight-threshold>
<weight-threshold bone="L Breast02">1</weight-threshold>
<weight-threshold bone="L Breast03">1</weight-threshold>
<weight-threshold bone="R Breast01">1</weight-threshold>
<weight-threshold bone="R Breast02">1</weight-threshold>
<weight-threshold bone="R Breast03">1</weight-threshold>
<weight-threshold bone="L Plate01">1</weight-threshold>
<weight-threshold bone="R Plate01">1</weight-threshold>
<weight-threshold bone="L Plate02">1</weight-threshold>
<weight-threshold bone="R Plate02">1</weight-threshold>
</per-vertex-shape>
-->
</system>
</xml>
スクリーンショット
これが静止状態です。
前方に動かすと胸から離れます。絆創膏を貼ってあるので安心です。
スニークすると内側方向の可動がないため隙間ができます。