pmse_se/or/
mod.rs

1//! 刚体 (object rigid) 运动计算
2
3/// (物体) 刚体: 不会形变
4#[derive(Debug, Clone)]
5pub struct ObjR {
6    // + (1) 物体固有物理量
7    /// 质量 (单位: kg)
8    pub m: f32,
9    /// 转动惯量 (单位: kg/m2)
10    pub rm: f32,
11
12    // + (2) 平动物理量
13    /// 位置 (单位: m) (x, y, z)
14    pub x: [f32; 3],
15    /// 速度 (单位: m/s) (x, y, z) None 表示 固定不动 的物体.
16    pub v: Option<[f32; 3]>,
17    /// 加速度 (单位: m/s2) (x, y, z) None 表示 匀速直线运动 的物体.
18    pub a: Option<[f32; 3]>,
19
20    // + (3) 转动物理量
21    /// 角度 (旋转) (单位: rad) (x, y, z)
22    pub r: [f32; 3],
23    /// 角速度 (单位: rad/s) (x, y, z) None 表示 不旋转 的物体.
24    pub rv: Option<[f32; 3]>,
25    /// 角加速度 (单位: rad/s2) (x, y, z) None 表示 匀速旋转 的物体.
26    pub ra: Option<[f32; 3]>,
27
28    // + (4) 加速计算物理量
29    /// 最大半径 (单位: m): 物体任意一点, 距离重心的最大距离.
30    /// None 表示半径为 0.
31    pub cr: Option<f32>,
32    /// 物体的体积 (单位: m3). None 表示体积为 0.
33    pub cv: Option<f32>,
34}
35
36impl Default for ObjR {
37    fn default() -> Self {
38        Self {
39            m: 0.0,
40            rm: 0.0,
41            x: [0.0, 0.0, 0.0],
42            v: None,
43            a: None,
44            r: [0.0, 0.0, 0.0],
45            rv: None,
46            ra: None,
47            cr: None,
48            cv: None,
49        }
50    }
51}
52
53/// 刚体 模拟计算的数值限制 (下限, 上限)
54#[derive(Debug, Clone)]
55pub struct ObjLR {
56    /// 模拟计算的 时间 间隔 (单位: s) [最小值, 最大值]
57    pub t: [f32; 2],
58
59    /// 物体质量 (单位: kg)
60    pub m: [f32; 2],
61    /// 转动惯量 (单位: kg/m2)
62    pub rm: [f32; 2],
63    /// 物体位置坐标值 (单位: m)
64    pub x: [f32; 2],
65    /// 物体的速度 (单位: m/s)
66    pub v: [f32; 2],
67    /// 物体的加速度 (单位: m/s2)
68    pub a: [f32; 2],
69
70    // TODO 角度 (单位: rad) (x, y, z) None 表示不限制.
71    //r: Option<[[f32; 2]; 3]>,
72    /// 角速度 (单位: rad/s)
73    pub rv: [f32; 2],
74    /// 角加速度 (单位: rad/s2)
75    pub ra: [f32; 2],
76}
77
78impl Default for ObjLR {
79    fn default() -> Self {
80        Self {
81            // 模拟计算中允许的时间间隔: 最小 0.001s (1ms), 最大 1s
82            t: [0.001, 1.0],
83            // 允许的物体质量: 最小 0.001kg (1g), 最大 100 万吨 (1Gkg)
84            m: [0.001, 1.0e9],
85            // 允许的物体转动惯量: 最小 1u kg/m2, 最大 1T kg/m2
86            rm: [1.0e-6, 1.0e12],
87            // 允许的物体位置坐标: 最小 1um, 最大 200km.
88            x: [1.0e-6, 2.0e5],
89            // 允许的物体速度: 最小 1um/s, 最大 300m/s.
90            v: [1.0e-6, 300.0],
91            // 允许的物体加速度: 最小 1um/s2, 最大 300km/s.
92            a: [1.0e-6, 3.0e5],
93            // TODO 角度: 不限制.
94            //r: None,
95            // 角速度: 最小 1u rad/s, 最大 10k rad/s.
96            rv: [1.0e-6, 1.0e4],
97            // 角加速度: 最小 1u rad/s2, 最大 100k rad/s2.
98            ra: [1.0e-6, 1.0e5],
99        }
100    }
101}