/
ply_to_gcloud.rs
77 lines (59 loc) · 2.32 KB
/
ply_to_gcloud.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use byte_unit::{
Byte,
UnitType,
};
use bevy_gaussian_splatting::{
GaussianCloud,
io::{
ply::parse_ply,
writer::write_gaussian_cloud_to_file,
},
};
#[cfg(feature = "query_sparse")]
use bevy_gaussian_splatting::query::sparse::SparseSelect;
#[allow(dead_code)]
fn is_point_in_transformed_sphere(pos: &[f32; 3]) -> bool {
let inv_scale_x = 1.0 / 1.75;
let inv_scale_y = 1.0 / 1.75;
let inv_scale_z = 1.0 / 1.75;
let inv_trans_x = 1.7;
let inv_trans_y = -0.5;
let inv_trans_z = -3.8;
let transformed_x = (pos[0] + inv_trans_x) * inv_scale_x;
let transformed_y = (pos[1] + inv_trans_y) * inv_scale_y;
let transformed_z = (pos[2] + inv_trans_z) * inv_scale_z;
transformed_x.powi(2) + transformed_y.powi(2) + transformed_z.powi(2) <= 1.0
}
fn main() {
let filename = std::env::args().nth(1).expect("no filename given");
println!("converting {}", filename);
let file = std::fs::File::open(&filename).expect("failed to open file");
let mut reader = std::io::BufReader::new(file);
let mut cloud = GaussianCloud::from_gaussians(
parse_ply(&mut reader).expect("failed to parse ply file"),
);
// TODO: prioritize mesh selection over export filter
// println!("initial cloud size: {}", cloud.len());
// cloud = (0..cloud.len())
// .filter(|&idx| {
// is_point_in_transformed_sphere(
// cloud.position(idx),
// )
// })
// .map(|idx| cloud.gaussian(idx))
// .collect();
// println!("filtered position cloud size: {}", cloud.len());
#[cfg(feature = "query_sparse")]
{
let sparse_selection = SparseSelect::default().select(&cloud).invert(cloud.len());
cloud = sparse_selection.indicies.iter()
.map(|idx| cloud.gaussian(*idx))
.collect();
println!("sparsity filtered cloud size: {}", cloud.len());
}
let base_filename = filename.split('.').next().expect("no extension").to_string();
let gcloud_filename = base_filename + ".gcloud";
write_gaussian_cloud_to_file(&cloud, &gcloud_filename);
let post_encode_bytes = Byte::from_u64(std::fs::metadata(&gcloud_filename).expect("failed to get metadata").len());
println!("output file size: {}", post_encode_bytes.get_appropriate_unit(UnitType::Decimal));
}