トップページ > 記事閲覧
物理演算の一時停止処理(+α)
名前:名無三 日時: 2020/01/11 17:51

現状、見えているモデルは物理演算を更新し、見えていないモデルは物理演算をリセットして破たんを防ぎつつ軽量化しようとしています。 ですが、見ている限りですとリセットしたモデルではボーンが破たんしてしまっているようです。 github.com/yumetodo/TankFlanker (yumetodoさんのgithubですすいません) define.cppの500行付近にて if (!in_f) { for (size_t j = 1; j < hum.size(); ++j) { MV1PhysicsResetState(hum[j].obj.get()); } in_f = true; } という形で車内に入った際にリセットをかけています 原因は何でしょう…
メンテ

Page: 1 |

Re: 物理演算の一時停止処理 ( No.1 )
名前:管理人 日時:2020/01/11 01:31

とりあえず現象を確認しようと思い、github の最新版をダウンロードして define.cpp の 500行目に ブレイクポイントを置いて起動してみたのですが、戦車を走行させてキャラクターモデルが 車内に入った後も 500行目に来ません… どうすれば 500行目付近が実行されますでしょうか?
メンテ
Re: 物理演算の一時停止処理 ( No.2 )
名前:名無三 日時:2020/01/11 09:33

すいません、マウスホイールで車内ビューに移動してもらえると実行されると思います
メンテ
Re: 物理演算の一時停止処理(+α) ( No.3 )
名前:管理人 日時:2020/01/12 05:46

ご返答ありがとうございます、確認できました 細かくは追い切れていないのですが、MV1PhysicsResetState を呼んでいるタイミングが悪いようです あと、define.cpp の 496行目からの if (rad.z >= 0.1f) in_f = false; if (rad.z == 0.1f && !in_f) { for (size_t j = 1; j < hum.size(); ++j) { MV1PhysicsResetState(hum[j].obj.get()); } in_f = true; } こちらの処理は、車内にカメラがある場合は毎回 MV1PhysicsResetState が呼ばれるようになってしまっています ( in_f が true でも車内( rad.z が 0.1f )では if (rad.z >= 0.1f) が真になるので in_f は必ず false になり、 in_f が false で車内( rad.z が 0.1f )の場合は if (rad.z == 0.1f && !in_f) も真になるので ) とりあえず上記部分を bool physicsReset = false; // ← 物理演算をリセットするかどうかのフラグ if (rad.z > 0.1f) // ← 比較演算子を >= から > に変更 in_f = false; if (rad.z == 0.1f && !in_f) { in_f = true; physicsReset = true; // ← physicsReset は in_f が false から true に変更された最初のフレームだけ true になる } こちらのようにして、577行目の MV1PhysicsResetState を実行するかどうかを決定する if文である if (!first) { こちらの部分を if (!first || physicsReset) { // ← physicsReset が true の場合もリセットする と変更することでボーンが破綻はしなくなります ただ、戦車を走行させている状態で視点を車内に移すと、物理演算がリセットされて速度時速0kmになった キャラクターの物理演算部分が一瞬で戦車の速度になるため、物理演算部分( 髪 )が車内に視点が移った瞬間に 跳ね上がる現象が発生します これを防ぐには、やはり車内にいるキャラクターも常に物理演算を行うか、若しくは車内の映像用に専用の モデルハンドルを使用するようにして、そのモデルハンドルは移動しないようにすることで物理演算が戦車の走行の 影響を受けないようにする( CGが使用されていなかった時代では激しく動く乗り物を外側から見た時の映像と、 乗り物の内部で俳優達が乗り物を操縦する映像は別々に撮影していた、というようなことと同じことを行う ) といった方法を採用する必要があります
メンテ
Re: 物理演算の一時停止処理(+α) ( No.4 )
名前:名無三 日時:2020/01/12 21:29

ありがとうございます、一回呼び出せばいいのですね。 それとついでに… モデルのテクスチャについてなのですが、bmp、png、dds、tgaなどと形式を変更した際に描画速度に影響はありますか?確証が持てなくて
メンテ
Re: 物理演算の一時停止処理(+α) ( No.5 )
名前:管理人 日時:2020/01/13 09:33

