物理引擎探究(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.效果
这次贴一个静态效果
这样一条直线就创建好了。
4.源码
下一篇更新
上一篇: MySql引擎
下一篇: Java实现稀疏矩阵的压缩