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