本人目前的工作是系统能够根据给出的点集构造凸多面体,然后进行碰撞检测
1、本人查询网上的资料
https://www.ilovematlab.cn/thread-469922-1-1.html
这个链接给的是一个的例子,非常好的一个例子(我也是借鉴这个例子)
此外,我想说明,我的是一个长方体,我希望对其进行一定的边缘曲面化,所以,我想到的一个简单的方案就是通过将我他原来的长方体进行平移扩充,然后将所得到的点集进行求并,然后采用上面给出的方法得到我们最终想要的凸体的点集,以及f,然后通过patch 得到我们最终想要的图形
2、我的过程
step1 首先计算出顶点集
a.给出长方体的的参数
figure
couch.L_Couch=2000;
couch.W_Couch=600;
couch.H_Couch=200;
x_Couch=0;
y_Couch=0;
z_Couch=0;
Vertices1=[ x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
];
step2 将所得到的顶点集进行x 方向 y方向 z方向的前后的移动 然后得到6组新的长方体的顶点,然后将其求并集,具体的代码如下所示:(应注意Arc_r_distance这个参数的作用是前后左右平移的距离)
Arc_r_distance=100;
x_Couch=Arc_r_distance;
y_Couch=0;
z_Couch=0;
Vertices2=[ x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
];
x_Couch=-Arc_r_distance;
y_Couch=0;
z_Couch=0;
Vertices3=[ x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
];
x_Couch=0;
y_Couch=Arc_r_distance;
z_Couch=0;
Vertices4=[ x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
];
x_Couch=0;
y_Couch=-Arc_r_distance;
z_Couch=0;
Vertices5=[ x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
];
x_Couch=0;
y_Couch=0;
z_Couch=Arc_r_distance;
Vertices6=[ x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
];
x_Couch=0;
y_Couch=0;
z_Couch=-Arc_r_distance;
Vertices7=[ x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
];
NewVertices=[Vertices2;Vertices3;Vertices4;Vertices5;Vertices6;Vertices7]
step3 使用我的文章的开头给出的计算凸体的顶点和面的方法。
Vertices=NewVertices
x1=Vertices(:,1);
y1=Vertices(:,2);
z1=Vertices(:,3);
shp=alphaShape(x1,y1,z1,4000); % MATLAB R2014b 引入的函数
[F2,V2]=boundaryFacets(shp); % MATLAB R2014b 引入的函数
如上面的代码。最终得到的F2 V2 就是我们的目标的参数,然后通过patch得到图形
step4 通过Patch 函数进行显示
S2.Vertices = V2 %进行位置刷新操作
S2.Faces = F2;
S2.FaceVertexCData = jet(size(V2,1));%V2表示顶点的数量
S2.FaceColor = 'interp';
S2Obj = patch(S2); %将s2构成一个结构体
hold off
axis equal
axis([-3000 3000 -3000 3000 -3000 3000])
%axis([-1200 1200 -1200 1200 -1200 1200])
rotate3d on;
step5 最终得到的图形如下图所示