- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这似乎是一项简单的任务,但我似乎无法弄清楚如何使用从 assimp 导入的数据来测试三角形碰撞。我已经确定我的三角形碰撞算法工作正常,并且将顶点和索引缓冲到 openGL EBO 和 VBO 中以完美地进行绘图。我被引导相信这是我从 std::vector 的顶点和索引访问数据的方式不正确。目前我正在使用索引作为顶点 vector 的索引。
void loadModel(std::string path) {
Assimp::Importer importer;
const aiScene * scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_JoinIdenticalVertices);
if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) {
printf_s("Assimp loading error \n%s\n", importer.GetErrorString());
return;
}
directory = path.substr(0, path.find_last_of('/'));
processNode(scene->mRootNode, scene);
}
void processNode(aiNode * node, const aiScene * scene) {
for (unsigned int i = 0; i < node->mNumMeshes; i++) {
//processes all the nodes meshes
aiMesh * mesh = scene->mMeshes[node->mMeshes[i]];
meshes.push_back(processMesh(mesh, scene));
}
for (unsigned int i = 0; i < node->mNumChildren; i++) {
processNode(node->mChildren[i], scene);
}
}
Mesh processMesh(aiMesh * mesh, const aiScene * scene) {
std::vector<Vertex> vertices;
std::vector<unsigned int> indices;
std::vector<Texture> textures;
for (unsigned int i = 0; i < mesh->mNumVertices; i++) {
Vertex vertex;
glm::vec3 vector;
vector.x = mesh->mVertices[i].x;
vector.y = mesh->mVertices[i].y;
vector.z = mesh->mVertices[i].z;
vertex.position = vector;
//get other vertex information
vertices.push_back(vertex);
//for all vertices in the mesh, adds the data to a vector
}
for (unsigned int i = 0; i < mesh->mNumFaces; i++) {
aiFace face = mesh->mFaces[i];
if (face.mNumIndices == 3) {
indices.push_back(face.mIndices[0]);
indices.push_back(face.mIndices[1]);
indices.push_back(face.mIndices[2]);
//for all the indices in each face, add each indice
}
else {
printf("Odd mNumIndices \n");
//added as a just in case - but in my situation this case is never executed -> all faces are triangles
for (unsigned int j = 0; j < face.mNumIndices; j++) {
indices.push_back(face.mIndices[j]);
}
}
}
现在要访问此数据,我只需简单地遍历模型的所有网格,并针对网格的每个索引访问其对应的顶点。
bool collision(glm::mat4 worldSpaceTransform, glm::vec3 testVector) {
for (Mesh mesh : meshes) {
for (int i = 0; i < mesh.indices.size(); i += 3) {
//iterate through all faces of the mesh since each face has 3 vertices
glm::vec3 a = glm::vec3(worldSpaceTransform * glm::vec4(mesh.verticies[mesh.indices[i]].position, 1));
glm::vec3 b = glm::vec3(worldSpaceTransform * glm::vec4(mesh.verticies[mesh.indices[i + 1]].position, 1));
glm::vec3 c = glm::vec3(worldSpaceTransform * glm::vec4(mesh.verticies[mesh.indices[i + 2]].position, 1));
//use vector a, b and c (transformed to world space) for collision test with the test vector
//return true if the test vector collides with the triangle
}
}
return false;
}
所以我使用 print 语句输出应该构成三角形的 vector a b 和 c 的坐标。在一种情况下,我无法在模型的原始 .obj 文件中找到这些确切的 vector ,我找到了它们的 x、y 和 z 坐标,但不是全部都在一个 vector 中(是的,当我检查这个时,我打印了局部空间坐标).在另一个例子中,应该构成三角形的三个 vector 最终形成了一条线(三个 vector 中的两个具有相同的坐标)。另外,我知道用模型的所有原语测试一个 vector 是低效的,但现在我专注于在查看优化之前让某事工作。许多模型对于 AABB 来说太复杂了,所以这是我想出的“最佳”解决方案。所以,我不确定我在这里做错了什么,非常感谢任何提示!
最佳答案
obj 格式只存储每个顶点一次,并将在面中引用它。因此 Assimp 将从这些位置生成渲染本身的顶点。这就是为什么您无法从导入的 obj 文件中找到原始信息的原因,因为 obj 是以这种格式存储它们的。 Obj 针对大小进行了优化,assimp 使用的中间格式针对渲染进行了优化。
存储碰撞信息的好策略在很大程度上取决于您的模型类型。对我来说,它可以为整个模型生成局部边界框,并为存储在节点图中的每个网格生成子框。因此,以下方法可能有效:
关于c++ - 如何访问碰撞的 assimp 模型数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48779620/
我尝试加载 gltf 格式的场景。它具有金属和粗糙纹理(未嵌入)。现在我想使用 Assimp 加载具有指定纹理的模型。我使用 GetTexture() 检索纹理,但 aiTextureType 没有粗
我已经从 http://assimp.sourceforge.net/main_downloads.html 下载了 Assimp 项目 Assimp release image assimp zip
assimp 库提供了一种从文件加载 3D .obj 模型的好方法。但是我发现它附带的 assimp_viewer.exe(我使用 3.1.1 版)在导入我的 .obj 文件(42Mb,已经简化)时比
我正在使用 Assimp 将 3D 模型加载到我的程序中。到目前为止,一切都很顺利,除了我遇到了一个似乎没有意义的 Lightwave 对象。当然它在 Lightwave 中渲染得很好,但在 Assi
最近我在做骨骼动画导入,所以我用一些IK技术制作了一个类似Minecraft的3d模型来测试Assimp动画导入。输出格式为 COLLADA(*.dae),我使用的工具是 Blender。在编程方面,
导入网格物体时,我得到了 Material ,但是无法访问纹理的文件名。 .mtl文件显式显示纹理的文件名。在代码中,它的纹理计数为1,但文件名字段显示为空字符串,fullPath输出为“* 0”。在
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
过去几天我一直在尝试使用 assimp 加载我的蒙皮 collada 网格,但我遇到了非常困难的时间。目前我只是试图在没有任何变换或动画的情况下以其正常的“姿势”渲染它,但网格变得非常变形。我认为问题
我正在尝试使用 Assimp(Open Asset Import Library)制作骨骼动画。现在我可以成功加载 .dae 模型并用动画渲染它,但在这样做的过程中模型变得困惑。 http://i.i
我刚刚下载了 assimp 3.0 库并使用 cmake 构建了所需的 make 文件,然后编译并构建了库本身,这个过程是成功的(对 StepFile.h 稍作修改), 我的 assimp 头文件夹位
我刚拿到最后一个assimp SDK,做了一个项目,我正确地链接了它(链接没有错误)但是我似乎在Sample项目上遇到了一些麻烦。更具体地说,是 SimpleOpenGL。我将 C++ 与 OpenG
我正在使用 Assimp 加载我的模型和网格,到目前为止它一直运行良好。我正在尝试从从 blender 导出 .obj 文件时生成的 .mtl 文件加载发射贴图。它加载漫反射贴图、法线贴图和镜面反射贴
我目前正在使用 ASSIMP 库将骨骼动画实现到我的 3D OpenGL 游戏引擎中,不幸的是它并没有那么好。我目前面临的问题是,串联的骨骼变换(骨骼之间的父子关系)只有在只有一个父级被变换时才能正确
我已经使用 Assimp 一段时间了,现在我正在尝试加载一个 .obj 文件。它加载完美,但我想在加载后操作面部数据。 基本上我在简单的 cube.obj 文件中有这个(完整文件 - http://p
我正在做一个项目,我使用 ASSIMP 库导入一个化身的 3D 网格,更新它并使用同一个 ASSIMP 库再次导出更新后的场景。为此,作为第一步,我编写了一段代码来导入场景,并且在不做任何更改的情况下
我正在使用 assimp 在我的游戏引擎中导入 3d 模型。出于某种原因,无论我使用什么模型或模型格式,assimp 都不会报告任何纹理。这是为什么? 以下是使用 assimp 的非常简单的设置: c
我正在使用 Assimp 加载 COLLADA 模型,但是 scene->mMeshes[i]->mName.C_Str() 调用为我返回 "" existing mesh index(当然,"" 不
我最近通过 valgrind 对我的游戏引擎进行了内存泄漏测试;它实际上告诉我,在我的 Mesh 类中有大约 7000 个字节被泄露;奇怪的是它告诉我这个: 7,280 bytes in 1 bloc
我在 Windows 上安装了 Assimp 库,并且喜欢这些文件,然后只是复制粘贴 SimpleOpenGL 示例并删除了结构词(其中大部分)以清除我得到的错误。 现在,我没有任何错误,但是每当我尝
我正在使用 Assimp.net 将动画 .dae 文件导入我的 OpenTK 引擎并努力建立可用的分层骨骼结构。 在 tutorial我正在关注,根骨骼或“关节”包含它的子关节列表,以及它们的子关节
我是一名优秀的程序员,十分优秀!