0

私は、古い 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、または何かへのポインターを追加して取得し、コールバックで返すこともできますが、可能であればそれを避けたいと思います。

サンクについて読んだことがありますが、そのように見え、他のほとんどのアイデアでは、コールバックを作成するコードにアクセスする必要があります。何か案は?

4

1 に答える 1

0

メソッドへのポインタを渡す必要がありますが、uvarupdate関数へのポインタです。これらは異なる型です。メソッドへのポインターにthisは、インスタンスへの暗黙のポインターが含まれています。関数ポインターには適合しません。別の方法で渡す必要がありますthis

コールバックの署名を変更しない場合、this何らかの方法でインスタンス ( ) を計算する必要があります。パラメータから判断できればname、まぁ簡単です。もう 1 つの方法は、インスタンスごとにトランポリンを作成することです。インスタンスがほとんどない場合は、インスタンスごとに個別のトランポリン関数を作成できます。トランポリンを動的に (実行時に) 作成するのは難しく、移植性がありません。実際、マシン命令を RAM に書き込んで、正しいthisパラメータでメソッドを呼び出す必要があります。しかし、それも可能です。一部のライブラリはそうしています (例: Delphi の VCL)。

于 2013-08-27T19:38:18.757 に答える