![]() |
Dandelion 2.0.0
A light-weight 3D builder for educational usage
|
表示一个包含相机、光源、物体等对象的完整场景。 更多...
#include <scene.h>
Public 成员函数 | |
| Scene (Scene &&other)=delete | |
| bool | import_model (const std::string &file_path) |
| 从指定路径导入模型文件到这个场景中。 | |
| bool | save (const std::string_view directory) |
| 保存所有场景数据到指定的目录中。 | |
| bool | load (const std::string_view directory) |
| 从指定目录中加载保存的场景数据。 | |
| void | clear () |
| 清除场景中所有元素 | |
| void | start_simulation () |
| void | stop_simulation () |
| void | reset_simulation () |
| bool | check_during_simulation () |
| void | simulation_update () |
| 计算场景中所有物体下一帧要渲染的运动状态。 | |
| template<ObjectOp F> | |
| void | for_each_object (F &&op) |
| template<ObjectReadOp F> | |
| void | for_each_object (F &&op) const |
| Scene (Scene &other)=delete | |
| Scene (const Scene &other)=delete | |
Public 属性 | |
| std::vector< std::unique_ptr< Group > > | groups |
| Object * | selected_object |
| 当前被选中的物体。 | |
| SelectableType | selected_element |
| 当前被选中的元素。 | |
| Camera | main_camera |
| Camera | camera |
| std::list< Light > | lights |
| std::unique_ptr< HalfedgeMesh > | halfedge_mesh |
| ArrowSet | arrows |
| LineSet | ground_grid |
| LineSet | x_axis |
| LineSet | y_axis |
| LineSet | z_axis |
| LineSet | camera_wireframe |
| Mesh | highlighted_element |
| ArrowSet | highlighted_halfedge |
| LineSet | picking_ray |
| Mesh | light_indicator |
Private 属性 | |
| bool | during_animation |
| std::chrono::time_point< std::chrono::steady_clock > | last_update |
| std::vector< Object * > | all_objects |
| std::shared_ptr< spdlog::logger > | logger |
静态 Private 属性 | |
| static Eigen::Vector3f | initial_camera_pos |
| static Eigen::Vector3f | initial_camera_target |
| static constexpr std::string_view | metadata_filename = "metadata.json" |
表示一个包含相机、光源、物体等对象的完整场景。
Scene 是一个对象语义的类,它既包含完成图形设计和渲染所需的全部数据, 也具有渲染自身预览效果的功能。当前的设计是:控制器 (Controller) 在 OpenGL 上下文被创建后即创建场景实例,该实例在程序的整个生命周期中都是唯一的。因此, 复制或移动 Scene 实例都是错误的行为,因为这有可能导致场景数据不一致。 未来加入修改历史记录时,此设计思路有可能被改变。
场景可以是空的,如果它非空,则可以包含若干个物体组 (Group); 每个组也可以为空或包含若干物体 (Object),物体是场景中的最小单元,不能再分了。 各种数据遵循“尽可能存储到更小单元中”的原则,因此 Scene 类中只存储相机、 光源这些与任何物体都无关的数据,而材质、mesh 等数据则存储到物体中。 所有物体都由 Scene 对象创建并持有,当 Scene 对象析构时,所有的组、 物体都会自行析构。
|
delete |
禁止复制场景。
|
delete |
禁止复制场景。
|
delete |
禁止移动场景。
| bool Scene::check_during_simulation | ( | ) |
查询当前是否正在进行物理模拟。
|
inline |
对每个物体执行同样的操作,允许读写物体数据。
| op | 要执行的操作,其函数签名必须满足 ObjectOp 的要求。 |
|
inline |
对每个物体执行同样的操作,只能读取物体数据。
| op | 要执行的操作,其函数签名必须满足 ObjectReadOp 的要求。 |
| bool Scene::import_model | ( | const std::string & | file_path | ) |
从指定路径导入模型文件到这个场景中。
这个函数只会根据文件名创建一个物体组,然后调用物体组的 load_models 方法加载文件。
| file_path | 要导入的模型文件路径 |
| bool Scene::load | ( | const std::string_view | directory | ) |
| void Scene::reset_simulation | ( | ) |
恢复物体在动画开始前的状态。
| bool Scene::save | ( | const std::string_view | directory | ) |
保存所有场景数据到指定的目录中。
保存场景时涉及两类数据:
| directory | 场景文件夹路径 |
| void Scene::simulation_update | ( | ) |
计算场景中所有物体下一帧要渲染的运动状态。
这个函数按照固定的时间步长模拟物体运动。
每一帧的渲染过程可以概括为更新数据(几何、运动等等)和渲染图像两步。 约定当前屏幕上显示的是上一帧的图像,正在计算的是当前帧的数据。 更新运动状态时首先用当前时间减去 last_update 得到上一帧和之前帧剩余时长之和; 再循环模拟物体运动。每循环一次走过一个长度为 time_step 的时间步、 剩余时长减去 time_step ;当剩余时长不足一个 time_step 时停止模拟, 并将这一帧模拟走过的总时长累加到 last_update 上。
| void Scene::start_simulation | ( | ) |
备份物体当前状态并开始模拟,此后每一帧都会调用所有物体的 update 方法。
| void Scene::stop_simulation | ( | ) |
停止模拟,此后不再调用物体的 update 方法。
|
private |
碰撞检测时记录所有物体,其他情况下无效。
| ArrowSet Scene::arrows |
用于在物理模拟模式下显示速度向量。
| Camera Scene::camera |
用于 离线渲染 的相机,和用于预览场景的观察相机(主相机)无关。
| LineSet Scene::camera_wireframe |
用于显示离线渲染相机。
|
private |
状态变量,表示当前是否正在进行物理模拟。
| LineSet Scene::ground_grid |
用于显示地面网格。
| std::vector<std::unique_ptr<Group> > Scene::groups |
场景中所有的物体组。
| std::unique_ptr<HalfedgeMesh> Scene::halfedge_mesh |
用于建模模式的半边网格。
| Mesh Scene::highlighted_element |
被选中元素类型为顶点、边、面片或光源时使用的绘制对象。
| ArrowSet Scene::highlighted_halfedge |
被选中元素类型为半边时使用的绘制对象。
|
staticprivate |
主相机的初始位置。
|
staticprivate |
主相机的初始观察目标点(看向的位置)。
|
private |
上一次将模拟状态同步到渲染的时间点。
| std::list<Light> Scene::lights |
用于 离线渲染 的光源,和预览时照亮物体的光源无关。
|
private |
日志记录器。
| Camera Scene::main_camera |
用于预览场景的观察相机(主相机)。
|
staticconstexprprivate |
保存场景元数据的文件名。
| LineSet Scene::picking_ray |
显示拾取射线用的绘制对象,对应 DebugOptions::show_picking_ray 。
| SelectableType Scene::selected_element |
当前被选中的元素。
根据当前所处的模式,物体、各类几何基本元素、光源都可能被选中,详见 SelectableType 的类型说明。当 selected_element 持有 std::monostate 类型时, 当前的选择状态为空(没有任何元素被选中)。
| Object* Scene::selected_object |
当前被选中的物体。
在布局模式和物理模拟模式下,它决定当前被高亮的物体;在建模模式下,仅有这个物体被绘制。
| LineSet Scene::x_axis |
用于显示 x 轴。
| LineSet Scene::y_axis |
用于显示 y 轴。
| LineSet Scene::z_axis |
用于显示 z 轴。