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