> モデルのテクスチャについてなのですが、bmp、png、dds、tgaなどと形式を変更した際に描画速度に影響はありますか?確証が持てなくて はい、影響はあります 形式というより、アルファチャンネルがあるかどうか、圧縮テクスチャかどうか処理負荷が変化します 基本的に圧縮テクスチャが描画速度が軽いのですが、圧縮テクスチャに対応しているのは dds 形式のみです 更に、dds 形式でも内部のデータフォーマットが DXT1〜DXT5 又は BC1〜BC3 又は BC7 の場合のみ圧縮テクスチャとなり、 それ以外の ARGB8 などの標準フォーマットの場合は dds 形式のファイルであっても圧縮テクスチャではありません ( dds形式で保存する際などに内部形式を選択することができると思います ) アルファチャンネルがあるかどうかは bmp, png, dds, tga 共通で、基本的にアルファチャンネルがある画像は アルファチャンネルが無い画像より重くなります ( こちらも各フォーマットで保存する際にアルファチャンネル付きで保存するかを選択できると思います  ( 選択できず、必ずアルファチャンネルつきで保存されてしまうソフトもあるかもしれませんが… ) ) ( 因みに dds の圧縮テクスチャ形式の場合も DXT1 又は BC1 以外はアルファチャンネルがあります ) あと、圧縮テクスチャは『圧縮率の高いjpeg画像』のように見た目が劣化しますので、圧縮後の画像が見た目が 問題ないかを確認して、もし見るに堪えない場合は標準フォーマットにする必要があります ( jpegと異なり圧縮率設定が無いので、『圧縮率を下げて画質を上げる』という選択肢が無いので… )
メンテ
Re: 物理演算の一時停止処理(+α) ( No.6 )
名前:名無三 日時:2020/01/13 19:23

ありがとうございます。 最後に、 MV1SetLoadModelUsePhysicsModeはMV1DuplicateModelで複製する際には関係しますか?
メンテ
Re: 物理演算の一時停止処理(+α) ( No.7 )
名前:管理人 日時:2020/01/14 02:49

> MV1SetLoadModelUsePhysicsModeはMV1DuplicateModelで複製する際には関係しますか? いえ、MV1SetLoadModelUsePhysicsMode の設定は MV1DuplicateModel の結果には何も影響を与えません ( 物理モードは MV1DuplicateModel に渡す 派生元のモデルハンドルの設定を引き継ぎます )
メンテ
Re: 物理演算の一時停止処理(+α) ( No.8 )
名前:名無三(解決) 日時:2020/01/14 02:52

ありがとうございます。これで勘違いしていたところを修正できました。
メンテ
Re: 物理演算の一時停止処理(+α) ( No.9 )
名前:名無三(再質問) 日時:2020/01/14 12:47

すいません、再度の質問です。 Log.txtではGPUなどのデバイスの情報などが表示されるかと思いますが、それらを取得する関数はございますか?
メンテ
Re: 物理演算の一時停止処理(+α) ( No.10 )
名前:管理人 日時:2020/01/15 00:03

> Log.txtではGPUなどのデバイスの情報などが表示されるかと思いますが、それらを取得する関数はございますか? 一部は取得できますが、殆どは取得できません( Direct3D 11 か Direct3D 9 かで Log.txt に出力する情報も異なりますし… ) 具体的にはどのような情報を取得されたいのでしょうか?
メンテ
Re: 物理演算の一時停止処理(+α) ( No.11 )
名前:名無三 日時:2020/01/15 11:34

グラフィックデバイスの差異によって影のサイズなどのパラメータを変更したいなと思い立ちまして。 CPU、GPU、RAMの名称を取得できればいいなと思います。
メンテ
Re: 物理演算の一時停止処理(+α) ( No.12 )
名前:管理人 日時:2020/01/16 00:39

> グラフィックデバイスの差異によって影のサイズなどのパラメータを変更したいなと思い立ちまして。 うーん、文字列の比較でうまくいくといいですが… > CPU、GPU、RAMの名称を取得できればいいなと思います。 RAM は名称ではなく容量の取得となりますが、既に使えそうな関数がありました // PCの情報を取得する int GetPcInfo( char *OSString, char *DirectXString, char *CPUString, int *CPUSpeed /* 単位MHz */, double *FreeMemorySize /* 単位MByte */, double *TotalMemorySize, char *VideoDriverFileName, char *VideoDriverString, double *FreeVideoMemorySize /* 単位MByte */, double *TotalVideoMemorySize ) ; ただ、GetPcInfo は DirectX 7 時代に追加した関数で、今はまともに機能していませんでした 一応 CPU名、GPU名、RAM容量を取得できるように修正したバージョンをアップしましたので よろしければダウンロードしてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) CPU名、GPU名、RAM容量を取得する場合は以下のようにします char CPUName[ 256 ] ; char GPUName[ 256 ] ; double TotalMemorySize ; GetPcInfo( NULL, NULL, CPUName, NULL, NULL, &TotalMemorySize, NULL, GPUName, NULL, NULL ) ; 因みに FreeVideoMemorySize と TotalVideoMemorySize は機能しません( 現在では DirectX では ビデオメモリのサイズを取得する手段が無くなってしまった為 )、あと、VideoDeriverFileName も Direct3D 9 の場合のみ有効な文字列が格納されます よろしければお試しください m(_ _)m
メンテ
Re: 物理演算の一時停止処理(+α) ( No.13 )
名前:名無三(感謝) 日時:2020/01/16 13:06

動作確認しました、ありがとうございます!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存