拾取原理有以下几种:
三维引擎性能问题:
拾取操作需要确定射线和对象几何的关系,一般是线线求交,线面求交,对于非解析参数几何需要进行大量迭代计算,这种计算本身是比较耗时的,如果模型对象较多,则会存在性能瓶颈。
1. 当模型或者场景视图比较固定,我们可以将三维模型投影到二维,二维模型的位置计算量要远小于三维
2. 当对象较多,而且比较分散,则可以使用树结构,常用的八叉树,kd树,BSP树,R树
3. 包围盒计算效率很高,在实际计算中,可以通过包围盒对对象进行过滤;除了常用的AABB包围盒,有条件可以使用OBB紧包围盒
AABB拾取算法
std::pair<double, double> SlabAABBBase(const AxisAlignedBoundingBox& box) const
{double t_x0 = x_inv_ * (box.min_bound_.x() - origin().x());double t_x1 = x_inv_ * (box.max_bound_.x() - origin().x());double t_min = std::min(t_x0, t_x1);double t_max = std::max(t_x0, t_x1);double t_y0 = y_inv_ * (box.min_bound_.y() - origin().y());double t_y1 = y_inv_ * (box.max_bound_.y() - origin().y());t_min = std::max(t_min, std::min(t_y0, t_y1));t_max = std::min(t_max, std::max(t_y0, t_y1));double t_z0 = z_inv_ * (box.min_bound_.z() - origin().z());double t_z1 = z_inv_ * (box.max_bound_.z() - origin().z());t_min = std::max(t_min, std::min(t_z0, t_z1));t_max = std::min(t_max, std::max(t_z0, t_z1));return {t_min, t_max};
}
本文发布于:2024-01-28 04:21:15,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063868814730.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |