我试图打印给定场景节点的所有子网格..它基本上是深度优先搜索。我试图将json值输出为1级,2级,直到最后一个孩子然后输出" "
似乎我错过了一些我无法理解递归的东西
更新:这是另一个试验:
void AssimpLoader::WriteSubMeshesToJson(const aiScene* mScene, const aiNode* pNode, Json::StyledWriter &writer, std::ofstream &myfile, int level, Json::Value root )
{
// if we have meshes
if( pNode == nullptr)
{
// write to disk
Ogre::LogManager::getSingleton().logMessage(" for mesh '" + Ogre::String( pNode->mName.data ) + "'" );
Json::Value parameter;
parameter["level0"];
root.append(parameter);
std::string output = writer.write(root);
myfile << output;
level = 0;
}
else
{
Json::Value parameter;
level++;
parameter["Level " + std::to_string(level)] = Ogre::String( pNode->mName.data) ;
root.append(parameter);
std::string output = writer.write(root);
myfile << output;
}
// Traverse all child nodes of the current node instance
for( unsigned int childIdx=0; childIdx < pNode->mNumChildren; childIdx++ )
{
const aiNode* pChildNode = pNode->mChildren[ childIdx ];
WriteSubMeshesToJson(mScene, pChildNode, writer, myfile,level, root);
}
}
我需要json像这样
{
"Parenting1" : {
"Parenting2" : {
"Parenting3" : {}
}
}
}
答案 0 :(得分:0)
你的问题在这里:
void WriteSubMeshesToJson(..., std::ofstream &myfile, int &level)
----------------------------------------------------------^
因为您使用了对level
变量的引用,所以在完成打印当前子项后,您的增量在父调用中可见。不应该,打印子网格时,函数中的level
值不应更改。
只需删除&
即可使用按值传递的参数。
您的Json::Value
存在相反的问题,您应该通过引用传递它,以便孩子们可以将自己插入到父json中。您应该修改对WriteSubMeshesToJson
的调用以传递当前节点,而不是始终传递root
节点。
顺便说一下,你的代码对于C ++来说并不是非常惯用的。所以这里有一个建议:在将字符串发送到文件之前无需手动格式化字符串,您也可以直接在<<
上使用std::ostream
运算符
std::string output;
level++;
output = "level" + std::to_string(level) + + pNode->mName.data+ "\n";
myfile << output;
变为:
output << "level" << level << pNode->mName.data << '\n';