Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Assimp在Ogre中渲染对象时出现问题_C++_Ogre_Assimp - Fatal编程技术网

C++ 使用Assimp在Ogre中渲染对象时出现问题

C++ 使用Assimp在Ogre中渲染对象时出现问题,c++,ogre,assimp,C++,Ogre,Assimp,当我试图查看ASIMP支持的三维文件(.3ds.dae等…)时,它们不会正确显示。例如,“Jeep1.3ds”向我显示了车身的一半。 所有的信息节点、网格和法线都得到了正确的获取,并且顶点和面的数量也是正确的(我认为)。 纹理不符合正确的坐标,我猜将与上述有关。。。 在图片中,您可以“欣赏”我的结果并更正。 谢谢你的帮助和意见 食人魔代码 Ogre::SceneNode *OgreAPP::makeMesh(Ogre::String meshFile,Ogre::String entityNa

当我试图查看ASIMP支持的三维文件(.3ds.dae等…)时,它们不会正确显示。例如,“Jeep1.3ds”向我显示了车身的一半。 所有的信息节点、网格和法线都得到了正确的获取,并且顶点和面的数量也是正确的(我认为)。 纹理不符合正确的坐标,我猜将与上述有关。。。 在图片中,您可以“欣赏”我的结果并更正。 谢谢你的帮助和意见

食人魔代码

Ogre::SceneNode *OgreAPP::makeMesh(Ogre::String meshFile,Ogre::String entityName,Ogre::String meshName)
{
    Ogre::MeshPtr Mesh = Ogre::MeshManager::getSingleton().createManual(meshName,Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
    Ogre::SubMesh *subMesh = Mesh->createSubMesh("subMesh");
    Ogre::VertexDeclaration *vertexDeclaration;
    Ogre::HardwareVertexBufferSharedPtr  vertexBuffer;
    Ogre::HardwareIndexBufferSharedPtr   indexBuffer;
    size_t offset=0;

   // Get file name and extension from the Ogre Resource Manager  
    Ogre::FileInfoListPtr fileInfoListPtr(Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo(Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,meshFile,false));
    Ogre::FileInfoList *fileInfoList = fileInfoListPtr.getPointer();
    Ogre::FileInfo &fileInfo = fileInfoList->front();
    stringBuffer << fileInfo.archive->getName().c_str() << meshFile;

   // **************   From Assimp code   ***************************
    ModelManager::loadModel(stringBuffer.str());
    ModelManager::processData();
    std::vector<float>    *vData   = ModelManager::getVertexData();
    std::vector<uint16_t> *iData   = ModelManager::getIndexData();
  // ******************************************************************** 

    Mesh->sharedVertexData = new Ogre::VertexData;

   // Organizo la memoria de video
    vertexDeclaration = Mesh->sharedVertexData->vertexDeclaration;
    vertexDeclaration->addElement(0,offset,Ogre::VET_FLOAT3,Ogre::VES_POSITION);
    offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);

    vertexDeclaration->addElement(0,offset,Ogre::VET_FLOAT3,Ogre::VES_NORMAL);
    offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);

    vertexDeclaration->addElement(0,offset,Ogre::VET_FLOAT2,Ogre::VES_TEXTURE_COORDINATES);
    offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT2);

    // Make vertex buffer 
    vertexBuffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(vertexDeclaration->getVertexSize(0),
                                                                                  vData->size()/8,
                                                                                  Ogre::HardwareBuffer::HBU_STATIC);

    // Write the vertex buffer with the target data of vData->data() located in assimp code
    vertexBuffer.getPointer()->writeData(0,vertexBuffer.getPointer()->getSizeInBytes(),vData->data());

    // Make index buffer
    indexBuffer = Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(Ogre::HardwareIndexBuffer::IT_16BIT,
                                                                                iData->size(),
                                                                                Ogre::HardwareBuffer::HBU_STATIC);

    indexBuffer.getPointer()->writeData(0,indexBuffer.getPointer()->getSizeInBytes(),iData->data());

    Mesh->sharedVertexData->vertexBufferBinding->setBinding(0,vertexBuffer);
    Mesh->sharedVertexData->vertexCount = vertexBuffer.getPointer()->getNumVertices();
    Mesh->sharedVertexData->vertexStart = 0;

    subMesh->useSharedVertices = true;
    subMesh->indexData->indexBuffer = indexBuffer;
    subMesh->indexData->indexCount = indexBuffer.getPointer()->getNumIndexes();
    subMesh->indexData->indexStart = 0;

    // I don't get real AABB from object, this is ok for probe 
    Mesh->_setBounds(Ogre::AxisAlignedBox(-100,-100,-100,100,100,100));
    Mesh->load();

    stringBuffer.str("");
    stringBuffer << entityName << "_n";
    oSceneManager->createEntity(entityName,meshName);
    oSceneManager->getEntity(entityName)->setMaterialName("material/textura");
    oSceneManager->getRootSceneNode()->createChildSceneNode(stringBuffer.str().c_str())->attachObject(oSceneManager->getEntity(entityName));
    oSceneManager->getSceneNode(stringBuffer.str().c_str())->setPosition(0,0,0);

    std::cout << "total de vertices: " << vData->size()/8 << "\n";
    std::cout << "total de faces: " <<indexBuffer.getPointer()->getNumIndexes()/3 << "\n";
    return oSceneManager->getSceneNode(stringBuffer.str().c_str());
}
Ogre::SceneNode*OGREPA::makeMesh(Ogre::String meshFile,Ogre::String entityName,Ogre::String meshName)
{
Ogre::MeshPtr Mesh=Ogre::MeshManager::getSingleton().createManual(meshName,Ogre::ResourceGroupManager::DEFAULT\u RESOURCE\u GROUP\u NAME);
食人魔::子网格*子网格=网格->创建子网格(“子网格”);
食人魔::VertexDeclaration*VertexDeclaration;
Ogre::HardwareVertexBufferSharedPtr vertexBuffer;
食人魔:硬件索引缓存共享DPTR索引缓存;
尺寸偏差=0;
//从Ogre资源管理器获取文件名和扩展名
Ogre::FileInfoListPtr FileInfoListPtr(Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo(Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,meshFile,false));
Ogre::FileInfoList*FileInfoList=fileInfoListPtr.getPointer();
Ogre::FileInfo&FileInfo=fileInfoList->front();
stringBuffer getName().c_str()sharedVertexData=新Ogre::VertexData;
//录像记忆组织
vertexDeclaration=Mesh->sharedVertexData->vertexDeclaration;
vertexDeclaration->addElement(0,偏移量,Ogre::VET_浮动3,Ogre::VES_位置);
偏移量+=Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
vertexDeclaration->addElement(0,偏移量,Ogre::VET_FLOAT3,Ogre::VES_NORMAL);
偏移量+=Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
vertexDeclaration->addElement(0,偏移,Ogre::VET_FLOAT2,Ogre::VES_纹理_坐标);
偏移量+=Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT2);
//创建顶点缓冲区
vertexBuffer=Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(vertexDeclaration->getVertexSize(0),
vData->size()/8,
食人魔::硬件缓冲::HBU_静态);
//使用位于assimp代码中的vData->data()的目标数据写入顶点缓冲区
vertexBuffer.getPointer()->writeData(0,vertexBuffer.getPointer()->getSizeInBytes(),vData->data());
//生成索引缓冲区
indexBuffer=Ogre::HardwareBufferManager::getSingleton()。createIndexBuffer(Ogre::HardwareIndexBuffer::IT_16位,
iData->size(),
食人魔::硬件缓冲::HBU_静态);
indexBuffer.getPointer()->writeData(0,indexBuffer.getPointer()->getSizeInBytes(),iData->data());
Mesh->sharedVertexData->vertexBufferBinding->setBinding(0,vertexBuffer);
Mesh->sharedVertexData->vertexCount=vertexBuffer.getPointer()->getNumVertices();
Mesh->sharedVertexData->vertexStart=0;
subMesh->UseShareDVerties=true;
子网格->索引扩展数据->索引缓冲=索引缓冲;
subMesh->indexData->indexCount=indexBuffer.getPointer()->getNumIndexes();
子网格->索引扩展数据->索引开始=0;
//我没有从物体上得到真正的AABB,这对探测器来说是可以的
网格->设置边界(Ogre::AxisAlignedBox(-100,-100,-100100));
网格->加载();
stringBuffer.str(“”);
stringBuffer getEntity(entityName)->setMaterialName(“材质/纹理”);
oSceneManager->getRootSceneNode()->createChildSceneNode(stringBuffer.str().c_str())->attachObject(oSceneManager->getEntity(entityName));
oSceneManager->getSceneNode(stringBuffer.str().c_str())->setPosition(0,0,0);
std::coutmnormals[v].x);
顶点buff.向后推(网格->法线[v].y);
vertexBuff.push_back(网格->法线[v].z);
vertexBuff.push_back(mesh->mTextureCoords[0][v].x);
vertexBuff.push_back(网格->mTextureCoords[0][v].y);
}
for(无符号整数f=0;fmnumface;f++)
{
面=&mesh->MFACE[f];
indexBuff.push_back(脸->思维[0]);
indexBuff.push_back(脸->思维[1]);
indexBuff.向后推(脸->思维[2]);
}
返回true;
}
bool ModelManager::processData()
{
布尔重复=真;
nodeBuff.push_back(modelsecene->mRootNode);
/*如果(模型场景->mNumMeshes>0)
{
for(unsigned int m=0;mmnummesh;m++)
这->assimpGetMeshData(modelsecene->mMeshes[m]);
}*/
//我将所有节点树提升到根级别
while(重复)
{ 
对于(无符号整数a=0;amNumChildren>0)
for(unsigned int c=0;cmNumChildren;c++)
nodeBuff.push_back(modelNode->mChildren[c]);
否则重复=错误;
}
}
//从根级别(所有节点)获取节点信息
对于(无符号整数a=0;amnummesh>0)
for(unsigned int b=0;bmnummesh;b++)
assimpGetMeshData(modelsecene->mmesh[modelNode->mmesh]);
}
返回true;
}
std::vector*ModelManager::getVertexData()
{
return&vertexBuff;
}
std::vector*ModelManager::getIndexData()
{
返回和索引buff;
}
Assimp.H

