24
2021
06

力学的保存与恢复

问题描述

力学器材相对于电学器材要复杂。电学中的引擎只负责电学数据计算,不涉及到器材的任何属性(包括几何属性和电学属性)的改变,保存恢复不用考虑引擎的影响。而力学器材,器材的几何属性是靠引擎计算得出的,器材与器材之间的关系也是靠引擎中的约束来维护的,器材的物理属性也可能会影响器材的状态,需要考虑的比较多,实现起来更复杂。

问题分析

力学中,我们要处理的对象为刚体和约束,显示只是作为皮肤,跟随刚体运动,因此,力学中我们需要保存刚体的属性(比如位置,旋转角度)而不是器材的属性(刚体的位置和器材的位置可能不一样,而是成正比)。

电学中器材与器材的连接关系是用“卡槽模型”来维护的,力学中是靠约束来维护的,因此我们还要存储约束。

刚体的存储与恢复

对于刚体,我们考虑位置、旋转角度、速度(包含平动速度和角速度)、受力。位置和旋转角度一定是要存的,之前的器材也是存了的,只是值可能不一样。速度也是应该存的。对于受力,主动力是不用存的,引擎计算的时候会添加进去,约束力也不用存,也是引擎计算出来了。因此,对于刚体,我们需要存储坐标和旋转角度,以及平动速度和角速度。

对于力学器材,一个器材可能是由一个刚体组成的,也可能是由多个刚体组合而成的。刚体和刚体之间(可以是同一个器材的刚体,也可能是不同器材的刚体)的连接关系是靠约束来维护的。我们需要把所有的刚体的位置角度全部保存,即使刚体的位置角度是完全靠约束来限制的。器材内部的约束是不用存的,因为器材内部的约束都是固定的,创建器材的时候就会创建,创建之后不会修改,当然,如果约束创建之后会变化,也是需要存的,至少到目前为止,我还没有遇到过。

约束的存储与恢复

我们不用考虑器材内部的约束,只考虑器材之间的约束。力学中的约束,对应电学中的“卡槽模型”。

力学引擎中有好多种约束,看起来很复杂,但是可以抽象一下,所有的约束都是对两个刚体的位置关系进行限制的(nape中滑轮是4个刚体),约束c = f (p1, p2) = 0,电学中的“卡槽模型”也是限制两个器材的位置关系的(卡的位置跟随槽的位置),约束c = f (p1, p2) = p1 - p2 = 0。可以统一一下,无论是电学的卡槽模型,还是力学的约束,我们只需要关心谁和谁连接在一起,至于具体是怎么实现连接的,并不用关心。

题外话: 实验过程中,刚体之间的绑定(比如钩子挂钩码),逻辑也和卡槽模型是一样的,碰撞检测-判断是否能连接->能连接的话连接。

同步

我们使用状态同步的方式实现教师端与学生端的同步。同步和保存恢复用的是同一套数据,只要我们将刚体和约束的状态全部同步过去(电学中,我们并没有将全部状态同步过去),两边的显示状态就是一致的。学生端和教师端引擎都开启的状态下(学生端关闭引擎,就是一个纯播放器),目前为止,并没有出现表现不一致的情况。力学的同步实现起来并没有想象中那么困难,数据量也不会很大,可定会有意想不到的问题出现,单并非无解。

另外,力学中,刚体的拖动有可能是使用约束实现的,在保存恢复数据的时候,不需要保存这个为鼠标交互创建的约束,但是在同步的时候,缺少了这个约束,刚体可能会产生振荡。


« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。