Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Always pre-transform vertices while reading with Assimp. #6959

Merged
merged 2 commits into from
Sep 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cpp/open3d/io/TriangleMeshIO.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ struct ReadTriangleMeshOptions {
/// `aiProcessPreset_TargetRealtime_Fast,
/// aiProcess_RemoveRedundantMaterials, aiProcess_OptimizeMeshes,
/// aiProcess_PreTransformVertices`.
/// https://github.com/assimp/assimp/blob/master/include/assimp/postprocess.h
///
/// Note that identical vertices will always be joined regardless of whether
/// post-processing is enabled or not, which changes the number of vertices
Expand Down
24 changes: 16 additions & 8 deletions cpp/open3d/io/file_format/FileASSIMP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,16 @@ FileGeometry ReadFileGeometryTypeFBX(const std::string& path) {
return FileGeometry(CONTAINS_TRIANGLES | CONTAINS_POINTS);
}

// Ref:
// https://github.com/assimp/assimp/blob/master/include/assimp/postprocess.h
const unsigned int kPostProcessFlags_compulsory =
aiProcess_JoinIdenticalVertices;
aiProcess_JoinIdenticalVertices | aiProcess_SortByPType |
aiProcess_PreTransformVertices;

const unsigned int kPostProcessFlags_fast =
aiProcessPreset_TargetRealtime_Fast |
aiProcess_RemoveRedundantMaterials | aiProcess_OptimizeMeshes |
aiProcess_PreTransformVertices;
kPostProcessFlags_compulsory | aiProcess_GenNormals |
aiProcess_Triangulate | aiProcess_GenUVCoords |
aiProcess_RemoveRedundantMaterials | aiProcess_OptimizeMeshes;

struct TextureImages {
std::shared_ptr<geometry::Image> albedo;
Expand All @@ -65,7 +68,7 @@ void LoadTextures(const std::string& filename,
std::string base_path =
utility::filesystem::GetFileParentDirectory(filename);

auto texture_loader = [&base_path, &scene, &mat](
auto texture_loader = [&base_path, &scene, &mat, &filename](
aiTextureType type,
std::shared_ptr<geometry::Image>& img) {
if (mat->GetTextureCount(type) > 0) {
Expand Down Expand Up @@ -94,7 +97,10 @@ void LoadTextures(const std::string& filename,
}
} else {
utility::LogWarning(
"This format of image is not supported.");
"Unsupported texture format for texture {} for "
"file {}: Only jpg and "
"png textures are supported.",
path.C_Str(), filename);
}
}
// Else, build the path to it.
Expand Down Expand Up @@ -170,7 +176,8 @@ bool ReadTriangleMeshUsingASSIMP(

const auto* scene = importer.ReadFile(filename.c_str(), post_process_flags);
if (!scene) {
utility::LogWarning("Unable to load file {} with ASSIMP", filename);
utility::LogWarning("Unable to load file {} with ASSIMP: {}", filename,
importer.GetErrorString());
return false;
}

Expand Down Expand Up @@ -326,7 +333,8 @@ bool ReadModelUsingAssimp(const std::string& filename,
const auto* scene =
importer.ReadFile(filename.c_str(), kPostProcessFlags_fast);
if (!scene) {
utility::LogWarning("Unable to load file {} with ASSIMP", filename);
utility::LogWarning("Unable to load file {} with ASSIMP: {}", filename,
importer.GetErrorString());
return false;
}

Expand Down
19 changes: 12 additions & 7 deletions cpp/open3d/t/io/file_format/FileASSIMP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,16 @@ namespace t {
namespace io {

// Split all polygons with more than 3 edges into triangles.
// Ref:
// https://github.com/assimp/assimp/blob/master/include/assimp/postprocess.h
const unsigned int kPostProcessFlags_compulsory =
aiProcess_JoinIdenticalVertices | aiProcess_Triangulate |
aiProcess_SortByPType;
aiProcess_SortByPType | aiProcess_PreTransformVertices;

const unsigned int kPostProcessFlags_fast =
aiProcessPreset_TargetRealtime_Fast |
aiProcess_RemoveRedundantMaterials | aiProcess_OptimizeMeshes |
aiProcess_PreTransformVertices;
kPostProcessFlags_compulsory | aiProcess_GenNormals |
aiProcess_GenUVCoords | aiProcess_RemoveRedundantMaterials |
aiProcess_OptimizeMeshes;

bool ReadTriangleMeshUsingASSIMP(
const std::string& filename,
Expand All @@ -58,7 +60,8 @@ bool ReadTriangleMeshUsingASSIMP(

const auto* scene = importer.ReadFile(filename.c_str(), post_process_flags);
if (!scene) {
utility::LogWarning("Unable to load file {} with ASSIMP", filename);
utility::LogWarning("Unable to load file {} with ASSIMP: {}", filename,
importer.GetErrorString());
return false;
}

Expand Down Expand Up @@ -219,7 +222,7 @@ bool WriteTriangleMeshUsingASSIMP(const std::string& filename,
// Sanity checks...
if (write_ascii) {
utility::LogWarning(
"TriangleMesh can't be saved in ASCII fromat as .glb");
"TriangleMesh can't be saved in ASCII format as .glb");
return false;
}
if (compressed) {
Expand Down Expand Up @@ -470,7 +473,9 @@ bool WriteTriangleMeshUsingASSIMP(const std::string& filename,
// Export
if (exporter.Export(ai_scene.get(), "glb2", filename.c_str()) ==
AI_FAILURE) {
utility::LogWarning("Got error: {}", exporter.GetErrorString());
utility::LogWarning(
"Got error: ({}) while writing TriangleMesh to file {}.",
exporter.GetErrorString(), filename);
return false;
}

Expand Down
Loading