欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-04 20:06:25
...

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.效果

这次贴一个静态效果

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

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

4.源码

下一篇更新

相关标签: 物理引擎