OpenGL ES 1.0 Android - 绘制更多高级形状

时间:2014-05-02 15:52:20

标签: android opengl-es

所以,我正在尝试学习OpenGL ES for Android,作为我正在进行移动编程课程的项目的一部分。我想做一个快速的基本3D游戏,用户旋转“枪”,并在一定的时间限制内射击目标。我遇到的问题是设计我的Target形状。

我希望目标形状是基本的钻石宝石形状。 我已经阅读了android开发人员指南,用于绘制金字塔/立方体,其顶点和索引描述了要绘制的形状矢量和面部,但是我在获得所需形状时遇到了很多麻烦。

这是我的目标的顶点和指数

float[] vertices = 
{ 
    -1.0f, -1.0f, -1.0f, //0. Back Right
    1.0f, -1.0f, -1.0f, // 1. Back Left
    0.0f, 1.0f, 0.0f, // 2. Top
    -1.0f, -1.0f, 1.0f, //3. Front Right
    1.0f, -1.0f, 1.0f, // 4. Front Left
    0.0f, -2.0f, 1.0f //5. Bottom
};
byte[] indices = 
{ 
    3, 2, 4, 4, 5, 3, //draw front face
    0, 2, 4, 5, 4, 0, // draw right face
    1, 0, 5, 2, 0, 1, // draw back face
    3, 1, 2, 5, 1, 3 // draw left
}; // end byte[] indices

在索引中,我试图绘制顶面而不是底面,并以逆时针方式环绕我的形状,从前面开始并向右移动,向后移动,然后分别向左移动。然而,凭借这一点,我得到了一个看起来像旧星际福克斯船的形状。我之前寻求过帮助,但是找不到任何帮助我的东西,无论是通过我的理解还是关于着色器或纹理的类似问题。

我想我的问题是你如何正确地将图纸用于这样的形状?我尝试了许多反时钟明智的尝试,这些尝试总是让我看到最怪异的形状。我不认为我完全理解如何按顺序绘制指数。我会发布一些照片,但我是Stackoverflow的新手>。>

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你的指数看起来有些混乱。基于我的草图,您主要在索引数组中交换顶点3和4。你可以说它不是很正确,因为顶点3被评论"前右"但它没有显示在"右面"下的索引中。相反,顶点4.大多数三角形是顺时针方向。

这些评论有些误导。 x轴通常从左向右绘制。您的顶点带有标记为"右侧"的负x坐标,带有标记为"左侧"的正x坐标的顶点,这看起来很不寻常。

我想知道你是否可能使用左手坐标系来定义,这可以解释上面的大部分内容。确保始终使用右手坐标系,并从对象外部查看绕线顺序。

您的意思是将顶点5放在正方形的中心下方,还是有意义的y偏移?我将它移到下面代码的中心位置,但您可以将其移动到您拥有它的位置而不更改拓扑。

根据我的论文草图,正确的版本看起来像这样(未经测试):

float[] vertices = 
{ 
    -1.0f, -1.0f, -1.0f, //0. Back Left
    1.0f, -1.0f, -1.0f, // 1. Back Right
    0.0f, 1.0f, 0.0f, // 2. Top
    -1.0f, -1.0f, 1.0f, //3. Front Left
    1.0f, -1.0f, 1.0f, // 4. Front Right
    0.0f, -2.0f, 0.0f //5. Bottom
};
byte[] indices = 
{ 
    3, 4, 2, 4, 3, 5, //draw front face
    0, 3, 2, 5, 3, 0, // draw left face
    1, 5, 0, 2, 1, 0, // draw back face
    4, 1, 2, 5, 1, 4 // draw right
};