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

表示物体的类。 更多...

#include <object.h>

Public 成员函数

 Object (const std::string &object_name)
 
Eigen::Matrix4f model ()
 
void update (std::vector< Object * > &all_objects)
 更新下一个时间步的运动状态。
 
void render (const Shader &shader, WorkingMode mode, bool selected)
 根据指定的渲染模式渲染物体。
 
void rebuild_BVH ()
 重新构建 BVH
 
 Object (Object &other)=delete
 
 Object (const Object &other)=delete
 

Public 属性

std::size_t id
 
std::string name
 
bool visible
 
bool modified
 
Eigen::Vector3f center
 
Eigen::Vector3f scaling
 
Eigen::Quaternionf rotation
 
Eigen::Vector3f velocity
 
Eigen::Vector3f force
 
float mass
 
KineticState prev_state
 
KineticState backup
 
GL::Mesh mesh
 
std::unique_ptr< BVHbvh
 根据这个物体建立的 BVH
 
GL::LineSet BVH_boxes
 

静态 Public 属性

static std::function< KineticState(const KineticState &, const KineticState &)> step
 用于更新物体运动状态的函数。
 
static bool BVH_for_collision = false
 

Private 成员函数

void refresh_BVH_boxes (BVHNode *node)
 

Private 属性

std::shared_ptr< spdlog::logger > logger
 

静态 Private 属性

static std::size_t next_available_id = 0
 

详细描述

表示物体的类。

“物体”由存储几何数据的 mesh、存储变换信息的位姿参数和存储颜色的材质组成, 每个 Object 实例对应唯一的 GL::MeshGL::Material 和唯一的模型变换矩阵 (Model Transform Matrix),是场景中的最小单元。

由于 Object 对象持有的 GL::Mesh 实例是不可复制的,当前的 Object 也是不可复制的。但“复制一个物体”在逻辑上完全合理,因此未来会实现该类的复制构造函数。

构造及析构函数说明

◆ Object()

Object::Object ( Object & other)
delete

禁止复制物体。

成员函数说明

◆ model()

Matrix4f Object::model ( )

此物体的模型变换矩阵 (Model Transform Matrix)。

◆ rebuild_BVH()

void Object::rebuild_BVH ( )

重新构建 BVH

原先没有构建过 BVH 的情况下调用这个函数也是安全的。

◆ render()

void Object::render ( const Shader & shader,
WorkingMode mode,
bool selected )

根据指定的渲染模式渲染物体。

参数
shader对一个 Shader 对象的引用
mode渲染模式。所有模式下都渲染面片,建模模式下额外渲染边和顶点。
selected布局模式下该物体是否被选中,被选中的物体额外渲染边。其他模式下, 该参数无意义。

◆ update()

void Object::update ( std::vector< Object * > & all_objects)

更新下一个时间步的运动状态。

首先使用 Object::step 计算下一个时间步自身的运动状态,尝试将自身移动到算出的位置, 再检测在此位置是否会与其他物体碰撞。如果发生碰撞则自身位置回退, 并根据动量定理修改碰撞双方的速度。

参数
all_objects场景中所有的物体,用于碰撞检测和响应。

类成员变量说明

◆ backup

KineticState Object::backup

进入物理模拟模式后用于备份初始状态。

◆ bvh

std::unique_ptr<BVH> Object::bvh

根据这个物体建立的 BVH

物体的 BVH 在它的 mesh 加载完成后构建。由于 mesh 数据的加载过程是在 Group::load 中完成的,构建 BVH 的函数调用也只能在这个函数(而不是在 Object 的构造函数)中进行。

物体的 mesh 数据都在模型坐标系下,因此 BVH 也是建立在模型坐标系下的。这意味着物体的平移、 旋转和缩放都不改变 BVH 的结构,只有物体发生形变时才需要更新 BVH 。目前的实现是: 每次退出建模模式时,不加检查地删除原先的 BVH 并重新构建。

◆ BVH_boxes

GL::LineSet Object::BVH_boxes

代表 BVH 所有包围盒的线框。

◆ BVH_for_collision

bool Object::BVH_for_collision = false
static

是否启用 BVH 加速碰撞检测。

◆ center

Eigen::Vector3f Object::center

物体的中心点位置。此处“中心点”指的是模型坐标系的原点而非几何意义上的中心。

◆ force

Eigen::Vector3f Object::force

物体所受的合外力。

◆ id

std::size_t Object::id

物体的 ID,不会与其他物体重复。

◆ logger

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

日志记录器。

◆ mass

float Object::mass

物体质量

◆ mesh

GL::Mesh Object::mesh

由于位姿参数每一帧都可能变化,mesh 中存储模型坐标系下的坐标以提高运行效率。 如需获取世界坐标系下的坐标,请乘上模型变换矩阵。

◆ modified

bool Object::modified

表示上一帧过后是否被修改,在第一次加载后或与半边网格不一致时为真。

◆ name

std::string Object::name

物体的名称,来自加载文件时的 mesh 名称(文件中未定义会创建一个默认名称)。

◆ next_available_id

size_t Object::next_available_id = 0
staticprivate

下一个可用的物体 ID 。

◆ prev_state

KineticState Object::prev_state

上一帧的状态,用于高阶求解器求解。

◆ rotation

Eigen::Quaternionf Object::rotation

物体的旋转。

◆ scaling

Eigen::Vector3f Object::scaling

物体三轴的缩放因子。

◆ step

std::function< KineticState(const KineticState &, const KineticState &)> Object::step
static
初始值:
=
forward_euler_step

用于更新物体运动状态的函数。

让这个静态变量指向不同的函数,就可以更换不同的求解器,默认使用前向欧拉法求解。

◆ velocity

Eigen::Vector3f Object::velocity

物体的速度。

◆ visible

bool Object::visible

控制物体是否可见,当前恒为真,并无实际作用。


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