我正在用OMNeT构建一个动态的多智能体模拟,为此,我必须在运行时创建新的模块。模块创建工作正常,但是,在运行时创建的模块不会显示在3D可视化中。
module "node" is created sucessfully
有谁知道如何让模块出现在可视化中吗?我必须更新可视化模块吗?
omnet.ini:
[General]
network = AgentNetwork
*.visualizer.osgVisualizer.typename = "IntegratedOsgVisualizer"
*.visualizer.*.mobilityVisualizer.animationSpeed = 1
*.visualizer.osgVisualizer.sceneVisualizer.typename = "SceneOsgEarthVisualizer"
*.visualizer.osgVisualizer.sceneVisualizer.mapFile = "hamburg.earth"AgentSpawner:
void AgentSpawner::initialize()
{
cMessage *timer = new cMessage("timer");
scheduleAt(1.0, timer);
}
void AgentSpawner::handleMessage(cMessage *msg)
{
cModuleType *moduleType = cModuleType::get("simulations.Agent");
cModule *module = moduleType->create("node", getParentModule());
// set up parameters and gate sizes before we set up its submodules
module->par("osgModel") = "3d/glider.osgb.(20).scale.0,0,180.rot";
module->getDisplayString().parse("p=200,100;i=misc/aircraft");
module->finalizeParameters();
// create internals, and schedule it
module->buildInside();
module->callInitialize();
module->scheduleStart(simTime()+5.0);
}发布于 2021-04-22 16:51:40
OSG可视化信息与实际的模拟模型模块对象完全分开维护(这是因为可视化在模拟中必须始终是可选的,因此请确保在完全关闭OSG的情况下很好地构建模拟)。这意味着在初始化时期间将构建与现有网络节点完全不同的数据结构。由于这只在初始化期间执行一次,因此动态创建的模块将不具有其可视化副本数据结构。
创建相应对象的代码是here。
解决方案是在AgentSpawner代码中查找NetworkNodeOsgVisualizer模块,然后创建并添加相应的数据结构(NetworkNodeOsgVisualization对象)。所需的方法(create和add)是there,但遗憾的是它们是受保护的,因此您可能需要修改INET代码并使它们成为公共的,以便能够调用它们。
https://stackoverflow.com/questions/67073533
复制相似问题