Browse Source

fix: replace local_to_world matrix usage with fetch_aabb in mark_primitive_boundings

V2-origin
mckay 1 week ago
parent
commit
987d3fb127
  1. 3
      network_process/src/prim_gen/extract_vertex_infos.cpp
  2. 10
      primitive_process/interface/base/primitive.hpp
  3. 21
      primitive_process/src/base/primitive.cpp

3
network_process/src/prim_gen/extract_vertex_infos.cpp

@ -10,8 +10,7 @@ aabb_t mark_primitive_boundings(double aabb_margin, const baked_blobtree_t& tree
aabb_t scene_aabb{};
for (const auto [primitive_ptr, _] : tree.primitives) {
const auto& primitive = *primitive_ptr;
auto local_to_world_matrix = primitive.get_identity_local_to_world();
aabb_t primitive_aabb = aabb_unit.transformed(local_to_world_matrix);
aabb_t primitive_aabb = primitive.fetch_aabb();
primitive_aabb.min().array() -= aabb_margin;
primitive_aabb.max().array() += aabb_margin;
scene_aabb.extend(primitive_aabb);

10
primitive_process/interface/base/primitive.hpp

@ -12,6 +12,7 @@
template <typename T>
using marked_subface_ptr_t = marked_ptr<T, 1>;
using aabb_t = Eigen::AlignedBox<double, 3>;
enum class sign_t : uint8_t { positive = 1, negative = 2, zero = 0 };
@ -52,17 +53,14 @@ EXTERN_C struct PE_API primitive {
virtual primitive_type get_type() const = 0;
virtual marked_subface_ptr_t<subface> *get_subface() const = 0;
virtual size_t get_subface_count() const = 0;
aabb_t m_aabb = aabb_t(Eigen::Vector3d(-1, -1, -1), Eigen::Vector3d(1, 1, 1));
// sign_t judge_sign_by_subface_sdf(const std::vector<double> &) const;
// sign_t judge_sign_by_subface_sdf_sign(const std::vector<sign_t> &) const;
dynamic_bitset_mp<> judge_sign_by_subface_sign(stl_vector_mp<dynamic_bitset_mp<>>) const;
// for simple primitive: sphere, cylinder, cone, box
// we use world_to_local as OBB and judge inside/outside by [-1, 1]^3
// so we don't need to fetch aabb anymore
// aabb fetch_aabb() const;
// CAUTION: keep characteristics local_to_world as the first subface's part
const internal::transform_block &get_identity_local_to_world() const;
aabb_t fetch_aabb() const;
void apply_transform(internal::transform_type, Eigen::Vector4d);

21
primitive_process/src/base/primitive.cpp

@ -42,9 +42,9 @@ dynamic_bitset_mp<> primitive::judge_sign_by_subface_sign(stl_vector_mp<dynamic_
return res;
}
const internal::transform_block &primitive::get_identity_local_to_world() const
aabb_t primitive::fetch_aabb() const
{
return get_subface()[0].get_ptr()->raw_local_to_world();
return m_aabb;
}
void primitive::apply_transform(internal::transform_type type, Eigen::Vector4d param)
@ -59,5 +59,22 @@ void primitive::apply_transform(internal::transform_type type, Eigen::Vector4d p
new_model_matrices.emplace_back(subface_ptr->apply_transform(type, param));
}
// aabb
Eigen::Affine3d affine = Eigen::Affine3d::Identity();
switch (type) {
case internal::transform_type::scale: {
affine.linear() = param.head<3>().asDiagonal();
} break;
case internal::transform_type::rotation: {
affine.linear() = Eigen::Quaterniond(param).toRotationMatrix();
} break;
case internal::transform_type::translation: {
Eigen::Translation3d translation(param.head<3>());
affine = Eigen::Affine3d(translation);
} break;
default: throw std::invalid_argument("Invalid transform type");
}
m_aabb = m_aabb.transformed(affine);
initialize(*subfaces[0].get_ptr()->data_center, new_model_matrices);
}
Loading…
Cancel
Save