物理引擎探究(6)---直线

0.简介

我觉得新加一个物体没必要单独写一次,所以这是最后一次写新加的物体,后面再有新加入的就一笔带过了。

1.直线

直线,其实我用的是线段,目的是用来当做地面,或者是围墙。

看起来就是一个直线,其实有要添加好多代码,不只是直线自身的代码,还有关于直线显示的代码,组合物理直线和显示直线的类。

class Line :public Object
{
public:
	vec3 A, B;
	Line();
	Line(vec3 _A, vec3 _B, vec3 _P) :A(_A), B(_B) { position = _P; type = LINE; }
	~Line();
};

我后来为了能区分不同的物体,设置了枚举变量来代表物体类别。

enum OBJTYPE
{
	NOTHING,CIRCLE,LINE
};
class DrawLine:public DrawObject
{
public:
	DrawLine();
	vec3 A, B;
	virtual void draw(Mat& m) { line(m, Point(A.x+postition.x,A.y+postition.y), Point(B.x+postition.x,B.y+postition.y), Scalar(255, 0, 0), 2); }
	virtual void update(Object* obj) 
	{
		A = ((Line*)(obj))->A;
		B = ((Line*)(obj))->B;
		postition = ((Line*)(obj))->position;
	}
	~DrawLine();
};

这是绘制直线的代码,其余的就不多说了,没多少技术含量的。

2.封装显示物件和物理物件

这回我将显示对象和物理对象做了一个绑定封装,就是如下的效果。

class ILine : public IObject
{
public:
	Obj_Forces c;
	DrawLine lc;
	ILine();
	ILine(Obj_Forces _c, DrawLine _lc) :c(_c),lc(_lc){}
	void draw(Mat& m) { lc.draw(m); }
	void update() { lc.update(c.obj); }
	~ILine();
};

这样直接操作的对象数目就少了不少。

int main()
{
	Gravity G(vec3(0,0.1,0));//重力
	//Gravity G1(vec3(0, 0.0, 0));//重力
	Circle c(vec3(100,100,0),40);//圆圈
	Obj_Forces CG(&c);//力结合体
	CG.addForce(&G);
	world w;
	//创建一个实例圆圈
	DrawCircle dc(vec3(100, 100, 0), 40);
	ICircle icircle(CG,dc);

	//创建一个实例直线
	Line l(vec3(50,0,0),vec3(400,0,0),vec3(0,400,0));
	DrawLine dl;
	Obj_Forces LG(&l);
	ILine iline(LG,dl);

	w.put(icircle.c);
	w.put(iline.c);
	while (1)
	{
		Mat window = Mat::zeros(Size(512, 512), CV_8UC3);
		w.run();
		icircle.update();
		icircle.draw(window);
		iline.update();
		iline.draw(window);
		imshow("win", window);
		waitKey(1);
	}
	return 0;
}

3.效果

这次贴一个静态效果

直线

这样一条直线就创建好了。

4.源码

下一篇更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值