目前,我一直在研究一些OpenGL,我希望尽可能多地学习。现在我正在写一个形状类,我希望可以使用它来源于我选择进行的其他项目。然而,我已经认识到,我需要考虑某些因素。其中之一是质量,体积和密度的集合 - 更多关于它们如何应用于几何图元本身的关系。
任何轴向对齐的球体或边界框都可能来自这个类以及基元,它们实际上将呈现在屏幕上 - 无论是2D还是3D。我希望看看是否有人可以给我一些关于如何编写一个好的Shape类而没有必要“给出答案”的指示。我需要某种方向。
我所拥有的两个主要资源是Nicol Bolas(我认为这是他的名字拼写的方式)Learning Modern Graphics Programming和3D Math Primer for Graphics and Game Development书。就渲染等方面的基本原理和先进概念而言,这些应该是足够的。
目前我正在寻找的是关于如何构建这个类的指南。我现在要做的最后一件事就是遵循教程,这些教程涉及在静态值上绘制屏幕上的三角形,因为我只是那些不太熟悉的人之一;我通过实施自己的方法并同时依赖其他信息来源来学习。
到目前为止,这就是我所拥有的(注意 - 除了ctor和内联之外,这些方法还没有实现):
class Shape
{
public:
Shape(float radius, glm::vec4 center_pos);
virtual ~Shape(void) { }
virtual void draw(void) = 0;
void collide(Shape& s);
public:
inline void setRadius(float radius)
{
mRadius = radius;
redetermineStructure();
}
public:
glm::vec4 CenterPosition;
protected:
float mass(void);
void redetermineStructure(void); //used to recalculate the dimensions and attributes of the primitive after a new value such as radius or position has been set.
protected:
float mRadius, mVolume, mDensity;
glm::vec4 mLastPosition;
int mHP;
};
答案 0 :(得分:1)
除非你已经知道你需要什么(前期设计/原型设计),否则很难给出具体答案。
如果你从中学习,那么我建议一个好的方法来编写一些简单的实现来利用你的形状类:
...应该相当快地公开你的形状类所需的各种成员函数和内部存储。
答案 1 :(得分:0)
我认为你试图在一堂课中做太多。模块化在处理复杂系统时非常有用。例如,我使用过的所有物理引擎(bullet,ode和box2d)都有物理实体和碰撞几何体的单独对象。
身体对象包含其位置,方向,速度和质量信息。质量通常也是一个单独的对象来管理质量和惯性矩。然后,主体用于确定系统中的力的加速度,并使系统及时向前积分。然后,几何对象将对象的形状包含为网格或其他描述。它用于确定接触点。
如果您要绘制这些对象,我也会使用单独的模块来完成这些操作。您可以将所有绘图信息和代码放在形状对象中,但事物的物理方面不需要知道对象纹理或光照信息。此外,您可能希望以不同于物理表示的方式绘制对象,这样可以更容易地进行操作。
您想要这种模块化的其他一些例子是