You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:43:12