我应该如何构造我的非常简单的物理学 simulation/renderer?
How should I structure my very simple physics simulation/renderer?
我正在尝试编写一个非常简单的刚体物理模拟程序(使用 c++ 和 OpenGL)以供学习之用(也请提前原谅我,但英语不是我的母语)。
现在,到目前为止,我的 classes 结构如下:
代理 class:
- 模拟中的移动实体
- 包含位置、速度、最大速度等典型变量
障碍class:
- 模拟中的固定实体(如墙)
模拟class:
- 包含所有 Agent 和 Obstacle 对象的列表,并在程序循环的每个滴答声中更新它们的状态
渲染器class:
- 负责初始化OpenGL
- 更新方法采用指向模拟对象的指针并将状态呈现到屏幕。
现在一切正常,但我在如何进一步构建我的程序以实现以下功能方面遇到问题:
诸如顶点、纹理和要使用的着色器之类的东西目前在渲染器中进行了硬编码。我希望能够在每个 Agent 对象的基础上更改这些变量,但我认识到这些变量在 Agent class 和 Simulation class 中都没有位置。我应该在哪里跟踪这些?
我想在程序中添加一些调试/可视化的东西。例如,给定一个选定的代理,程序将在行进一定距离后绘制一个点(例如:每 2 个单位行进 1 个点),这样我就可以有一种轨迹来可视化代理去了哪里。 class 负责什么:
- 跟踪哪个是选定的代理
- 根据选定的代理行进距离和位置创建和跟踪点
- 最终褪色而不是删除旧点
我认为 Simulation class 和 Render class 都不应该负责跟踪这些额外数据(理想情况下,Render 应该只知道这些点以便渲染它们)。
抱歉啰嗦 post 但我已经尝试解决这些问题已经两周了,但没有什么好 [=77=] 能想到的。
我知道我可以使用实体组件系统架构来缓解这些问题,但我真的更喜欢让它尽可能简单。
实体/组件架构是您所需要的我 guess.There 在互联网上有很多关于此的内容,我鼓励您 google 它并在堆栈溢出和 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
}
我正在尝试编写一个非常简单的刚体物理模拟程序(使用 c++ 和 OpenGL)以供学习之用(也请提前原谅我,但英语不是我的母语)。
现在,到目前为止,我的 classes 结构如下:
代理 class:
- 模拟中的移动实体
- 包含位置、速度、最大速度等典型变量
障碍class:
- 模拟中的固定实体(如墙)
模拟class:
- 包含所有 Agent 和 Obstacle 对象的列表,并在程序循环的每个滴答声中更新它们的状态
渲染器class:
- 负责初始化OpenGL
- 更新方法采用指向模拟对象的指针并将状态呈现到屏幕。
现在一切正常,但我在如何进一步构建我的程序以实现以下功能方面遇到问题:
诸如顶点、纹理和要使用的着色器之类的东西目前在渲染器中进行了硬编码。我希望能够在每个 Agent 对象的基础上更改这些变量,但我认识到这些变量在 Agent class 和 Simulation class 中都没有位置。我应该在哪里跟踪这些?
我想在程序中添加一些调试/可视化的东西。例如,给定一个选定的代理,程序将在行进一定距离后绘制一个点(例如:每 2 个单位行进 1 个点),这样我就可以有一种轨迹来可视化代理去了哪里。 class 负责什么:
- 跟踪哪个是选定的代理
- 根据选定的代理行进距离和位置创建和跟踪点
- 最终褪色而不是删除旧点 我认为 Simulation class 和 Render class 都不应该负责跟踪这些额外数据(理想情况下,Render 应该只知道这些点以便渲染它们)。
抱歉啰嗦 post 但我已经尝试解决这些问题已经两周了,但没有什么好 [=77=] 能想到的。
我知道我可以使用实体组件系统架构来缓解这些问题,但我真的更喜欢让它尽可能简单。
实体/组件架构是您所需要的我 guess.There 在互联网上有很多关于此的内容,我鼓励您 google 它并在堆栈溢出和 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
}