Dandelion 1.1.1
A light-weight 3D builder for educational usage
载入中...
搜索中...
未找到
object.h
浏览该文件的文档.
1#ifndef DANDELION_SCENE_OBJECT_H
2#define DANDELION_SCENE_OBJECT_H
3
4#include <cstddef>
5#include <string>
6#include <memory>
7#include <vector>
8#include <functional>
9
10#include <Eigen/Core>
11#include <Eigen/Geometry>
12#include <spdlog/spdlog.h>
13
14#include "../platform/gl.hpp"
17#include "../utils/bvh.h"
19
20/*!
21 * \file scene/object.h
22 * \ingroup rendering
23 * \ingroup simulation
24 */
25
26/*!
27 * \ingroup rendering
28 * \ingroup simulation
29 * \~chinese
30 * \brief 表示物体的类。
31 *
32 * “物体”由存储几何数据的 mesh、存储变换信息的位姿参数和存储颜色的材质组成,
33 * 每个 `Object` 实例对应唯一的 `GL::Mesh`、`GL::Material` 和唯一的模型变换矩阵
34 * (Model Transform Matrix),是场景中的最小单元。
35 *
36 * 由于 `Object` 对象持有的 `GL::Mesh` 实例是不可复制的,当前的 `Object`
37 * 也是不可复制的。但“复制一个物体”在逻辑上完全合理,因此未来会实现该类的复制构造函数。
38 */
39class Object
40{
41public:
42 Object(const std::string& object_name);
43 ///@{
44 /*! \~chinese 禁止复制物体。 */
45 Object(Object& other) = delete;
46 Object(const Object& other) = delete;
47 ///@}
48 ~Object() = default;
49 /*! \~chinese 此物体的模型变换矩阵 (Model Transform Matrix)。 */
50 Eigen::Matrix4f model();
51 /*!
52 * \~chinese
53 * \brief 更新下一个时间步的运动状态。
54 *
55 * 首先使用 `Object::step` 计算下一个时间步自身的运动状态,尝试将自身移动到算出的位置,
56 * 再检测在此位置是否会与其他物体碰撞。如果发生碰撞则自身位置回退,
57 * 并根据动量定理修改碰撞双方的速度。
58 *
59 * \param all_objects 场景中所有的物体,用于碰撞检测和响应。
60 */
61 void update(std::vector<Object*>& all_objects);
62 /*!
63 * \~chinese
64 * \brief 根据指定的渲染模式渲染物体。
65 *
66 * \param shader 对一个 `Shader` 对象的引用
67 * \param mode 渲染模式。所有模式下都渲染面片,建模模式下额外渲染边和顶点。
68 * \param selected 布局模式下该物体是否被选中,被选中的物体额外渲染边。其他模式下,
69 * 该参数无意义。
70 */
71 void render(const Shader& shader, WorkingMode mode, bool selected);
72 /*!
73 * \~chinese
74 * \brief 重新构建 BVH 。
75 *
76 * 原先没有构建过 BVH 的情况下调用这个函数也是安全的。
77 */
78 void rebuild_BVH();
79
80 /*!
81 * \~chinese
82 * \brief 用于更新物体运动状态的函数。
83 *
84 * 让这个静态变量指向不同的函数,就可以更换不同的求解器,默认使用前向欧拉法求解。
85 */
86 static std::function<KineticState(const KineticState&, const KineticState&)> step;
87 /*! \~chinese 是否启用 BVH 加速碰撞检测。 */
88 static bool BVH_for_collision;
89 /*! \~chinese 物体的 ID,不会与其他物体重复。 */
90 std::size_t id;
91 /*! \~chinese 物体的名称,来自加载文件时的 mesh 名称(文件中未定义会创建一个默认名称)。 */
92 std::string name;
93 /*! \~chinese 控制物体是否可见,当前恒为真,并无实际作用。 */
94 bool visible;
95 /*! \~chinese 表示上一帧过后是否被修改,在第一次加载后或与半边网格不一致时为真。 */
97 /*! \~chinese 物体的中心点位置。此处“中心点”指的是模型坐标系的原点而非几何意义上的中心。 */
98 Eigen::Vector3f center;
99 /*! \~chinese 物体三轴的缩放因子。 */
100 Eigen::Vector3f scaling;
101 /*! \~chinese 物体的旋转。 */
102 Eigen::Quaternionf rotation;
103 /*! \~chinese 物体的速度。 */
104 Eigen::Vector3f velocity;
105 /*! \~chinese 物体所受的合外力。 */
106 Eigen::Vector3f force;
107 /*! \~chinese 物体质量 */
108 float mass;
109 /*! \~chinese 上一帧的状态,用于高阶求解器求解。 */
111 /*! \~chinese 进入物理模拟模式后用于备份初始状态。 */
113 /*! \~chinese
114 * 由于位姿参数每一帧都可能变化,mesh 中存储模型坐标系下的坐标以提高运行效率。
115 * 如需获取世界坐标系下的坐标,请乘上模型变换矩阵。
116 */
118 /*!
119 * \~chinese
120 * \brief 根据这个物体建立的 BVH 。
121 *
122 * 物体的 BVH 在它的 mesh 加载完成后构建。由于 mesh 数据的加载过程是在 `Group::load`
123 * 中完成的,构建 BVH 的函数调用也只能在这个函数(而不是在 `Object` 的构造函数)中进行。
124 *
125 * 物体的 mesh 数据都在模型坐标系下,因此 BVH 也是建立在模型坐标系下的。这意味着物体的平移、
126 * 旋转和缩放都不改变 BVH 的结构,只有物体发生形变时才需要更新 BVH 。目前的实现是:
127 * 每次退出建模模式时,不加检查地删除原先的 BVH 并重新构建。
128 */
129 std::unique_ptr<BVH> bvh;
130 /*! \~chinese 代表 BVH 所有包围盒的线框。 */
132
133private:
134 void refresh_BVH_boxes(BVHNode* node);
135 /*! \~chinese 下一个可用的物体 ID 。 */
136 static std::size_t next_available_id;
137 /*! \~chinese 日志记录器。 */
138 std::shared_ptr<spdlog::logger> logger;
139};
140
141#endif // DANDELION_SCENE_OBJECT_H
static std::size_t next_available_id
定义 object.h:136
static bool BVH_for_collision
定义 object.h:88
KineticState backup
定义 object.h:112
Eigen::Vector3f center
定义 object.h:98
std::shared_ptr< spdlog::logger > logger
定义 object.h:138
std::string name
定义 object.h:92
GL::Mesh mesh
定义 object.h:117
void rebuild_BVH()
重新构建 BVH 。
定义 object.cpp:143
GL::LineSet BVH_boxes
定义 object.h:131
static std::function< KineticState(const KineticState &, const KineticState &)> step
用于更新物体运动状态的函数。
定义 object.h:86
void render(const Shader &shader, WorkingMode mode, bool selected)
根据指定的渲染模式渲染物体。
定义 object.cpp:109
KineticState prev_state
定义 object.h:110
float mass
定义 object.h:108
Eigen::Vector3f velocity
定义 object.h:104
Eigen::Quaternionf rotation
定义 object.h:102
void update(std::vector< Object * > &all_objects)
更新下一个时间步的运动状态。
定义 object.cpp:52
std::size_t id
定义 object.h:90
std::unique_ptr< BVH > bvh
根据这个物体建立的 BVH 。
定义 object.h:129
Eigen::Vector3f force
定义 object.h:106
bool modified
定义 object.h:96
bool visible
定义 object.h:94
Eigen::Vector3f scaling
定义 object.h:100
Object(Object &other)=delete
Eigen::Matrix4f model()
定义 object.cpp:46
对 GLSL Shader 的简单封装。
定义 shader.hpp:24
这个文件定义了一些和渲染(离线渲染或场景预览)相关的常量、枚举等。
WorkingMode
定义 rendering.hpp:46
表示的是BVH建立的树中的节点
定义 bvh.h:22
在预览场景时绘制若干线条。
定义 gl.hpp:270
用于场景预览渲染的 Mesh 类。
定义 gl.hpp:220
表示物体的质点运动学状态。
定义 kinetic_state.h:31