绘制一个六边形

3
使用Firemonkey XE2,我可以使用TCube组件创建一个立方体地图,但现在我想要一个六边形地图。我没有找到任何选项来创建3D六边形形状。我认为你可以创建一个类似于TCubeTHex,但是我还没有做到这一点,甚至接近都不行。有人能提供一个完成这个任务的示例吗?
我需要的形状是六边形棱柱enter image description here

一个六边形不是一个三维形状,使用六边形图块创建一个三维“球形”形状并不真正可行。你是指要创建一个十二面体吗? - James Barrass
嗯,不再是一个六角柱体了 http://en.wikipedia.org/wiki/Uniform_prism - Glen Morse
给任何人一个更好的答案!我认为这些都不值得 500 声望分。 - Glen Morse
3个回答

4
我正在和你一样使用Delphi开发一个带有六边形地图的战略游戏。你所需要的对象在Delphi本身中已经存在,那就是TCylinder。你应该将SubdivisionAxes从12设置为6(对于此对象,默认值为12),这就是你所需要的全部了。
要实现您的地图,我建议您也查看此链接:http://www.redblobgames.com/grids/hexagons/.
祝你好运!

太好了!还有其他联系方式吗?很想看看你正在做什么。 - Glen Morse
@GlenMorse,你可以在我的个人资料中找到我的电子邮件。感谢您接受了这个答案 :) - Loghman
谢谢,我知道了。我很快会在这里给你发送一些东西。干杯 - Glen Morse

3
你需要从TCustomMesh派生并覆盖Render方法以传递你计算出的顶点。
从中心和半径开始,点如下所示。假设形状是平行于一个平面构建的,然后进行变换。以下创建了一个垂直六角柱体(我现在没有IDE和测试的方法!)。
ClearPoints();
prismEnd := -1;
while prismEnd < 2 do
begin
    Z := Center.Z + (prismEnd * length)
    angle = 0;
    AddPoint(0, 0, Z);
    while angle < 360 do
    begin
        X := Center.X + (radius * Cos(DegToRad(angle)));
        Y := Center.Y + (radius * Sin(DegToRad(angle)));
        AddPoint(X, Y, Z);
        Inc(angle, 60);
    end;
    Inc(prismEnd, 2);
end;

对于这6个值,TexCoords应该被创建。
Tex X   Tex Y 
1       0.5
0.75    1
0.25    1
0       0.5
0.25    0
0.75    0

您需要24个三角形来渲染此图形,根据绘制方法的不同,可能需要高达72个索引。

但这取决于您如何映射纹理。

我找到了这个链接,其中有继承和使用TCustomMesh的示例。

理论上,这应该提供了一个形状,例如:

enter image description here


@LURD,我好久没用Delphi了!我现在会修复它。 - James Barrass
@JamesBarrass 我要试一试,看看能否使用自定义网格让它工作起来...别走太远 :D - Glen Morse
@JamesBarrass 好的,到目前为止我已经复制了所有的TAnnulus内容,但在uses FMX.Materials中出现了错误。不确定它是否有其他名称或者我是否可以从其他地方下载它。无论如何,现在我可以创建THex = class(TAnnulus)了,对吗? - Glen Morse
你可以这样做,但很可能会替换掉大部分它的功能。TexCoords是DrawTriangles调用中VertexBuffer的一部分。你可以在BuildAnnulus函数中看到它们被赋值(对于你来说,这将成为一个BuildHex函数)。 - James Barrass
@JamesBarrass 感谢您的帮助,但我认为我需要一个带有完整示例的答案。因为我好像漏掉了什么。 - Glen Morse
显示剩余3条评论

1
你可以使用TMesh来创建您需要的任何形状。
使用Data属性来指定每个点的点、法线和纹理,以及绘制三角形的顺序。
您只需要预计算所需六边形形状的点和法线(我猜这可以在Google上找到,或者在专门的形状编辑器中创建)。

我在谷歌上找不到它们,而且对于这个3D领域还有些陌生。不确定如何计算这个。 - Glen Morse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接