生成多边形的顶点

4

我正在尝试为OpenGL ES渲染器创建一个有用/通用的二维多边形类。 当我创建一个多边形时,我会给它几个参数:

Polygon(Vector3 centerpoint, int numVertices, float inPolySize)

接着,我尝试生成顶点。这是我遇到困难的地方。我需要确定顶点的数量,获取一个角度,找到该角度的x/y位置,并考虑大小,然后再根据位置进行偏移。

OpenGL使用大量的数据数组。没有像Vector3列表这样好用的东西。相反,它是由float[]数组组成的,第一个索引是X1,第二个是Y1,第三个是Z1,第四个是X2,以此类推...

final int XPOS = 0;
final int YPOS = 1;
final int ZPOS = 2;
int mvSize = 3; // (x, y, z);
float[] vertices = new float[mvSize * mNumVertices];
for (int verticeIndex = 0; verticeIndex < mNumVertices; verticeIndex++)
{
    double angle = 2 * verticeIndex * Math.PI / mNumVertices;
    vertices[mvSize * verticeIndex + XPOS] = (((float)Math.cos(angle)) * mPolygonSize) + mPosition.GetX();
    vertices[mvSize * verticeIndex + YPOS] = (((float)Math.sin(angle)) * mPolygonSize) + mPosition.GetY();
    vertices[mvSize * verticeIndex + ZPOS] = mPolygonSize + mPosition.GetZ();
}

很遗憾,我的三角形从来都不是完美的。它倾斜了很多,尺寸似乎也不对...

我猜我把尺寸放到了错误的公式中,有人可以帮忙吗?

编辑: 这里有一些样本数据 Polygon test = new Polygon( new Vector3(0, 1, 0), 3, .5f);

vertices[0] = -0.25

vertices[1] = 1.4330127

vertices[2] = 0.0

vertices[3] = -0.25

vertices[4] = 0.5669873

vertices[5] = 0.0

vertices[6] = 0.5

vertices[7] = 1.0

vertices[8] = 0.0

vertices[9] = -0.25

vertices[10] = 1.4330127

vertices[11] = 0.0


1
你能够运行你的算法,将结果数组打印出来,然后在这里发布吗? - Jamie
1
代码运行良好,但输出似乎与计算结果不符。例如,vertices[0]=Math.cos(0)*0.5f+0.0f=1.0f*0.5f=0.5f。(尽管代码只是将构造函数参数存储在字段中...) - Stefan Hanke
@StefanHanke 我省略了一堆代码,包括第一组点实际上是中心点的事实,这是为了绘制填充圆。那确实是一个错误,我已经修复了,非常感谢!在继续找出错误之前,我想大大简化我的代码以符合问题。 - MintyAnt
2个回答

1
我简直不敢相信我这么愚蠢。基本上,我的渲染窗口比屏幕小。如果我的屏幕是一个矩形,那么我的渲染窗口就是一个正方形。
因此,我画的任何朝上的三角形都被我的渲染窗口剪裁了。对我来说,它看起来像是三角形被扭曲了。实际上,它只是被剪裁了!

0
Java数学库以弧度为输入,而不是角度。我没有看到您在计算中使用的角度,但如果您没有将角度从度转换为弧度,您将得到一些看起来有偏差的形状,并且这可以解释您的计算是正确的,但预期结果不准确。

我已经有一段时间没有处理这个了,我很抱歉。令人惊讶的是,这个Java OpenGL ES库接受以度数为单位的代码。看看这个链接:http://www.manpagez.com/man/3/glRotatef/。OpenGL为什么会接受旋转角度不是弧度的单位,这让我感到困惑。 - MintyAnt
哈哈哈,哇,这很奇怪。特别是考虑到我能想到的大多数其他库都使用弧度。 - Scuba Steve
嗯,虽然我现在想起来了,即使你使用的GL库采用角度制,Java Math库也采用弧度制(我可以看到你正在调用Math.sin和Math.cos)。因此,如果你需要来回转换,你需要将角度转换为弧度。 - Scuba Steve

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