Dandelion 2.0.0
A light-weight 3D builder for educational usage
载入中...
搜索中...
未找到
Scene类 参考

表示一个包含相机、光源、物体等对象的完整场景。 更多...

#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 对象析构时,所有的组、 物体都会自行析构。

构造及析构函数说明

◆ Scene() [1/3]

Scene::Scene ( Scene & other)
delete

禁止复制场景。

◆ Scene() [2/3]

Scene::Scene ( const Scene & other)
delete

禁止复制场景。

◆ Scene() [3/3]

Scene::Scene ( Scene && other)
delete

禁止移动场景。

成员函数说明

◆ check_during_simulation()

bool Scene::check_during_simulation ( )

查询当前是否正在进行物理模拟。

◆ for_each_object() [1/2]

template<ObjectOp F>
void Scene::for_each_object ( F && op)
inline

对每个物体执行同样的操作,允许读写物体数据。

参数
op要执行的操作,其函数签名必须满足 ObjectOp 的要求。

◆ for_each_object() [2/2]

template<ObjectReadOp F>
void Scene::for_each_object ( F && op) const
inline

对每个物体执行同样的操作,只能读取物体数据。

参数
op要执行的操作,其函数签名必须满足 ObjectReadOp 的要求。

◆ import_model()

bool Scene::import_model ( const std::string & file_path)

从指定路径导入模型文件到这个场景中。

这个函数只会根据文件名创建一个物体组,然后调用物体组的 load_models 方法加载文件。

参数
file_path要导入的模型文件路径
返回
加载是否成功

◆ load()

bool Scene::load ( const std::string_view directory)

从指定目录中加载保存的场景数据。

与 save 方法相对应,load 会从保存的数据中恢复模型、物体、组、相机、 光源等全部信息。

参数
directory要加载的场景文件夹路径
返回
是否加载成功

◆ reset_simulation()

void Scene::reset_simulation ( )

恢复物体在动画开始前的状态。

◆ save()

bool Scene::save ( const std::string_view directory)

保存所有场景数据到指定的目录中。

保存场景时涉及两类数据:

  • 模型数据(包括几何数据和材质数据),会被保存为通用模型文件格式
  • 元数据,Dandelion 特有的组、物体信息等,会被保存为 metadata.json 文件
参数
directory场景文件夹路径
返回
是否保存成功

◆ simulation_update()

void Scene::simulation_update ( )

计算场景中所有物体下一帧要渲染的运动状态。

这个函数按照固定的时间步长模拟物体运动。

每一帧的渲染过程可以概括为更新数据(几何、运动等等)和渲染图像两步。 约定当前屏幕上显示的是上一帧的图像,正在计算的是当前帧的数据。 更新运动状态时首先用当前时间减去 last_update 得到上一帧和之前帧剩余时长之和; 再循环模拟物体运动。每循环一次走过一个长度为 time_step 的时间步、 剩余时长减去 time_step ;当剩余时长不足一个 time_step 时停止模拟, 并将这一帧模拟走过的总时长累加到 last_update 上。

◆ start_simulation()

void Scene::start_simulation ( )

备份物体当前状态并开始模拟,此后每一帧都会调用所有物体的 update 方法。

◆ stop_simulation()

void Scene::stop_simulation ( )

停止模拟,此后不再调用物体的 update 方法。

类成员变量说明

◆ all_objects

std::vector<Object*> Scene::all_objects
private

碰撞检测时记录所有物体,其他情况下无效。

◆ arrows

ArrowSet Scene::arrows

用于在物理模拟模式下显示速度向量。

◆ camera

Camera Scene::camera

用于 离线渲染 的相机,和用于预览场景的观察相机(主相机)无关。

◆ camera_wireframe

LineSet Scene::camera_wireframe

用于显示离线渲染相机。

◆ during_animation

bool Scene::during_animation
private

状态变量,表示当前是否正在进行物理模拟。

◆ ground_grid

LineSet Scene::ground_grid

用于显示地面网格。

◆ groups

std::vector<std::unique_ptr<Group> > Scene::groups

场景中所有的物体组。

◆ halfedge_mesh

std::unique_ptr<HalfedgeMesh> Scene::halfedge_mesh

用于建模模式的半边网格。

◆ highlighted_element

Mesh Scene::highlighted_element

被选中元素类型为顶点、边、面片或光源时使用的绘制对象。

◆ highlighted_halfedge

ArrowSet Scene::highlighted_halfedge

被选中元素类型为半边时使用的绘制对象。

◆ initial_camera_pos

Vector3f Scene::initial_camera_pos
staticprivate

主相机的初始位置。

◆ initial_camera_target

Vector3f Scene::initial_camera_target
staticprivate

主相机的初始观察目标点(看向的位置)。

◆ last_update

std::chrono::time_point<std::chrono::steady_clock> Scene::last_update
private

上一次将模拟状态同步到渲染的时间点。

◆ light_indicator

Mesh Scene::light_indicator

显示光源。这个 Mesh 中只包含一个光源示意图的几何数据,渲染时需要多次绘制。

◆ lights

std::list<Light> Scene::lights

用于 离线渲染 的光源,和预览时照亮物体的光源无关。

◆ logger

std::shared_ptr<spdlog::logger> Scene::logger
private

日志记录器。

◆ main_camera

Camera Scene::main_camera

用于预览场景的观察相机(主相机)。

◆ metadata_filename

std::string_view Scene::metadata_filename = "metadata.json"
staticconstexprprivate

保存场景元数据的文件名。

◆ picking_ray

LineSet Scene::picking_ray

显示拾取射线用的绘制对象,对应 DebugOptions::show_picking_ray 。

◆ selected_element

SelectableType Scene::selected_element

当前被选中的元素。

根据当前所处的模式,物体、各类几何基本元素、光源都可能被选中,详见 SelectableType 的类型说明。当 selected_element 持有 std::monostate 类型时, 当前的选择状态为空(没有任何元素被选中)。

◆ selected_object

Object* Scene::selected_object

当前被选中的物体。

在布局模式和物理模拟模式下,它决定当前被高亮的物体;在建模模式下,仅有这个物体被绘制。

◆ x_axis

LineSet Scene::x_axis

用于显示 x 轴。

◆ y_axis

LineSet Scene::y_axis

用于显示 y 轴。

◆ z_axis

LineSet Scene::z_axis

用于显示 z 轴。


该类的文档由以下文件生成: