私は、古い 3D モデル ファイル形式 (興味がある場合は、Carbon Graphics の GEO) を使用するシミュレーションについて書いています。このモデル形式の OpenSceneGraph プラグインが内部変数を更新する方法は、値を更新するときに呼び出すモデル。コールバックには、シミュレーション時間、変数名、およびその現在の値があります。その変数の新しい値を返す必要があります。
したがって、私のコードでは、コールバックを次のように設定します。
headerNode->setUserUpdate(&FlightDriver::updateGeoVariable);
headerNode が属するクラスには、次の変数があります。
double (* uvarupdate)(const double t, const double val, const std::string name);
間隔ごとに、uvarupdate
私が設定したものを呼び出します:
updateGeoVariable(const double time, const double val, const std::string name)
{
return flightData->getValue(name);
}
モデル内の変数ごとに、一度に 1 つずつ。flightData
インスタンスごとに一意である必要があるため、メソッドまたはメンバーを静的にすることはできません。
このコールバックが C コードから呼び出されている可能性があるという予感があります。ブレークすると、それがクラス内にあることを認識していないように見えるためです。署名を変更すると、同じ 3 つの値が渡されて、何かに押し込まれます。パラメータが最初です。
ただし、本当に汚いクラッジを避けるために、クラスのメンバーにアクセスする必要があります。クラス自体が 3D の世界でモデルを駆動するものであるため、これらが 2 つ以上あると、「234、ピッチ、90」というコールバックが返され、データがどのモデルの変数に属しているかを知る方法がありません。
DLL を (OSG プラグインであるため) 再コンパイルして、そのインスタンス、ID、または何かへのポインターを追加して取得し、コールバックで返すこともできますが、可能であればそれを避けたいと思います。
サンクについて読んだことがありますが、そのように見え、他のほとんどのアイデアでは、コールバックを作成するコードにアクセスする必要があります。何か案は?