自分用メモ
NR500用メモ
NR500を作る上での自分用メモです。
■Priority 99:Mount/Dismount 98:Willie(Bip02のみ94) Stoppie(Bip02のみ94) 97:TurnLeft/Right BackwardLeft/Right(上半身/Bip01FWheelB/Bip01SteeringB以外は01) 96:BankLeft/Right(Bip01Head/Neck1/Pelvis/NonAccum/NonAccumB以外は01) Backward 95:Forward FastForward(不使用) 93:Idle 91:Idle_SI(Bip01NonAccumBのみ96)
OBLIVION MOD作成支援/相談スレからのメモ
OBLIVION MOD作成支援/相談スレPart6で頂いた有り難いご指導を一時的に保存しているものです。他人が読んでも意味不明だと思いますが…。
乗れるバイクを馬方式で作るのなら、一般的には馬とは別にフォルダを作って馬と 同様にそのバイクのSkeletonやらnif類、最低限のIdle/乗り/降り/各移動kfを作って 入れてCSで馬Creatureとして指定、IdleAnimations指定を既存の馬のそれと同じに すればそれで原則OKです。 IdleAnimationsは構造を変える必要は無く、単に同じにするかLoiterIdle指定が不要 なら省略すればそれで。またこの場合PickIdleの話は特に関係無いです。 乗れるCreatureを作る話はここに。必要な事項が全部載ってます。 http://cs.elderscrolls.com/constwiki/index.php/Making_Ridable_Creatures Bip01とBip02の混在するkfのキー抽出やマージの出来るツールのリンクもそこに。 既にバイクのSkeletonは出来ているのならkfを作る作業の流れは多分以下みたいな かんじに。 1) Idle/乗り/降り/各移動のバイクだけの動きのkfをそれぞれ作る 2) 上に対応するヒトだけの動きのkfをそれぞれ作る 3) 上のリンクにあるツールでそれぞれをマージ アクターが前進後退する動きって通常は「Bip01」のkfでの移動で実現するのですが、 馬の場合は「Bip02」です。乗員のBip01は動かす必要は無いです。 また左右回転はシステムがマウス操作や必要に応じて勝手にアクターを回転するので kfでの回転は不要です。 ヒトの乗り/降り動作を馬kfから流用するなら、上のツールで馬kfから抽出しても、 単にBlenderでヒトSkeleton+馬の乗り/降りkfをImport→ExportでもOKだと思います。 ====================================================================================== ちょっと長くなりますがGetSittingでのIdle指定の話を。 例えば座りIdleの指定の「DefaultSitIdles」を見ると分かると思うんですが、まず、 Idle指定の条件はGetSittingが「3」(座った状態)ではなくて「1」(LoadingSittingIdle) の時です。 また、IdleAnimationsは毎フレーム判定されているのではなくて、特定の状態変化が あった時(それと多分適当な一定周期)に判定されます。 実際の動作の流れとしては、椅子をActivateしてGetSittingが1になると同時に システムはIdleAnimationsの指定をチェックして座りIdleのkfがロードされて再生も 始まります。 で、多分そのフレームの前後ぐらいでGetSittingが「2」になってまたシステムの チェックがあり、それと同時にPriorityの高い椅子に座る動作のkfの再生が始まり、 2つのkfは同時に再生され、座る動作が終るとIdle動作が表面に出て来てGetSittingも 3になる、という流れです。 この流れはコンソールでtdt、sdt1として再生中のkf名を見ていれば大体確認出来ると 思います。 なのでもし乗馬姿勢のIdle指定が出来るとするなら、GetSittingが「11」(LoadingHorse MountIdle)の時と考えるのが妥当な気が。 (GetSittingが「13」のRiderIdlesは乗馬中のランダムな動作の指定をするつもりで用意 はしたけど結局使わなかった、みたいな制作上の名残でしょう。多分) そこで問題は乗馬時のGetSittingが11,12,14の時に座る時同様にIdleAnimationsの チェックとIdleや乗り/降りkfのロード、再生をシステムはしてくれるのか、という 点だと思います。 これは実際にその指定をしてみれば分かりますが多分システムはGetSittingが 「11」になってもIdleAnimationsをチェックしていない可能性が。 バニラで指定がされていないので仕様上の規定はあってもシステムの不要な動作を 避ける為にチェック自体を省いた、という事も充分考えられます。 と言う事でIdleAnimationsでは乗馬Idle指定を実現するのは厳しいかもです。 ====================================================================================== GameModeブロックは1フレームにつき1回実行されます。 スクリプトの長さはもちろん短い方が処理は早いですが、if文と単純な状態取得の 関数一つ二つ程度、全体が十数行未満程度で特に処理に時間のかかる実行関数を 毎フレーム呼んだりしていないのならそんなに気にする必要は無いと思います。 またスクリプトはSave時に中間コードにコンパイルされるのでタブやスペース、 変数等のラベル名、コメントの長さは無関係です。多分。 サーキットはどうしましょうね。 PathGridをうまいこと敷いて要所にマーカーを置き、各マーカーをLocationにした TravelのAIパッケをNPCに付けて順次切り替えたり、マーカー自体を動かしたりすれば NPCを周回させたり出来そうな気もするのですが。 でも実際にやってみないとどんな挙動になるかは少し謎です。 ゴールの判定はTriggerZoneで多分簡単に出来ると思います。 あと、スクリプトがどうしても長くなってしまう場合は、処理が不要な条件を先に 判定して「Return」文で早め早めに終了させると負荷削減に効果があるみたいです。 最初の一行でフラグ変数一つを判定してすぐReturnするのならその負荷は無視して OKなレベルだと思います。 ====================================================================================== >足音 forward.kfなどのNiTextKeyExtraData内にある Enum:Right(BackRight),Enum:Left(BackLeft)を消す。 ====================================================================================== IdleAnimationsは使われる寸前にファイルが読み込まれる。 ====================================================================================== http://shy.jsphr.net/upload/img/ups19746.zip ====================================================================================== >>51のtxtで一番重要な部分を間違えてました。最後の方55行目です。 (誤)「TargetType」を必ず「Bip02」に変更を (正)「TargetName」を必ず「Bip02」に変更を ====================================================================================== 乗り物の完全水陸両用化の細かな話ですけど。 多分見た目にいいかんじにするには喫水線位置が問題に。 水中でのクリーチャーの体の沈み具合ってコリジョン形状によって自動的に決定され ます。多分。 調整はskeleton.nifのBSBound→Center/Dimentionsの変更である程度は可能です。 SS上はサンプルのまま、下は試験的にそのZをそれぞれ「30」にしてあります。 http://shy.jsphr.net/upload/img/ups19828.jpg ただ、クリーチャー生存時のコリジョンって完全な任意形状に出来る訳ではないので 指定には限界はあるとは思いますが。 >流用したいのですが、できますか?? 流用ってそのNR500.nifの事だと思いますけど、技法上の意味での流用は別にいくら でも出来ると思います。 バイクみたいに各部が固定の形状なら、Skeletonを適切に作って車体各部を別nifに して該当BoneへのAttachで指定したり、または普通にBoneアニメとしてWeightを付ける なりすれば通常のBlenderのアニメ操作でkfを作ってハンドルも車輪も動かせます。 ====================================================================================== kfを作るのは単にskeletonEdit.nifをImport→ヒト同様の方法でキーを打って→kfをExport →NifSkopeで諸指定を相当するバニラ馬kfと見比べて同じに書き換えれば原則それでOKです。 または同梱のkfをSkeletonと一緒にImportすればそのkfの改造が出来ます。 またヒト体nifや車体nifのImportをするのはBoneの具合を確認する操作上の利便の為で それ自体はkf作成の本質とは関係無いです。 ====================================================================================== >・バイクグラフィックの流用+各部を動かすのに、色々と加工が必要 これもNifSkopeを使った事はあるんですよね? Skeletonを作る、てのはNifSkopeでskeleton.nifを書き換える、て事です。 車体nifの改造も同様です。 (車体はBlenderでメッシュのWeightで、という方法もありますがそれは今は置い といて。装備とか作った事があるのでしたらそっちの方が分かり易いかもですが) 例えば上のサンプルの後輪を回すのなら、skeleton.nifのBip01PelvisBの子供として NiNode(Bone)を追加、適当な名前を付け(「Bip01 RWheelB」とか)その位置を車軸位置に 合わせ、車体nifの後輪部分だけを別nifにし、中心座標を0にしてStringExtraDataでの Attach位置指定をその追加したBone名にし、CSでバイククリーチャーの体パーツの一つ として指定すれば準備はOKです。 これってバニラ馬の眼球の構造と同じ事なのでそれを参考に。 下準備が出来たらskeletonEdit.nifにも同じBoneの追加をして該当kfにそのBoneが回る 動きを付ければゲームで車輪が回ります。 同様にフロントフォーク部分も作ってその子供として前輪を付ければ親子構造で ハンドルを切れば前輪も曲がります。 ====================================================================================== skeletonEdit.nifってボーンだけのnifなのでワイヤーフレームっぽくて 正解です。その状態にヒト体nifやバイクnifをImportすればヒトポーズ作成初期状態 blendみたいな絵面になります。 各nifのImportはそのSkeletonオブジェを選択状態にして 「ImportGeometryOnly+ParetnToSelectedArmature」ボタンをONで。 但し、そのSkeletonの場合ヒトのBip01位置がActorParentの位置だけずれているので 体nifの位置がヒトSkeletonとずれます。補正はBlender上で手動で体オブジェ位置の LocZを+1.0に。その話は同梱のtxtに。 またMarkerBike.nifはAttach位置がBip01PelvisBで、SceneRootノードにその座標補正 量が書いてあるので、Importすると多分Skeleton全体の位置が下に-5ぐらい沈みます。 その補正はBlender上で「SceneRoot」オブジェ(ヒト足元の下)のzを0に。 体nifと全体のズレが無くなったらその状態でSaveすればいわゆる「初期状態blend」に なると思います。 でもそのままだとバイクの絵はBip02を動かしても追従しないので、Blender上では Weightを付けといた方がいいかもですね。 バイク各部オブジェへのWeithtの付け方は、概念的にはバイク各オブジェにSkeleton オブジェをParent指定し、VertexGroupの「Bip01 SpineB」に全頂点のWeightを1.0に Assignすればいいんですけど、操作手順的にはちょっと説明がややこしいので、そこ だけはBlender操作関係を調べてもらう、という事でここはひとつ。 大元のBip02ではなくて特に「Bip01SpineB」にする理由は、今後アニメでバイク本体を 宙に浮かせたりウィリーさせたりする時の為です。 ====================================================================================== nifってOblivion専用ではなくて別な会社が作った汎用のフォーマットです。 またBlenderもNifScriptもOblivion専用では無くて汎用です。 一方「BSXFlags」てのはBethesda独自のnifの拡張です。 なのでExportされたnifにBSXFlagsが無くても何も不思議ではないです。 ====================================================================================== Blenderを起動し、Import画面でまず「skeletonEdit.nif」を指定し、ボタン画面で一回 「RestoreDefaultSetting」を押し、「ImportSkeletonOnly+ParentToSelectedArmnature」 を押してON状態にし、「ImportAnimation」ボタンを押してOFF状態にして「OK」を。 で、次に体nifのImportですけど、まずバニラのheadhuman,upperbody,lowerbody,hand, footの各nifを用意して下さい。female〜でも多分OKです。 上でも言いましたけど、バニラ以外のnifは動作に責任は持てないです。 用意が出来たら、Skeletonを選択状態のままImport画面で例えばheadhuman.nifを指定、 ボタン画面で「ImportGeometryOnly+〜(後半部は間違い易いので省略)」を押して 「OK」を。「ImportAnimation」はOFFです。 で、オブジェの位置操作の為にObject→TransformPropertiesを出し、Importした頭を 選択してそのTransformPropertiesの「LocZ」を+1.0します。これで頭とSkeletonのズレ が無くなるはずです。 以降Skeletonの選択→体nifのImport→LocZ+1.0を必要なだけ繰り返します。 体nifが全部Import出来たらPoseModeで各ボーンを動かして体メッシュが追従して動く か確認を。それが正常なら体nifのImportはOKです。 blend形式でのSaveは別にいつでもOKなのでこの辺で一度Saveしとくといいかもです。 ====================================================================================== あとBoneに体メッシュが追従するかの確認の時ですけど、Skeletonオブジェを選択→ PanelsのEditing→Armature→EditingOptionsの「X-Ray」ボタンを押すと、Boneが 体メッシュに隠れずに見える様になって選択し易くなります。 ====================================================================================== MarkerBike.nifのImport自体はそれでOKです。 全体の位置が下にズレるのはゲームでの表示の辻褄併せにバイクnifの「SceneRoot」に Bip01SpineBとの位置が合う様に暫定的にその値が書いてあるからです。 その下に沈んだ状態の修正は、ヒトの足の下の「SceneRoot」オブジェを選択して TransformPropertiesでLocZを「0」に。 あと、少し話が逸れますが。 本来はMarkerBikeのモデルはBip01SpineBの位置を原点にするのが筋な気もします。 でも今その辺の話をするのは混乱の元な気がするので、モデルの座標には色々な考え方 や方法があり、このサンプルのnifや方法手順だけが別に唯一では無い、という事だけ をとりあえず頭の隅に。 で、また別な一般的な話ですが、明らかにObと違う座標系で作られたモデル(NiNode/ TriStripesの変換では無く、Y:P:Rが0の「素の状態」で横倒しだったりひっくり返って たり前後が逆だったりするモデル。ObはY正方向が「前」でZ正方向が「上」)の修正は、 NifSkopeでNiNode/NiTriStripesに好きな移動/回転変換値を入れて右クリ→Transform →Applyで出来たりします。 バイクの絵はそのままではBoneに追従しないのでWeightを付ける作業が必要に。 まずバイクの「Frame」オブジェを選択、Shiftを押しながらSkeletonを選択して二つを 同時に選択した状態にし、Object→Parent→MakeParentしてMakeParentToで「Armature」 を、CreateVertexGroups?で「NameGroups」を選びます。 次にFrameオブジェだけを選択し、EditModeにして全頂点を選択します。 「A」キーを何度か押してワイヤーフレーム全部が明るくなれば全選択状態です。 その状態でPanels→Editing→Link and MaterialsのVertexGroupsのBone名(多分最初 は「EntryPoint」となっているはず)の左のボタンでBoneのリストを出し、 「Bip01 SpineB」を選び、「Weight:1.000」なのを確認して「Assign」ボタンを。 これで一つのオブジェのWeight付けは完了です。 同じ事をバイクのFWheel,RWheel,FFork,Seat,SBar各オブジェに。これでバイクと 乗員が一緒にBip01SpineBに追従して動きます。確認を。 これで初期状態を作る作業は全部終わりです。 後はヒトアニメを作る手順と同じです。 ====================================================================================== Bip01SpineBを動かしてもその親Boneが動かないのはそれでOKです。 前進/後退でバイクを動かす時は「Bip02」を動かします。 例えばウィリーさせる、みたいな場合に、Bip02を「前」に動かしながらBip01SpineB (PelvisBでも多分NonAccumBでも)を回転/移動させて相対的なバイクの位置や向きを 作ります。 またPelvisやSpineというのは動物の場合の命名規則に倣っているだけなので、Boneの 名前自体は実は「Frame」でも「Seat」でも「ABC」でも何でも良かったりします。 あとkfの設定は、相当する馬kfとNiControllerSequenseの名前とCYCLE_TYPEを同じに してTargetNameを「Bip02」にすればOKです。 TimeLineとかTextKeyの指定はヒトポーズやアニメを作る時と同様に必要なフレーム数 やキーを指定で。 ====================================================================================== ゲームでの前進後退の移動距離はkfの移動距離を変えれば変わります。 でも移動距離とフレーム数って、馬の場合は足の動きの周期と歩幅の結果ですし、 バイクなら車輪の回転数と円周で一意に決まると思うので、結局アクターのSpeedで 移動アニメを早く/遅く再生するのと同じ事だったりするかもです。 任意kfの再生はIdleAnimationsの指定を。クリーチャーもNPCと同じです。 条件はトークン用アイテムのGetItemCountでも上で出たFactionでも。 相手がバイクならトークンアイテムは多分何でもOKです。有り物のリンゴでも何でも。 IsKeyPressed3でのキー入力検知はここの二つ目のコード例を。 http://cs.elderscrolls.com/constwiki/index.php/IsKeyPressed3 その例のif文の前に「set MyKey to 33」と書き、そこの「do stuff,〜」に例えば トークンアイテムがAppleなら、 AddItem Apple 1 PickIdle RemoveItem Apple 1 と書いてバイクにそのスクリプトを付ければとりあえずは動くと思います。 でも多分PCが乗っていなくても動くのでリモコン操作も出来てしまうかもですが。 またIsKeyPressedは環境によってはOblivion.iniの「bBackground Keyboard」とも関係 するので、動かない場合はその辺の確認も。 ====================================================================================== 乗馬中の馬での攻撃って少し厄介かもです。 乗馬時の馬攻撃アニメの再生自体は馬ならhandtohandattackforwardpower.kfを そのままSpecialIdle化してPickIdleで可能ですし、バイクも同様にウィリーでも 何でも攻撃っぽいアニメを作って再生すればそれで見た目はOKだと思います。 でもSpecialIdleは単にアニメの再生だけで攻撃の当たり判定(TextKeyの「Hit」)は 実行されないのでその辺を自前でなんとかする必要が。 相手にダメージを与える事自体はスクリプトで適当なオブジェを出してダメージ系の SpellをCastさせたり、Trapオブジェを出してそのままダメを与えたり、TriggerZoneを 出して交差したアクターにModAV2 Healthしたり、みたいに方法は色々あります。 でもそれだけだとダメージ元がPCでは無いので戦闘が始まらず犯罪にもならなかったり します。 この、他のオブジェ起因のダメージをPCがやった事にしてシステムのCrime関係の辻褄 を合わせる、てのが非常に厄介です。 似た様な例で遠距離武器の話が前スレにあるのでそれを。 あと以前ネタでやった事があるのですが、走行中にTriggerZoneを常時前方にSetPos して交差したアクターをPushActorAwayすると通行人を跳ね飛ばしたり出来ます。 ====================================================================================== BlenderとObでは座標の扱いが違うので1:10の補正が必要です。 前進後退中の左右方向転換はkfアニメの合成で回るのではなくてシステムが直接Zを 回しているのだと思います。 ゲームで今どのkfが再生されているかはコンソールでtdt、sdt1を。 前進後退中に左右に向きを変える時にPickIdleでハンドルを切るアニメを重ねる、 て事なら車輪の回転はPriorityの指定が適切なら問題無いと思います。 でも、ハンドルが切れ始める短いアニメ→ハンドルが切れたまま固定のアニメ→それを 任意に中断して→ハンドルが戻る短いアニメ、みたいにする場合はタイミングによって はPickIdleが不発になる事もあるかもなので色々要テストです。 ====================================================================================== レースならオーバースピードでコーナーに入ると転倒するとかどうですかね。 乗員やバイクをPushActorAwayで。またIdleAnimationsのGetUpFaceUp/Down指定で 泣きながらバイクを起こすアニメとか出来たりするかもです。やった事無いですが。 ====================================================================================== 2で攻撃が出来る様になって謎の敵ライダー登場、 Episode3でサーキット兼闘技場で因縁の対決、みたいな展開が個人的に大好きです。 ====================================================================================== アクターの落下ダメージ自体は「ResetFallDamageTimer」で抑止出来ます。 なのでとりあえずの二人乗り実現にはa)が一番お手軽かもです。 でも今後例えば同乗者がバイクまで実際に歩いて行って乗り降りする動きを付けたり するのならb)が逆に最終的に単純になるかもです。 例えば透明な椅子オブジェをMoveToしてその椅子をLocationにしたTravelの AIパッケをAddScriptPackageすれば同乗者をバイクまで歩かせて座らせる事は 出来ます。 IdleAnimationsでそのアイテムを持っている事を条件に椅子に座る/立つ/座りIdle を追加指定すれば好きな乗り/降り/乗車姿勢アニメは多分簡単に。 座った状態を維持するのは「SetRestrained 1」で可能です。 ======================================================================================
以下は無節操にメモったもの。
CSWiki(英語)。>>970さんの指摘ページはここだね、きっと。 http://cs.elderscrolls.com/constwiki/index.php/Portal:Scripting ブログ紹介系(日本語) http://ke-ta-ke-ta.seesaa.net/ http://toknohimatubushi.cocolog-nifty.com/blog/2008/01/post_150b.html なんかすごく詳しい方のブログ http://deutschefrauen.wordpress.com/category/spiele/oblivion/oblivion-mods/ MOD製作されてる方のページ、下のほうのメモが私のお気に入り。 http://einsobl.web.fc2.com/top.html あと、理解が進んできたら、英語だけどOBSEv19のヘルプに目を通したほうがよいと思う。 新機能満載で、便利な命令とかかなり増えたので、今後v19が主流になりそうな気がする。 http://obse.silverlock.org/obse_command_doc.html ====================================================================================== 俺もモーション作成中だけど、パワーアタックは作った事無いからあれだけど Text Keyの追加、編集ならBlenderでやった方が楽だよ。 BlenderとNifScriptのバージョンが古いとできないけどね http://niftools.sourceforge.net/wiki/Blender/Oblivion_Character_Animation 英語だけど画像もあるからなんとなく判ると思うけど、 ここの一番下にText Keyの編集画面の出し方が乗ってる。 で、編集画面出して上にスクロールすると、たぶん 1/Idle: Start/Idle: Loop Start 45/Idle: Loop Stop/Idle: Stop か 1/start 1/end が、書いてあると思う。 フレーム数/左のフレーム数の時にどんな処理をするかって意味になってる。 Idleモーションの場合は、単純に 1/start ←フレーム1から始める(これ以外にすることは無いと思う) 50/end ←最終フレーム数50で終わる(フレーム数が70の場合は70にする) Cycle TypeがLOOPならstartに戻る これで良いんだけど、パワーアタックの場合はhitが間に入るから 1/start ○/hit ←このフレーム数の時に、攻撃が当たる 50/end ○の部分は、作ったモーションを見て決めてもらうとして こういう風にすればNifskoopでText Keyを追加しなくても、ちゃんと3つできてるよ。 ちなみに 1/Idle: Start/Idle: Loop Start ○/Idle: Loop Stop/Idle: Stop これはバニラのモーションに書かれてるText Keyだけど startとendをこれにすると、なぜかクラッシュする。 後はNifskoopでNameをAttackPower (AttackLeftPower、AttackRightPower、AttackBackPower、AttackForwardPower)にして Cycle TypeをCYCLE_CLAMPにする。 ====================================================================================== 直前のポーズとの間を平滑化するモーションの作り方: CSをいじっていて気付いたのですが、Vanila(或いはSI?)のUniqueIdleAnimsにある DaedricShrinePonder01〜03は直前のポーズとの間のモーションを滑らかに埋めて Idleを行っているのですが、これは何かパラメータを指定すれば出来るのでしょうか? ponder〜.kfに倣ってNiTextKeyExtraDataにTextKeyを挿入、「Blend: 20」みたいに それっぽい数字を入れるとその値に応じて補完の時間が変わるみたいです。 Blenderでそのテキストを書いてもOKかもです。 ====================================================================================== NiTextKeyExtraData 内の Text Keys が今のままだと2つだと思いますので、 これをまず、4つにします(NiTextKeyExtraData → Num Text Keys の Value を4にして、 Text Keys を右クリック → Array → Update) 画像の通りに設定してください (floatは適当でも大丈夫かもしれません) http://shy.jsphr.net/upload/img/ups10509.jpg 一つ目の Text Keys の Value が start 二つ目の Text Keys の Value が Blend: 9 三つ目の Text Keys の Value が Hit 四つ目の Text Keys の Value が end ====================================================================================== TextKeyのBlend:nはnフレームの間2つのモーションの平均化であり、Prioriyに影響しない ====================================================================================== http://www.truancyfactory.com/animdata.htmlの Blend:を機械翻訳して少し修正した物。かなり不正確なので、雰囲気だけ感じ取ってください。 Blend:[フレーム数(整数)] アニメーションの全てのBoneのPriorityの調整のために範囲を指定してください。 既存のPriorityは、指定したフレーム数前後で合うように変更されます。 そこでは指定したフレーム数だけPriorityをBlendします。 これは全体のアニメーションに適用されます。 これらは明確ではありません。 ・アニメーションPriorityがどれくらい長い間存在しているか ・設定されるアニメにPriorityが特定であるかどうか ・ゲームエンジンの一般的な設定を変えるかどうか BlendはBlend keyframeで始まり、アニメーションが終わると終わり、 そしてBlendはBoneのPriorityにだけ影響すると思われます。 いくつかのアニメーションがBlend:0と設定されていますが、しかしながら、 0にBlendすることを強制されているように見えます。 Blendがキーを設定されたアニメーションに制限されるなら、これがなぜ必要であるかが 私にはよくわかりません。が、Blendすることがゲームエンジンの一般的な設定であり、 確実にアニメーションがBlendされないなら、納得するかもしれない。 blockhitとhandtohandblockhitアニメーションでこの例を見つけることができます。 ====================================================================================== 「Bip01 head」と「Bip01 NonAccum」の方向の不一致な気が。 「頭を回転させると体が捻れる」というのは、頭とNonAccumの角度の関係がデフォから 変化した=視線のトラッキングやアニメで頭がどこかを向いた→首が回った状態を 滑らかに見せる為に背骨各部に回転量を分配する、というシステムの動作の為です。多分。 なので回避には頭の方向を変えたら同じ方向にNonAccumを向けて頭が動いていないのと 等価な状態をわざと作ってシステム動作を抑止する方法があります。 解説サイト等にある「Pelvisを回転して頭を正面にしてNonAccumで戻して〜」みたいな 手順は両者の方向を揃える為の一つの方法です。 あとPriorityですが、このシステム動作が起きるのは「頭とNonAccumの向きが一致 しない時」という条件だけ(多分)なので、Priorityを上げて視線のトラッキングは抑止 してもkf自体に頭の回転が既に含まれNonAccumとの不一致がある場合はやはり捩れが 起きたりします。 ====================================================================================== Travel動作はデフォで全てのAIパッケに含まれているので、目的の場所と動作を指定 すればNPCは自然にTravelします。 ですから大抵の場合は単体のTravelパッケージは使わなくても用は足ります。 例えば、ICにいるNPCに朝7時からChorrolの特定のLocationでWanderするパッケを付けると、 朝の7時にICを出発してChorrolまでTravel、その場所に到着後Wanderを開始します。 適当に曜日で間隔を置いたICとChorrolでWanderするパッケを二つ付ければ二都市間を 定期的に往復する旅人になります。 もっと緻密なNPCの位置操作が必要な場合は単体のTravelパッケが良かったりするの ですが、色々な応用を含めての話になると思います。これは動作させたい内容次第です。 ====================================================================================== ダメージを与えるのはTouchのSpellでも良さそうな気はするのですが、他にはTrap オブジェでも。 PCを攻撃させるなら単純にStartCombatかTargetのSpellにしてSetPlayerProjectile したり。 または別な考え方として、ScriptEffectでTarget、VisualEffect無し、 EffectisHostile指定のSpellを作り、見えないProjectileを発射してTriggerZoneで Refを取得してSetPlayerProjectilesし、Get/SetPosでProjectileの位置に任意の 弾用オブジェを表示、みたいな方法でも。 速度の変更はProjectileに適当なベクトル増分をSetPosすれば多分行けそうな気が。 弾の速さや連射速度、見た目や精度をどの程度重視するかでそれに適した方法は多分 色々な気がします。 ====================================================================================== 殺害数みたいな相手死亡時のCrime関係は、相手のHealthを見て最後のとどめの一撃を 「相手.Kill Player」にする事でシステムの辻褄を合わせる事は多分出来ると思います。 Trapで先に死なない様にその時だけTrapのダメージをごく小さくしたり。 厄介なのは恐らく相手が死なない程度の攻撃時の友好/敵対によるCrime関係で、これの 辻褄を合わせるにはSourceがPlayerでHostileなProjectileを相手に当てる方法しか 現状思い付かないです。 でもProjectileを発射すると透明でもドーンと音がうるさいですし。 その辺が何とかなれば特にStartCombatしなくても相手の反応はシステム任せでOKに なると思うので何かうまい解決策があればいいのですが。 ====================================================================================== 「Skin(Bone)アニメ」 メッシュにボーンと各頂点のWeight(重み)を仕込み、ボーンに対する移動回転拡縮の量を 重み付けに応じて各頂点に反映、メッシュの変形をするアニメ。 PCやNPC、クリーチャーの体アニメでおなじみのアレです。 アクター以外の単体オブジェとしてはアリーナの観客が。 あと用語的に「Skinアニメ」は「Morphアニメ」も含む気がするのでこの場合は「Boneアニメ」 と呼ぶのが正解かも。 「Objectアニメ」 オブジェクト単位でまとまって移動回転拡縮する一番単純なアニメ。 ドアやスイッチ、レバー類のアニメがこれです。 「Morphアニメ」 違う形状の二つのメッシュの対応する各頂点座標を補間計算することで中間の形状を 作るアニメ。 弓やクリーチャーの顔、船の旗や三角の帆とか。 PCやNPCの表情も理屈は同じ「Morph」なのですがFacegen関連はnifとは管理方法が全く 別です。 ====================================================================================== どんなものか使ってみたくてConstruction Set Extenderを入れてみたが、 導入が結構面倒だったので作成支援にメモを書き残しておく。 (!)はCSEのreadmeを読む限り重要な所。 前準備:OBSE ver20を導入し、CSEの中身をそのままoblivionフォルダにコピーする。 1.cs.elderscrolls.com から Construction Set の 1.0 と 1.2Patcher を入手する。 2.とりあえず CS1.0 をインストールし、TESConstructionSet.exe のコピーを作りそれを TESConstructionSetOld.exe と改名する(!)。 3.CS1.2Patcher を使って CS を 12404 にしたら一旦普通に起動して ConstructionSet.ini を作る。 4.My Games\Oblivion の ConstructionSet.ini を開いて bAllowMultipleEditors を検索し =1 にする(!)。 5.obseからCSを起動して Console Window が表示されれば導入成功。 ====================================================================================== http://d.hatena.ne.jp/AkatsukaTaro/20070401 Diffuse - 拡散反射光 物体の表面に光があたると、光のあたる角度によって色合いが変化します。 このように、あたる角度によって色合いを変化させるような光を、拡散反射光といいます。 定性的には、面に垂直に光があたれば、最も明るい色になり、 面と光のなす角度が垂直から水平になるにつれて暗くなっていきます。 Specular - 鏡面反射光 その名の通り、物体が鏡のようになって反射される光のことです。 Ambient - 環境光 Diffuse と Specular は、光が直接当たる部分にしか影響がありません。 つまり、光源が1つしかない場合、光のあたらない裏側は完全に暗いままです。 しかし、実際は光が周囲の壁などに乱反射して裏側もある程度明るく見えます。 その乱反射を実際に計算しているととんでもなく時間がかかるので、擬似的に一定の強さの光が 全ての面に当たっているとするのがゲームプログラミングの常套手段となっています。 その、一定の強さの光が環境光です。 Emissive - 発光 そのまんまです。 ====================================================================================== Ambient 環境光に対する照らされかた。環境光とは、空気による乱反射などによる光のこと。 実際には、環境光が一定などということは無いが、わざわざ計算するととんでもない計算量になるし、 一定にしてもたいして問題にはならないので、OpenGLでの環境光はどの物体も一定の明るさに 照らすようになっている。この値を大きくすると、環境光に対して明るく照らされるようになる。 あまり大きくするとのっぺりして、立体感がなくなるので注意。 Diffuse 拡散光に対する照らされかた。拡散光とは、点光源から全方位に向かって放たれる光のこと。 ポリゴンの向や、光源からの距離によって明るさが変わってくる。 Specular 鏡面反射のようなテカテカ感を出す。この値を大きくすると、光源が映り込むような感じとなり、 ポリゴン表面が金属光沢があるように見える。 Shiniess この値を大きくすると、光源の映り込みがより鋭くなり、表面がよりツルツルに見える。 Emission この値を0以上にすると、自ら発光し、光源がなくても物体が見える。 ただし、見えるのはその物体自信だけであり、周りの物体がこれによって照らされることはない。 ======================================================================================