はじめに
Fallout 4でゆっくり揺らすようにしてみたところ、たぷんたぷん度が上昇したので、Skyrimでもやってみようと思いました。
Fallout 4はCBBE 3BBBでOCBPを使っています。そもそも選択肢がOCBPしかないわけですが、CBPにはtimetickやtimestepという、そのものズバリの設定項目があります。これを減らすことで動きがスローになります。
Skyrimでは理由があってCBPは使っていないので、HDT-SMPで同じことをしようとしたのですが、timetickに相当する設定項目は、どうやらないようでした。boneのinertiaをmassの10〜100倍にするともっさりした動きになるようです。
HDT-SMPの設定
減衰であるlinearDampingとangularDamping、戻りの強さであるrestitutionあたりを調整してみて、胸はそれなりにゆっくりにできました。ところがお尻はどう変えても速いままで、ゆっくり揺らすことができませんでした。
胸と尻の違いを調べると、ボーンの数が3つと1つで違います。それからWeightの強さが、胸は最大で緑色ですが、尻は水色で弱めです。
Skeletonの編集
とりあえずボーンを3つにしてみたところ、ゆっくりにできました。
今回は、ボーンを増やすだけにしました。既存の装備のWeightを片っ端から塗りなおすのはとても大変なので、しませんでした。
NPC L PreButtからNPC L Buttに繋がっています。この間に2つ追加して3つにします。
- NPC L PreButt
- L Butt01
- L Butt02
- NPC L Butt
- L Butt02
- L Butt01
NifScopeでskeleton_female.nifを開きます。まず、NPC L ButtにAttach Nodeでノードを2つ追加します。それからノード名をそれぞれ変更します。
TranslationはL Butt02とNPC L Buttを、それぞれYを-1にしました。NPC L PreButtは-10から-8に減らします。これでNPC L Buttが本来の位置に留まりつつ、手前に2つ追加できます。
NPC R Buttについても同様に設定します。
HDT-SMPの設定(追加ボーン)
増やしたボーンの設定を追加します。
HDT-SMPの設定 (xml)
<bone name="L Butt01">
<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="0"/>
</centerOfMassTransform>
<linearDamping>0.2</linearDamping>
<angularDamping>0.2</angularDamping>
<gravity-factor>0.01</gravity-factor>
<friction>0</friction>
<rollingFriction>0</rollingFriction>
<restitution>0.01</restitution>
<margin-multiplier>0.1</margin-multiplier>
</bone>
<bone name="L Butt02">
<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="0"/>
</centerOfMassTransform>
<linearDamping>0.3</linearDamping>
<angularDamping>0.2</angularDamping>
<gravity-factor>0.01</gravity-factor>
<friction>0.2</friction>
<rollingFriction>0</rollingFriction>
<restitution>0.02</restitution>
<margin-multiplier>0.1</margin-multiplier>
</bone>
<bone name="NPC L Butt">
<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="0"/>
</centerOfMassTransform>
<linearDamping>0.4</linearDamping>
<angularDamping>0.1</angularDamping>
<gravity-factor>0.01</gravity-factor>
<friction>0.4</friction>
<rollingFriction>0</rollingFriction>
<restitution>0.03</restitution>
<margin-multiplier>0.1</margin-multiplier>
</bone>
<bone name="R Butt01">
<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="0"/>
</centerOfMassTransform>
<linearDamping>0.2</linearDamping>
<angularDamping>0.2</angularDamping>
<gravity-factor>0.01</gravity-factor>
<friction>0</friction>
<rollingFriction>0</rollingFriction>
<restitution>0.01</restitution>
<margin-multiplier>0.1</margin-multiplier>
</bone>
<bone name="R Butt02">
<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="0"/>
</centerOfMassTransform>
<linearDamping>0.3</linearDamping>
<angularDamping>0.3</angularDamping>
<gravity-factor>0.01</gravity-factor>
<friction>0.2</friction>
<rollingFriction>0</rollingFriction>
<restitution>0.02</restitution>
<margin-multiplier>0.1</margin-multiplier>
</bone>
<bone name="NPC R Butt">
<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="0"/>
</centerOfMassTransform>
<linearDamping>0.4</linearDamping>
<angularDamping>0.1</angularDamping>
<gravity-factor>0.01</gravity-factor>
<friction>0.4</friction>
<rollingFriction>0</rollingFriction>
<restitution>0.03</restitution>
<margin-multiplier>0.1</margin-multiplier>
</bone>
<generic-constraint bodyA="L Butt01" bodyB="NPC L PreButt">
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<linearLowerLimit x="-0.5" y="-0.1" z="-3"/>
<linearUpperLimit x="0.5" y="0.1" z="3"/>
<angularLowerLimit x="-0.1" y="-0.1" z="-0.1"/>
<angularUpperLimit x="0.1" y="0.1" z="0.1"/>
<linearStiffness x="9000" y="9000" z="9000"/>
<angularStiffness x="9000" y="9000" z="9000"/>
<linearDamping x="2" y="2" z="2"/>
<angularDamping x="2" y="2" z="2"/>
<linearEquilibrium x="0" y="0" z="-1"/>
<angularEquilibrium x="0" y="0" z="0"/>
<linearBounce x="0.5" y="0.5" z="0.5"/>
<angularBounce x="0.5" y="0.5" z="0.5"/>
</generic-constraint>
<generic-constraint bodyA="L Butt02" bodyB="L Butt01">
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<linearLowerLimit x="-0.5" y="-0.1" z="-3"/>
<linearUpperLimit x="0.5" y="0.1" z="3"/>
<angularLowerLimit x="-0.1" y="-0.1" z="-0.1"/>
<angularUpperLimit x="0.1" y="0.1" z="0.1"/>
<linearStiffness x="9000" y="9000" z="9000"/>
<angularStiffness x="9000" y="9000" z="9000"/>
<linearDamping x="2" y="2" z="2"/>
<angularDamping x="2" y="2" z="2"/>
<linearEquilibrium x="0" y="0" z="-1"/>
<angularEquilibrium x="0" y="0" z="0"/>
<linearBounce x="0.5" y="0.5" z="0.5"/>
<angularBounce x="0.5" y="0.5" z="0.5"/>
</generic-constraint>
<generic-constraint bodyA="NPC L Butt" bodyB="L Butt02">
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<linearLowerLimit x="-0.5" y="-0.1" z="-3"/>
<linearUpperLimit x="0.5" y="0.1" z="3"/>
<angularLowerLimit x="-0.1" y="-0.1" z="-0.1"/>
<angularUpperLimit x="0.1" y="0.1" z="0.1"/>
<linearStiffness x="9000" y="9000" z="9000"/>
<angularStiffness x="9000" y="9000" z="9000"/>
<linearDamping x="2" y="2" z="2"/>
<angularDamping x="2" y="2" z="2"/>
<linearEquilibrium x="0" y="0" z="-1"/>
<angularEquilibrium x="0" y="0" z="0"/>
<linearBounce x="0.5" y="0.5" z="0.5"/>
<angularBounce x="0.5" y="0.5" z="0.5"/>
</generic-constraint>
<generic-constraint bodyA="R Butt01" bodyB="NPC R PreButt">
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<linearLowerLimit x="-0.5" y="-0.1" z="-3"/>
<linearUpperLimit x="0.5" y="0.1" z="3"/>
<angularLowerLimit x="-0.1" y="-0.1" z="-0.1"/>
<angularUpperLimit x="0.1" y="0.1" z="0.1"/>
<linearStiffness x="9000" y="9000" z="9000"/>
<angularStiffness x="9000" y="9000" z="9000"/>
<linearDamping x="2" y="2" z="2"/>
<angularDamping x="2" y="2" z="2"/>
<linearEquilibrium x="0" y="0" z="-1"/>
<angularEquilibrium x="0" y="0" z="0"/>
<linearBounce x="0.5" y="0.5" z="0.5"/>
<angularBounce x="0.5" y="0.5" z="0.5"/>
</generic-constraint>
<generic-constraint bodyA="R Butt02" bodyB="R Butt01">
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<linearLowerLimit x="-0.5" y="-0.1" z="-3"/>
<linearUpperLimit x="0.5" y="0.1" z="3"/>
<angularLowerLimit x="-0.1" y="-0.1" z="-0.1"/>
<angularUpperLimit x="0.1" y="0.1" z="0.1"/>
<linearStiffness x="9000" y="9000" z="9000"/>
<angularStiffness x="9000" y="9000" z="9000"/>
<linearDamping x="2" y="2" z="2"/>
<angularDamping x="2" y="2" z="2"/>
<linearEquilibrium x="0" y="0" z="-1"/>
<angularEquilibrium x="0" y="0" z="0"/>
<linearBounce x="0.5" y="0.5" z="0.5"/>
<angularBounce x="0.5" y="0.5" z="0.5"/>
</generic-constraint>
<generic-constraint bodyA="NPC R Butt" bodyB="R Butt02">
<frameInB>
<basis x="0" y="0" z="0" w="1"/>
<origin x="0" y="0" z="0"/>
</frameInB>
<useLinearReferenceFrameA>false</useLinearReferenceFrameA>
<linearLowerLimit x="-0.5" y="-0.1" z="-3"/>
<linearUpperLimit x="0.5" y="0.1" z="3"/>
<angularLowerLimit x="-0.1" y="-0.1" z="-0.1"/>
<angularUpperLimit x="0.1" y="0.1" z="0.1"/>
<linearStiffness x="9000" y="9000" z="9000"/>
<angularStiffness x="9000" y="9000" z="9000"/>
<linearDamping x="2" y="2" z="2"/>
<angularDamping x="2" y="2" z="2"/>
<linearEquilibrium x="0" y="0" z="-1"/>
<angularEquilibrium x="0" y="0" z="0"/>
<linearBounce x="0.5" y="0.5" z="0.5"/>
<angularBounce x="0.5" y="0.5" z="0.5"/>
</generic-constraint>
おわりに
理屈はよくわかりません。なんとなくですが、揺れ開始の速度は一定で、戻りがゆっくりになっている感じです。
ボーンが1つだと振り子時計のような動きになり、戻りから静止までは速いが、3つ繋がっていると鎖のような動きになって、クネクネ動いて戻るのも時間がかかる、ということなのかなと思います。