ゆっくり揺らす

体型・装備

たぷんたぷんにしたい。

はじめに

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

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つ繋がっていると鎖のような動きになって、クネクネ動いて戻るのも時間がかかる、ということなのかなと思います。

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