我试图在我的Rust ray tracer中实现BVH算法,但我在使用寿命和所有权方面遇到了问题。我有一个特性<code>可命中</code>是由一堆不同的东西实现的--<code>球体</code>、<code>三角形</ode>、<code〉网格</code>,等等,所以我有了一个<code>Vec
pub struct BvhNode {
bounding_box: BoundingBox,
left: Box<dyn Hittable>,
right: Box<dyn Hittable>,
}
所以我有这个递归算法,如果不是因为生命周期的问题,它几乎可以工作。我的函数看起来像
pub fn new(objects: Vec<Box<dyn Hittable>>, start: usize, end: usize, t0: f64, t1: f64) -> Self {
let r = util::rand();
let comp = if r < 1. / 3. {
util::box_x_compare
} else if r < 2. / 3. {
util::box_y_compare
} else {
util::box_z_compare
}; // which axis to compare along (random for now)
let num_obj = end - start;
let mut left: Box<dyn Hittable>;
let mut right: Box<dyn Hittable>;
if num_obj == 1 {
left = objects[start];
right = objects[start];
} else if num_obj == 2 {
if comp(&&objects[start], &&objects[start + 1]) != Ordering::Greater {
left = objects[start];
right = objects[start + 1];
} else {
left = objects[start + 1];
right = objects[start];
}
} else {
let mut slice: Vec<&Box<dyn Hittable>> = Vec::new();
for i in start..end { // make a copy to sort
slice.push(&objects[i]);
}
slice.sort_by(comp);
let mid = start + num_obj / 2;
let l = BvhNode::new(objects, start, mid, t0, t1);
let r = BvhNode::new(objects, mid, end, t0, t1);
left = Box::new(l.clone());
right = Box::new(r.clone());
}
let left_box = left.get_bounding_box(t0, t1);
let right_box = right.get_bounding_box(t0, t1);
if left_box.is_none() || right_box.is_none() {
println!("Error: No bounding box in Bvh Node");
panic!();
}
Self { left, right, bounding_box: BoundingBox::new(Point3::origin(), Point3::origin()) }
}
首先,我在尝试“移出vec”时遇到了一些问题,这是我做不到的,所以我尝试在实现< code>Hittable的所有类型上实现< code>Clone。它几乎适用于所有类型,但是我的< code>Triangle结构
pub struct Triangle <'b> {
mat: &'b Box<dyn Material>,
bounding_box: Option<BoundingBox>,
p: Vec<Point3<f64>>,
n: Vec<Vector3<f64>>,
uv: Vec<Vector2<f64>>,
}
包含对其关联网格的材质的引用,克隆不喜欢该材质。我可以复制材料本身,但它可能非常大,我不想为网格中的每个三角形复制数千份。
我觉得应该有一种更好的方法来设计我的系统,比如去掉< code>Triangle中的引用,这样它就可以很容易地被复制。一旦创建了这个结构,我就不再需要< code>Vec了,所以能够将对象< code >移出到复制它们的内部也是可行的,但是我也看不到这样做的方法。
如果有帮助的话,完整的文件在GitHub上
我可以通过将< code>objects Vec改为< code >来解决这个问题
我需要这样的东西: 当然,我认为只有内置数字类型的向量才能传递给函数。 编译器告诉我,我需要为Vec提供FromIterator的trait trait
有个以下格式的省市区数组对象: 请问如何用Ts变为以下格式的二维数组?
扁平数组的结构如上,每个目录下都可以添加数据 如何将这个数组转成树形的结构啊,转成如下的形式 目录层级的name就取对应的 xxxLevelStr
我想转换一个
问题内容: 如何将String对象转换为Date对象? 我想我需要做这样的事情: 任何帮助将不胜感激。 问题答案: SimpleDateFormat dateFormat = new SimpleDateFormat(“dd.MM.yyyy”); Date date = dateFormat.parse(“1.1.2001”); 有关详细信息,请参阅: SimpleDateFormat文档
问题内容: 如何将Python对象转换为对象? 我有一个提供第一个库的库,另一个提供了第二个库的库。 问题答案: 使用time.mktime()将时间元组(以当地时间为单位)转换为自大纪元以来的秒数,然后使用datetime.fromtimestamp()获得datetime对象。