物理引擎探究(5)---显示世界

倖福魔咒の 提交于 2020-01-31 06:35:43

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!