2017-10-12 120 views
1

我试图打印给出的场景节点的所有子网格。它基本上是深度优先搜索。我想输出的J​​SON值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

这将不会按原样运行,但您循环“网格”却很奇怪,但实际上并未使用idx。你似乎只是一遍又一遍地写同样的mName.data。 –

+0

@KennyOstrom你可以发布一个修复答案吗? –

+0

请更好地解释一下你的实现中没有*工作*。从你的代码中,我了解到打印的“level”不正确,但其他读者可能不了解目的或问题。 – fjardon

回答

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'; 
+0

非常感谢,我有另一个问题,它追加json的值到根级别,它不断添加到输出文件 –

+0

每个级别请查看更新的代码与您提到的修复 –

+0

@andreahmed请不要编辑您的以阻止用户理解最初问题的方式提出问题。如果您想提供详细信息,请编辑您的问题。不要只评论一个答案。 – fjardon