open3d c++ API 之光线追踪(RaycastingScene)

 最近做可视性检测用到了open3d的RaycastingScene,但是网上的教程多是python版的,因此这里对c++ api的使用做一些记录。

废话不多说,直接上代码:

#include <open3d/t/geometry/RaycastingScene.h>

using namespace open3d;
using namespace open3d::geometry;
void singleCloudRaycast(const std::string &path) {
  // 首先创建一个空的geometry::TriangleMesh类型的mesh
  auto mesh = std::make_shared<geometry::TriangleMesh>();
  // 从文件读取含有顶点和面的mesh
  io::ReadTriangleMesh(path, *mesh);
  // 转换为tensor里的TriangleMesh,因为RaycastingScene是在tensor上实现的
  auto tmesh = t::geometry::TriangleMesh::FromLegacy(*mesh, core::Float32, core::Int64);

  // 创建一个RaycastingScene
  t::geometry::RaycastingScene scene;
  // 向场景中添加mesh,这里也可以用另一个重载的AddTriangles,可以接收tensor类型的vertex和face
  scene.AddTriangles(tmesh);

  // 接下来是添加光线,维度是nx6,前三个维度表示起点,后三个维度表示朝向
  // 我这里假设添加1条光线
  int numRays = 1;
  // 创建一个nx6的tensor来储存光线,每一行表示一条射线
  auto rays = core::Tensor::Zeros(numRays, 6}, core::Float32);
  for (int i = 0; i < numRays; ++i) {
    // 注意,表示射线方向的向量必须是单位化的
    Eigen::Vector3f pn = Eigen::Vector3f(2, 0, 0).normalized();
    // 这行的意思是把rays的第i行的3-6位的元素改成pn(c++的tensor元素访问和修改有一些复杂,吐槽一下)
    // 因为起点的(0,0,0),所以只修改后三个方向维度就好
    rays.SetItem({core::TensorKey::Index(i), core::TensorKey::Slice(3, 6, 1)},
                  core::Tensor::Init<float>({pn(0), pn(1), pn(2)}));
  }

  // CastRays返回的类型是std::unordered_map<std::string, core::Tensor>
  auto castResults = scene.CastRays(rays);
  // "t_hit" 这个键储存了光线起点到mesh到距离,如果没有相交就是inf
  auto &castDists = castResults["t_hit"];
}

里面涉及到一些open3d c++的api,可以点击这里查阅

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值