#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
#include <assimp/matrix4x4.h>
#include <assimp/cimport.h>

#include <Windows.h>
#include <iostream>
#include <stdint.h>
#include <vector>

class ModelManager
{
public:
    ModelManager();
    bool loadModel(std::string &);
    bool processData();
    std::vector<float> *getVertexData();
    std::vector<uint16_t> *getIndexData();
private:
    bool assimpGetMeshData(const aiMesh *);
private:
    Assimp::Importer            importer;
    const aiScene               *modelScene;
    const aiNode                *modelNode;
    const aiMesh                *modelMesh;
    const aiFace                *modelFace;
    std::vector<float>          vertexBuff;
    std::vector<uint16_t>       indexBuff;

    std::vector<const aiNode*>  nodeBuff;
    unsigned int                numNodeBuff;
};
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类模型管理器
{
公众:
ModelManager();
bool加载模型(std::string&);
bool processData();
std::vector*getVertexData();
std::vector*getIndexData();
私人:
bool assimpGetMeshData(const aiMesh*);
私人:
助理
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
#include <assimp/matrix4x4.h>
#include <assimp/cimport.h>

#include <Windows.h>
#include <iostream>
#include <stdint.h>
#include <vector>

class ModelManager
{
public:
    ModelManager();
    bool loadModel(std::string &);
    bool processData();
    std::vector<float> *getVertexData();
    std::vector<uint16_t> *getIndexData();
private:
    bool assimpGetMeshData(const aiMesh *);
private:
    Assimp::Importer            importer;
    const aiScene               *modelScene;
    const aiNode                *modelNode;
    const aiMesh                *modelMesh;
    const aiFace                *modelFace;
    std::vector<float>          vertexBuff;
    std::vector<uint16_t>       indexBuff;

    std::vector<const aiNode*>  nodeBuff;
    unsigned int                numNodeBuff;
};
    bool ModelManager::loadModel(std::string &file)
    {
        modelScene = importer.ReadFile(file,aiProcess_MakeLeftHanded|aiProcess_FlipWindingOrder|aiProcess_FlipUVs|aiProcess_PreTransformVertices|
                                       aiProcess_CalcTangentSpace|
                                       aiProcess_GenSmoothNormals|
                                       aiProcess_Triangulate|
                                       aiProcess_FixInfacingNormals|
                                       aiProcess_FindInvalidData |
                                       aiProcess_ValidateDataStructure | 0
                                       );

        if (!modelScene)
        {
            MessageBoxA(NULL,importer.GetErrorString(),"Error: La concha de la lora...",MB_ICONERROR);
            return false;
        }

        return true;
    }