如何在Android上的OpenGL-es中绘制圆柱体?

时间:2011-09-07 14:06:37

标签: android opengl-es draw

任何人都可以帮我在OpenGL-es android中绘制一个圆柱体。无论我画什么,它看起来像一个矩形。

我会很感激任何提示或链接。

以下是我尝试的代码:

  int VERTICES=180; // more than needed
      float coords[] = new float[VERTICES * 3];
      float theta = 0;

      for (int i = 0; i < VERTICES * 3; i += 3) {
        coords[i + 0] = (float) Math.cos(theta);
        coords[i + 1] = (float) Math.sin(theta);
        coords[i + 2] = 0;
        _vertexBuffer.put(coords[i + 0]);
        _vertexBuffer.put(coords[i + 1]);
        _vertexBuffer.put(coords[i + 2]);
        theta += Math.PI / 90;
      }

2 个答案:

答案 0 :(得分:2)

看看OpenGL ES tutorial for Android(part V) ,它为您提供了逐步绘制圆柱体的教程。

简要地看一下你的代码,你似乎有两个问题:

1) cos sin 会产生0到1之间的值,所以你应该将它乘以某个半径

2)线: coords [i + 2] = 0; 意味着您可能正在绘制2D圆而不是3D圆柱

答案 1 :(得分:1)

这只画一个圆圈。圆柱体更复杂,因为您需要在平移的z平面中定义顶点。并用正确的法线定义它们(无论是面向汽缸内部还是面向隧道,或者像看管道一样),这是更棘手的部分。

我现在正在做这件事(这就是我带到这里的原因)并且已经绘制了圆柱体,但很确定我的法线是不正确的,因为我的灯光看起来有些偏差。我想出来的时候会发布一些代码。

编辑:意识到代码实际上并没有画圆圈。以下是如何做到这一点(2D):

R = Radius
NUM_VERTICES = Number of vertices you want to use in circle

delta = (Math.PI / 180) * (360 / NUM_VERTICES);  //get delta in radians between vertex definition

for i = 0 ; i < NUM_VERTICES ; i ++

    x = R * cos(Delta * i)
    y = R * sin(Delta * i))

    vertices[i] = x; vertices[i+1] = y; vertices[i+2] = 0;  
end for

//注意可能需要重新定义原始顶点以完成圆,具体取决于您使用的GL绘制类型。如果是这样,只需将arg与sin / cos设为0即可完成循环

Last Edit *:刚刚意识到我通过重复使用我所拥有的三角形代码的一些计算法线来使法线过于复杂化。相反,如果你认为原点0,0是每个圆形条带的中心,我就会意识到圆柱体的正常计算是多么简单。法线将=顶点位置缩放到长度1.对于面向圆柱体(即隧道)的法线,x,y值将被反转(这是假设您向下看-z轴)。