如何自动生成具有3到16个顶点的统一原始网格?

时间:2019-02-10 16:11:29

标签: c# unity3d mesh

目前我为自己生成网格(3、4、5个顶点),我正在寻找这些顶点并生成网格。

我的问题是我想生成这样的网格: https://en.wikipedia.org/wiki/Hexadecagon(及以下:15、14、13 ..个顶点) 而且我不想单手这样做。有没有办法或技巧,如何用代码做到这一点?我使用了这个:https://github.com/CiaccoDavide/Unity-UI-Polygon,但是我无法添加碰撞器并获得在那里生成的实际网格物体。

1 个答案:

答案 0 :(得分:1)

您要将点拟合到一个单位圆上,然后根据需要缩放。

给定多个顶点> = 3,每个顶点之间的夹角为360 /(顶点数量)

例如,对于5个顶点,每个顶点必须相隔72度。

现在,对于每个顶点,起始角均为0度,x坐标是起始角的余弦,y坐标是起始角的正弦。在每个顶点之后,以上述计算的角度增加起始角度。

下面是一些Matlab代码,该代码演示了我对包含13个顶点的多边形的要求:

num_verts = 13;

angle = 360/num_verts;

vertices = zeros(num_verts+1,2); % extra vertex just to plot the complete polygon
for ii=1:num_verts
    vertices(ii,1) = cosd(angle*ii);
    vertices(ii,2) = sind(angle*ii);
end
vertices(end,:) = vertices(1,:);

figure;
plot(vertices(:,1),vertices(:,2))
axis equal;

以及生成的多边形: enter image description here

如果要对多边形引入一些随机性,可以将起始角度旋转一些随机量,或者将最终坐标乘以某个随机量。

例如,在这里,我创建了一个五边形,旋转并缩放了它。

num_verts = 5;

angle = 360/num_verts;

vertices = zeros(num_verts+1,2); % extra vertex just to plot the complete polygon
rand_angle_shift = 360*rand();
for ii=1:num_verts
    vertices(ii,1) = cosd(angle*ii + rand_angle_shift);
    vertices(ii,2) = sind(angle*ii + rand_angle_shift);
end
vertices(end,:) = vertices(1,:);
vertices = vertices * 20;

figure;
plot(vertices(:,1),vertices(:,2))
axis equal;

enter image description here

您甚至可以将每个顶点乘以随机数量,以获得新的奇异(但有效)的多边形:

num_verts = 6;

angle = 360/num_verts;

vertices = zeros(num_verts+1,2); % extra vertex just to plot the complete polygon
rand_angle_shift = 360*rand();
for ii=1:num_verts
    vertices(ii,1) = cosd(angle*ii + rand_angle_shift);
    vertices(ii,2) = sind(angle*ii + rand_angle_shift);
end
vertices = vertices .* rand(num_verts+1,2);
vertices(end,:) = vertices(1,:);

figure;
plot(vertices(:,1),vertices(:,2))
axis equal;

enter image description here