如何在OpenInventor中记录立方体顶点的世界坐标运动轨迹?
解决思路
1. 先理清楚初始参数
- 明确立方体的初始中心坐标(比如
(cx0, cy0, cz0),因不在原点),以及你要跟踪的顶点相对于立方体中心的局部坐标(比如立方体边长为a,顶点局部坐标可设为(a/2, a/2, a/2),以实际立方体顶点定义为准)
2. 拆解运动的数学计算
立方体的运动是自转+公转的叠加,每帧需计算目标顶点的世界坐标,分两步处理:
公转部分(立方体中心绕原点旋转)
- 确定公转角速度
omega_orbit(单位:弧度/秒)、公转平面(比如XY平面) - 按累计时间
t计算公转后的立方体中心坐标:// 以XY平面公转为例,z坐标保持初始值不变 float cx = cx0 * cos(omega_orbit * t) - cy0 * sin(omega_orbit * t); float cy = cx0 * sin(omega_orbit * t) + cy0 * cos(omega_orbit * t); float cz = cz0;
自转部分(立方体绕自身轴旋转)
- 确定自转角速度
omega_rotate和自转轴(比如立方体自身Z轴) - 将顶点的局部坐标绕自转轴旋转,得到旋转后的局部坐标:
// 绕自身Z轴自转的坐标变换 float x_local_rot = x_local * cos(omega_rotate * t) - y_local * sin(omega_rotate * t); float y_local_rot = x_local * sin(omega_rotate * t) + y_local * cos(omega_rotate * t); float z_local_rot = z_local;
合并得到顶点世界坐标
将自转后的局部坐标与公转后的中心坐标相加,即为当前帧顶点的世界坐标:
float x_world = cx + x_local_rot; float y_world = cy + y_local_rot; float z_world = cz + z_local_rot;
3. 轨迹记录与绘制
- 用容器存储轨迹点,比如
std::vector<SbVec3f>(Open Inventor的三维点类型),每帧计算出顶点坐标后就添加到容器中 - 用你已掌握的点绘制方法,遍历容器逐个绘制点即可。若后续想让轨迹更连贯,可替换为
SoLineSet连接这些点,用法与画点类似,仅节点类型不同
4. 用定时器驱动帧更新
借助Open Inventor的SoTimerSensor实现每帧运动更新:
- 创建
SoTimerSensor对象,绑定一个回调函数 - 在回调函数内完成:计算累计时间、更新顶点坐标、添加轨迹点、触发场景刷新
- 设置传感器触发间隔(比如1/60秒,对应60帧),启动传感器
小提醒
- 三角函数计算需用弧度制,若角速度单位为角度/秒,记得乘以
M_PI/180转换为弧度 - 不要无限存储轨迹点,可设置最大存储数量(比如1000个),超过上限时删除最早的点,实现轨迹拖尾效果
内容的提问来源于stack exchange,提问作者Pang Long
相关产品推荐
相关产品推荐

