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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值