物を地面に置くのは、以下のコードになります。
745 (papyrus)
MiscObject Property Gold001 Auto ; CKで紐づけしておくこと
Function PutGold()
Actor kPlayerRef = Game.GetPlayer()
ObjectReference kGoldRef = kPlayerRef.PlaceAtMe(Gold001)
Debug.Trace("placed object reference is " + kGoldRef)
EndFunction
このPutGold関数を実行すると、プレイヤーの足元にゴールドが1枚落っこちます。これがうまくいくのは、ゴールドに正しいメッシュが設定されており、そのメッシュは正しいコリジョン(衝突判定)を持っており、物理演算によって地面に着地するからです。
では、ベッドロールを同じように置くとどうなるでしょうか。ベッドロールは重力にしたがって落下しないので、地面の傾斜と合わなかったり、何かにめり込んだり、宙に浮いたりします。
なぜ落下しないのかは私の勉強不足でわかりませんが、位置がおかしいのは何とかしたいです。そこで、何とかする方法を考えました。まず、最初にゴールドを落とし、動きが落ち着くまで待ちます。次に、ゴールドとベッドロールを入れ替えます。これで、おおむね正しい位置にベッドロールが出現します。
地面に物を置くサンプル (papyrus)
MiscObject Property Gold001 Auto ; CKで紐づけしておくこと
Furniture Property Bedroll Auto ; CKで紐づけておくこと
Function PutChest()
Actor kPlayerRef = Game.GetPlayer()
Float fAngleZ = kPlayerRef.GetAngleZ()
; Disableで作ると姿が見えない
ObjectReference kGoldRef = kPlayerRef.PlaceAtMe(Gold001, , abInitiallyDisabled = true)
; プレイヤーの目の前に持ってくる
kGoldRef.MoveTo(kPlayerRef, 80.0 * Math.Sin(fAngleZ), 80.0 * Math.Cos(fAngleZ), 20.0, abMatchRotation = false)
; 間違って拾ってしまわないようにアクティベートを禁止する
kGoldRef.BlockActivation()
; 3Dを待つ
kGoldRef.Enable()
Utility.Wait(0.5)
; 上に向かってわずかに力を加える(すると落下しはじめる)
kGoldRef.ApplyHavokImpulse(0.0, 0.0, 1.0, 0.1)
; 地面に着地して安定するまで待つ
Utility.Wait(2.0)
; ベッドロールを用意する
ObjectReference kBedrollRef = kPlayerRef.PlaceAtMe(Bedroll, abInitiallyDisabled = true)
; コインの位置に持ってくる
kBedrollRef.MoveTo(kGoldRef)
; コインはもういらない
kGoldRef.Delete()
; ベッドロールを表示する
kBedrollRef.Enable()
EndFunction
ベッドロールの位置は正しくなります。ですが、ゴールドが見えるのは変なので何とかしたいです。チャリーンという音もおかしいです。
メッシュをNifScopeで開き、Alphaを0にします。0 BSFadeNode、6 BSTriShape、8 BSLightingShaderPropertyです。これで、プレーサーの見た目が透明になります。
Scaleを5くらいにしておくといいみたいです。小さいと床に着地したときにきちんと接地しない場合が増えます。PapyrusでSetScaleしても見た目だけがかわり、コリジョン(当たり判定)は小さくならないみたいです。
コリジョンのノードにHavokの設定が色々あります。0 BSFadeNode、5 bhkCollisionObject、4 bhkRigidBodyです。
項目名 | 意味 | 値 | 書式 | |
---|---|---|---|---|
Mass | 重さ | 100 | 100 | 軽いとコロコロ転がるようです。 1000にすると動き続けてダメでした。 |
Liner Damping | 移動の減衰 | 1.0 | 0~1 | |
Angular Damping | 回転の減衰 | 1.0 | 0~1 | |
Max Liner Velocity | 最大移動速度 | 10 | 遅いと着地までに時間がかかりすぎます。 | |
Max Angular Velocity | 最大回転速度 | 10 |
このあたりはHDT-SMPの設定と同じだと思います。
音がよくわからないのですが、おそらくはMaterialで決まるのだと思われます。0 BSFadeNode、5 bhkCollisionObject、4 bhkRigidBody、3 bhkConvexVerticesShapeです。SKY_HAV_MAT_MATERIAL_COINになっていると思います。SKY_HAV_MAT_UNKNOWN_4239621792にすると無音になるようです。
この仕組みを応用したのがQuick Bedrollのベッドロール設置やEnemy Equipmentの宝箱設置になります。