Skyrim SE用に変換してHDT-SMPに対応させる
HDTに対応していないスカートを揺らすとほぼ同じです。スカートのShapeは1つなので楽です。同じことを繰り返し書いてもしょうがないので手順は省略します。
Simple SkirtのNIFをインポートしたらスカートの位置を合わせます。Transform toolを使ってだいたいでいいのでこのように重なる位置に持ってきます。こうするとWeightのコピーがしっかりできます。
スカートのboneは上から順にDress 1からDress 5までありますが、1が一番上の腰に近い部分で、ここは動かさないようです。2からが動きます。この2のweightが腰に近すぎると、腰の位置にあるコリジョンと常に衝突して震えてしまいますので、それを考慮して腰から少し下になるようにします。
Dress 1はあってもなくてもいいみたいでしたのでコピーしませんでした。そのかわり、腰の動きを追従させたいので、PelvisとSpineをまずコピーして、そこからDress 2~5をコピーしました。Dress 1をコピーするとSpineのWeightがほとんど消えてします。
HDT-SMPの設定ファイルは、とりあえずangularLowerLimitとangularUpperLimitのy軸を-0.5~0.5までにします。可動範囲を広げることで、どこが可動しているのか、つまりBoneとShapeとWeightの関係を見た目で判断しやすくするためです。
このSimple Skirtのshapeを含んだShape Dataを調整用として別名で残しておくといいです。調整が済んだら本命のShape Dataとして保存します。再度調整したくなった時に調整用Shape Dataを読み込んで編集すれば楽です。
コリジョンを調整する
Transform toolでだいたいの位置に合わせて、盛り上げツールで微調整します。前は身体ピッタリに、後ろは隙間を持たせました。
前は隙間があるとスニークしたときにスカートが浮いてしまうからです。後ろはCBBE 3BBBでお尻や太ももが揺れますが、スカートがその動きに追従できずはみ出してしまうからです。
スカートにお尻のWeightを塗っても、お尻の揺れに合わせてスカートも揺れるというおかしな動きになってしまうのと、スカートのヒラヒラ用に塗ったWeightが消えてしまいます。
コリジョンの衝突判定は強力なものではなく、勢いが強いと一瞬食い込んでしまうようです。
HHairstylesのコリジョン装備が使えないか試してみた
Simple SkirtにはCollisionLegsという太ももあたりに目に見えない当たり判定を追加するShapeがあり、これとスカートが衝突することで身体への食い込みを防いでいました。これを仮にSimple Skirt方式と呼ぶことにします。
一方、HDT-SMP Physics Wigs Patch and Package for Great modders’ workのカツラには頭のコリジョンはあるようですが、身体のコリジョンはありません。コリジョン装備の指輪の方に全身を覆う形のコリジョンがあります。こちらをHHairstyles方式と呼ぶことにします。
私はこれまでてっきりSimple Skirt方式しかないと思っていましたが、HHairstyles方式だとコリジョンは1つだけ用意すればいいので、作業を短縮できてよさそうです。
ということで、HHairstylesのコリジョンが使えないか試行錯誤した結果、成功しました。スカートのtagにXingHairを指定するだけです。CollisionLegsの定義は削除します。
ところが、HHairstylesのコリジョンは全身を覆うような形をしているので、常に身体に近い位置にあるスカートのようなshapeの場合、身体に近いあたりが常に衝突して震えてしまいます。カツラは身体から遠い位置にあるので問題にならないのでした。ですから、ヒラヒラさせたい部分は身体から遠いところだけにして、shapeを独立させるのがいいと思います。
ハマったのが、設定ファイルを書き換えたらコンソールでsmp resetを実行して読み込み直すのですが、この時コリジョンが消えてしまいます。装備を外して付けなさないと復活しません。
NexusのフォーラムにA Guide to HDT-SMP Users/Moddersという投稿があるので参考にしました。
他にもCBBE 3BAのコリジョンを使えないかと色々試したのですが、こちらはまだできていません。
HDT-SMPの設定ファイル - Memeru Outfitのスカート (xml)
<?xml version="1.0" encoding="UTF-8"?>
<system xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="description.xsd">
<per-triangle-shape name="VirtualGround">
<margin>1</margin>
<prenetration>4</prenetration>
<tag>ground</tag>
<no-collide-with-tag>ground</no-collide-with-tag>
</per-triangle-shape>
<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 RT Anus2"/>
<bone name="NPC LT Anus2"/>
<bone name="NPC LB Anus2"/>
<bone name="NPC RB Anus2"/>
<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="Clitoral1"/>
<bone name="VaginaDeep1"/>
<bone name="NPC Spine [Spn0]"/>
<bone name="NPC Spine2 [Spn2]"/>
<bone name="NPC Spine1 [Spn1]"/>
<bone name="NPC Pelvis [Pelv]"/>
<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 Breast01"/>
<bone name="NPC R Breast01"/>
<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 Butt"/>
<bone name="NPC R Butt"/>
<bone name="NPC L Pussy02"/>
<bone name="NPC R Pussy02"/>
<bone name="NPC Belly"/>
<bone name="NPC L Hand [LHnd]"/>
<bone name="NPC R Hand [RHnd]"/>
<bone name="Dress Left B 1" />
<bone name="Dress Left F 1" />
<bone name="Dress Right B 1" />
<bone name="Dress Right F 1" />
<bone-default>
<mass>1.5</mass>
<inertia x="25" y="25" z="25" />
<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.1</friction>
<rollingFriction>0.5</rollingFriction>
<restitution>0.5</restitution>
</bone-default>
<bone name="Dress Left B 2" />
<bone name="Dress Left B 3" />
<bone name="Dress Left B 4" />
<bone name="Dress Left B 5" />
<bone name="Dress Left F 2" />
<bone name="Dress Left F 3" />
<bone name="Dress Left F 4" />
<bone name="Dress Left F 5" />
<bone name="Dress Right B 2" />
<bone name="Dress Right B 3" />
<bone name="Dress Right B 4" />
<bone name="Dress Right B 5" />
<bone name="Dress Right F 2" />
<bone name="Dress Right F 3" />
<bone name="Dress Right F 4" />
<bone name="Dress Right F 5" />
<per-triangle-shape name="skirt">
<margin>0.1</margin>
<prenetration>0</prenetration>
<tag>XingHair</tag>
<no-collide-with-tag>XingHair</no-collide-with-tag>
</per-triangle-shape>
<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.04" y="-0.04" z="-0.08" />
<angularUpperLimit x="0.04" y="0.26" z="0.08" />
-->
<angularLowerLimit x="-0.04" y="-0.1" z="-0.08" />
<angularUpperLimit x="0.04" y="0.3" z="0.08" />
<linearStiffness x="0" y="0" z="0" />
<angularStiffness x="0" y="0" z="0" />
<linearDamping x="0" y="0" z="0" />
<angularDamping x="0" y="0" z="0" />
<linearEquilibrium x="0" y="0" z="0" />
<angularEquilibrium x="0" y="0" z="0" />
</generic-constraint-default>
<constraint-group>
<generic-constraint bodyA="Dress Left F 2" bodyB="Dress Left F 1">
<angularUpperLimit x="0.04" y="0.6" z="0.08" />
</generic-constraint>
<generic-constraint bodyA="Dress Left F 3" bodyB="Dress Left F 2">
<angularUpperLimit x="0.04" y="0.6" z="0.08" />
</generic-constraint>
<generic-constraint bodyA="Dress Left F 4" bodyB="Dress Left F 3">
<angularUpperLimit x="0.04" y="0.6" z="0.08" />
</generic-constraint>
<generic-constraint bodyA="Dress Left F 5" bodyB="Dress Left F 4">
<angularUpperLimit x="0.04" y="0.6" z="0.08" />
</generic-constraint>
</constraint-group>
<constraint-group>
<generic-constraint bodyA="Dress Right F 2" bodyB="Dress Right F 1">
<angularUpperLimit x="0.04" y="0.6" z="0.08" />
</generic-constraint>
<generic-constraint bodyA="Dress Right F 3" bodyB="Dress Right F 2">
<angularUpperLimit x="0.04" y="0.6" z="0.08" />
</generic-constraint>
<generic-constraint bodyA="Dress Right F 4" bodyB="Dress Right F 3">
<angularUpperLimit x="0.04" y="0.6" z="0.08" />
</generic-constraint>
<generic-constraint bodyA="Dress Right F 5" bodyB="Dress Right F 4">
<angularUpperLimit x="0.04" y="0.6" z="0.08" />
</generic-constraint>
</constraint-group>
<constraint-group>
<generic-constraint bodyA="Dress Left B 2" bodyB="Dress Left B 1" />
<generic-constraint bodyA="Dress Left B 3" bodyB="Dress Left B 2" />
<generic-constraint bodyA="Dress Left B 4" bodyB="Dress Left B 3" />
<generic-constraint bodyA="Dress Left B 5" bodyB="Dress Left B 4" />
</constraint-group>
<constraint-group>
<generic-constraint bodyA="Dress Right B 2" bodyB="Dress Right B 1" />
<generic-constraint bodyA="Dress Right B 3" bodyB="Dress Right B 2" />
<generic-constraint bodyA="Dress Right B 4" bodyB="Dress Right B 3" />
<generic-constraint bodyA="Dress Right B 5" bodyB="Dress Right B 4" />
</constraint-group>
</system>