이전 3D 모델 파일 형식 (관심이 있다면 Carbon Graphics 'GEO)을 사용하는 시뮬레이션 및이 모델 형식의 OpenSceneGraph 플러그인이 내부 변수는 값을 업데이트 할 때 모델이 호출 할 콜백 메소드를 등록하는 것입니다. 콜백에는 시뮬레이션 시간, 변수 이름 및 현재 값이 있습니다. 해당 변수에 대한 새 값을 되돌려 야합니다.콜백 메소드가 멤버 변수 또는 인스턴스에 액세스 할 수 없습니다.
headerNode->setUserUpdate(&FlightDriver::updateGeoVariable);
클래스 headerNode은 있습니다 다음 변수가 속한 : 다음과 같이 그래서, 내 코드에서, 내가 콜백을 설정
double (* uvarupdate)(const double t, const double val, const std::string name);
모든 간격이 uvarupdate
를 호출하는 I
updateGeoVariable(const double time, const double val, const std::string name)
{
return flightData->getValue(name);
}
(모델에서 각 변수에 대해 하나씩) 예. 인스턴스마다 고유해야하므로 메소드 또는 flightData
멤버를 정적으로 만들 수 없습니다.
나는이 콜백이 C 코드에서 호출되었다는 직감을 가지고있다. 왜냐하면 내가 깨졌을 때 그것이 클래스 내부에 있다는 것을 알지 못하는 것 같다. 그리고 서명을 바꾸면 동일한 세 값이 전달된다. 어떤 매개 변수가 먼저 쓰 였는지 구두로 신으십시오.
그러나 정말로 더러운 kludge를 피하기 위해 클래스 멤버에게 액세스 권한이 필요합니다. 클래스 자체가 3D 세계에서 모델을 구동하는 것이기 때문에 2 개 이상을 사용하면 "234, pitch, 90"이라고하는 콜백을 얻을 수 있으며 데이터가 속한 모델의 변수를 알 수있는 방법이 없습니다.
OSG 플러그인이므로 DLL을 다시 컴파일하여 해당 인스턴스 또는 ID 또는 뭔가에 대한 포인터를 가져 와서 콜백에서 반환 할 수는 있지만 실제로이를 피하고 싶습니다. 가능하다면.
썽킹에 대해 읽었지만 대부분의 다른 아이디어는 콜백을 생성하는 코드에 액세스해야합니다. 어떤 아이디어?
나는 트램펄린에 대해 들어 본 적이 없다. 나는 그것에 대해 읽을 것이다. 그래도 uvarupdate의 서명을 변경해야합니까? 그렇다면 필자는 필자가 필요로하는 추가 기능으로 직접 플러그인을 다시 컴파일하려고 시도 할 것이라고 생각합니다. – drearyworlds
trampoline은 C++ 메서드를 호출하는 일반 (비 멤버) 함수입니다. 이 경우'uvarupdate '의 서명을 변경할 필요가 없습니다. 단지'setUserUpdate'에 트램펄린에 대한 포인터를 전달하기 만하면됩니다.그러나 클래스의 각 인스턴스마다 다른 트램펄린이 필요합니다. 즉 인스턴스가 어떻게 구별되는지입니다. – Inspired