加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 将数值积分添加到更新其物理状态的对象

发布时间:2020-12-16 07:31:50 所属栏目:百科 来源:网络整理
导读:我考虑过这种情况:大致如下的对象: class PhyisicalObject{ private: virtual void Update() = 0; friend class PhysicsController; void DoUpdate() { this-Update(); }}; 有一个名为PhysicsController的控制器类,它通过调用DoUpdate()方法来管理物理对象
我考虑过这种情况:大致如下的对象:

class PhyisicalObject
{
  private:
  virtual void Update() = 0;
  friend class PhysicsController;
  void DoUpdate() { this->Update(); }
};

有一个名为PhysicsController的控制器类,它通过调用DoUpdate()方法来管理物理对象池的动态.就这个方法而言,这种方法调用了Update()函数的重载版本,其中数值积分器用于逐步计算对象位置,速度和加速度.我认为有一个界面暗示这个功能将是一个很好的起点:

class IIntegrator
{
  virtual void opertor() (const vec3& pos,const vec3& vel,vec3& outPos,vec3& outVel);
};

现在继承这个IIntegrator抽象类并提供各种方法的实现是下一步(显式的Euler,RK4,Verlet,Midpoint,Symplectic Euler,也许一些半隐式/ IMEX或隐式的将是优秀的).问题是我没有清楚地看到如何做以下两件事:

>每个物理对象以不同的方式计算其自身在任何顶点的加速度(考虑到对象由通过弹簧或某种约束对象连接的质点组成).此函数必须传递给积分器,但它是特定于对象的.可以获得指向非静态方法的指针,但这如何适合IIntegrator接口?
>当对象调用其Update()方法时,幕后发生的事情是使用积分器来提供功能.我想也许会动态切换集成方法.或者至少使用不同的集成器实例化相同类型的对象.对我来说,这听起来像是工厂那样做,对于即时集成商的转换……也许是一种策略模式?在这种情况下,什么解决方案会非常优雅和高效?

解决方法

在不涉及实现细节的情况下,这里有一些可能适用于您的问题的设计模式

> Factory或Prototype分别在启动时从文件创建对象,或在运行时克隆它们.
> Composite这可以用于模拟物理对象,可以是独立对象,也可以是由字符串,弹簧或重力连接的集合.
>迭代器或访问者PhysicsController可以使用它迭代所有物理对象(复合或独立)并对它们应用函数.
>策略在运行时选择不同的IIntegrator对象及其集成函数.

除了GoF书(Amazon),一个很好的在线资源是here

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读