0.简介
都说万事开头难,前面的工作都是准备工作,到这这里才能看到一点点成果,这回我让世界里的内容显示出来。
1.显示
借助opencv,将之前的圆形显示出来,对于显示物体,也有一个类,作为显示对象,和计算的物理对象是分开的。
class DrawObject
{
public:
vec3 postition;
DrawObject();
DrawObject(vec3 pos) :postition(pos) {}
virtual void draw(Mat& m) {};
virtual void update(Object* obj) {}
~DrawObject();
};
有个父类,因为还有更多的形状等待编写。
下面就是圆形显示类。
class DrawCircle : public DrawObject
{
public:
float radius = 0;
DrawCircle();
DrawCircle(vec3 pos, float r) :DrawObject(pos), radius(r) {}
virtual void draw(Mat& m);
virtual void update(Object* obj);
~DrawCircle();
};
void DrawCircle::draw(Mat & m)
{
circle(m, Point(postition.x, postition.y), 40, Scalar(255, 0, 0), 1, 8);
}
void DrawCircle::update(Object* obj)
{
postition = obj->position;
}
主要是更新数据和显示函数需要多态,更新数据就是这个显示对象,例如这个圆形,它运动来源于与其绑定的物理对象的变化,当其对应的物理对象发生运动了,这个显示对象的对应位置信息也会更新,最后显示在屏幕上。这么做的原因就是将物理引擎和显示部分分隔开,降低耦合程度。
2.显示准备工作
主函数中进行显示操作,这里手动将显示对象和物理对象绑定在一起,目前就是看一下效果,后面会将其设计成一个对象。
int main()
{
Gravity G(vec3(0,0.1,0));
Circle c(vec3(100,100,0),40);
Obj_Force CG;
CG.obj = &c;
CG.addForce(&G);
world w;
w.put(CG);
DrawCircle dc(vec3(100, 100, 0), 40);
while (1)
{
Mat window = Mat::zeros(Size(512, 512), CV_8UC3);
w.run();
dc.draw(window);
dc.update(CG.obj);
imshow("win", window);
waitKey(1);
}
return 0;
}
3.效果
如你所见,一个圆圈落下去了。
4.代码
release 0.01
来源:CSDN
作者:ARTELE
链接:https://blog.csdn.net/ARTELE/article/details/104117016