我应该如何构建非常简单的物理模拟/渲染器?

时间:2016-06-06 13:40:33

标签: design-patterns renderer physics-engine

我正在尝试编写一个非常简单的刚体物理模拟(使用c ++和OpenGL)用于学习目的(也请提前原谅我,但英语不是我的第一语言)。

现在,到目前为止,我的课程结构如下:

代理类:

  • 在模拟中移动实体
  • 包含典型变量,如位置,速度,最大速度等等

障碍类:

  • 模拟中的固定实体(如墙)

模拟课程:

  • 包含所有Agent和Obstacle对象的列表,并在程序循环的每个刻度处更新它们的状态

渲染器类:

  • 负责初始化OpenGL
  • Update方法获取指向模拟对象的指针,并将状态呈现为屏幕。

现在一切正常但我在如何进一步构建我的程序以实现以下功能方面遇到了问题:

  • 像顶点,纹理和要使用的着色器这样的东西当前在渲染器中是硬编码的。我希望能够在每个Agent对象的基础上更改它们,但我认识到这些变量在Agent类和Simulation类中都没有位置。我应该在哪里跟踪这些?

  • 我想在程序中添加一些调试/可视化内容。例如,给定一个选定的代理程序,程序将在经过一定距离后绘制一个点(例如:每2个统一行进1个点),这样我就可以有一条轨迹来显示代理的去向。什么课程负责:

    1. 跟踪哪一个是所选代理
    2. 根据所选代理人行进距离和位置创建和跟踪点数
    3. 最终消失并删除旧点 我不认为Simulation类和Render类都不应该负责跟踪这些额外的数据(理想情况下,Render应该只知道点以便渲染它们)。

对不起啰嗦的帖子感到抱歉,但我一直试图解决这些问题两个星期,但没有什么好的想法。

我知道我可以使用实体组件系统架构缓解这些问题,但我真的更喜欢保持它尽可能简单。

1 个答案:

答案 0 :(得分:0)

实体/组件架构是我所需要的。通过互联网有很多关于此的内容,我鼓励你google it并在堆栈溢出和gamedev stackexchange上查找它。

这方面的一个例子(不是唯一一个,也许对你没有好处,但它就是一个例子)可能就像

struct Entity
{
    int m_Id;
};

struct PhysicsComponent {
    unsigned long m_Flags;
    // Some data
};
struct GraphicsComponent {
    Texture m_Texture;
    Mesh    m_Mesh;
    // Some other data
};

Actor actors[MAX_ACTORS];
Wall walls[MAX_WALLS];
GraphicsComponent graphics_components[MAX_GRAPHICS_COMPONENTS];

void UpdatePhysics(float dt) {
    // Do you logic stuff, using your flags and so on
}

void Render() {
    // Render your stuff by retrieving position / orientation via entities ID 
}