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