Dandelion
2.0.0
A light-weight 3D builder for educational usage
Toggle main menu visibility
载入中...
搜索中...
未找到
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
"
15
#include "
../utils/kinetic_state.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
*/
38
class
Object
39
{
40
public
:
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 表示上一帧过后是否被修改,在第一次加载后或与半边网格不一致时为真。 */
95
bool
modified
;
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 上一帧的状态,用于高阶求解器求解。 */
109
KineticState
prev_state
;
110
/*! \~chinese 进入物理模拟模式后用于备份初始状态。 */
111
KineticState
backup
;
112
/*! \~chinese
113
* 由于位姿参数每一帧都可能变化,mesh 中存储模型坐标系下的坐标以提高运行效率。
114
* 如需获取世界坐标系下的坐标,请乘上模型变换矩阵。
115
*/
116
Mesh
mesh
;
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 所有包围盒的线框。 */
132
AABBSet
BVH_boxes
;
133
134
private
:
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
};
bvh.h
Object::next_available_id
static std::size_t next_available_id
定义
object.h:144
Object::BVH_for_collision
static bool BVH_for_collision
定义
object.h:87
Object::backup
KineticState backup
定义
object.h:111
Object::center
Eigen::Vector3f center
定义
object.h:97
Object::logger
std::shared_ptr< spdlog::logger > logger
定义
object.h:146
Object::name
std::string name
定义
object.h:91
Object::Object
Object(const Object &other)=delete
Object::rebuild_BVH
void rebuild_BVH()
重新构建 BVH 。
定义
object.cpp:108
Object::material
std::unique_ptr< Material > material
定义
object.h:118
Object::step
static std::function< KineticState(const KineticState &, const KineticState &)> step
用于更新物体运动状态的函数。
定义
object.h:85
Object::prev_state
KineticState prev_state
定义
object.h:109
Object::mass
float mass
定义
object.h:107
Object::mesh
Mesh mesh
定义
object.h:116
Object::velocity
Eigen::Vector3f velocity
定义
object.h:103
Object::rotation
Eigen::Quaternionf rotation
定义
object.h:101
Object::update
void update(std::vector< Object * > &all_objects)
更新下一个时间步的运动状态。
定义
object.cpp:51
Object::id
std::size_t id
定义
object.h:89
Object::bvh
std::unique_ptr< BVH > bvh
根据这个物体建立的 BVH 。
定义
object.h:130
Object::Object
Object(const std::string &object_name)
创建一个物体
Object::force
Eigen::Vector3f force
定义
object.h:105
Object::modified
bool modified
定义
object.h:95
Object::visible
bool visible
定义
object.h:93
Object::BVH_boxes
AABBSet BVH_boxes
定义
object.h:132
Object::scaling
Eigen::Vector3f scaling
定义
object.h:99
Object::refresh_BVH_boxes
void refresh_BVH_boxes(BVHNode *node)
将新的 BVH 线框添加到 BVH_boxes 中
定义
object.cpp:116
Object::Object
Object(Object &other)=delete
Object::model
Eigen::Matrix4f model() const
定义
object.cpp:45
kinetic_state.h
material.hpp
AABBSet
用于渲染轴对齐包围盒 (AABB) 的特殊线条集。
定义
mesh.hpp:157
BVHNode
表示的是BVH建立的树中的节点
定义
bvh.h:19
KineticState
表示物体的质点运动学状态。
定义
kinetic_state.h:31
Mesh
用于同步渲染数据的三角形 Mesh 。
定义
mesh.hpp:28
src
scene
object.h
制作者
1.18.0