DeviceArray<pcl::gpu::MarchingCubes::PointType> pcl::gpu::MarchingCubes::run(const TsdfVolume& tsdf, DeviceArray<PointType>& triangles_buffer) { if (triangles_buffer.empty()) triangles_buffer.create(DEFAULT_TRIANGLES_BUFFER_SIZE); occupied_voxels_buffer_.create(3, triangles_buffer.size() / 3); device::bindTextures(edgeTable_, triTable_, numVertsTable_); int active_voxels = device::getOccupiedVoxels(tsdf.data(), occupied_voxels_buffer_); if(!active_voxels) { device::unbindTextures(); return DeviceArray<PointType>(); } DeviceArray2D<int> occupied_voxels(3, active_voxels, occupied_voxels_buffer_.ptr(), occupied_voxels_buffer_.step()); int total_vertexes = device::computeOffsetsAndTotalVertexes(occupied_voxels); float3 volume_size = device_cast<const float3>(tsdf.getSize()); device::generateTriangles(tsdf.data(), occupied_voxels, volume_size, (DeviceArray<device::PointType>&)triangles_buffer); device::unbindTextures(); return DeviceArray<PointType>(triangles_buffer.ptr(), total_vertexes); }
ColorVolume::ColorVolume(const TsdfVolume& tsdf) : resolution_(tsdf.getResolution()), volume_size_(tsdf.getSize()) { int volume_x = resolution_(0); int volume_y = resolution_(1); int volume_z = resolution_(2); color_volume_.create(volume_y * volume_z, volume_x); reset(); }
void pcl::gpu::RayCaster::run(const TsdfVolume& volume, const Affine3f& camera_pose) { camera_pose_ = camera_pose; volume_size_ = volume.getSize(); device::Intr intr (fx_, fy_, cx_, cy_); vertex_map_.create(rows * 3, cols); normal_map_.create(rows * 3, cols); typedef Matrix<float, 3, 3, RowMajor> Matrix3f; Matrix3f R = camera_pose_.linear(); Vector3f t = camera_pose_.translation(); const Mat33& device_R = device_cast<const Mat33>(R); const float3& device_t = device_cast<const float3>(t); float tranc_dist = volume.getTsdfTruncDist(); device::raycast (intr, device_R, device_t, tranc_dist, device_cast<const float3>(volume_size_), volume.data(), vertex_map_, normal_map_); }