开发者

How can i draw a cylinder in OpenGL-es on Android?

开发者 https://www.devze.com 2023-04-03 10:57 出处:网络
Can any one help me to draw a cylinder in OpenGL-es android. Whatever i draw its look like a rectangle.

Can any one help me to draw a cylinder in OpenGL-es android. Whatever i draw its look like a rectangle.

I would appreciate any tips or link.

Here is the code i've tried:

  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]);
        开发者_如何学JAVA_vertexBuffer.put(coords[i + 2]);
        theta += Math.PI / 90;
      }


This will only draw a circle. A cylinder is more complicated as you will need to define vertices in a translated z plane. And define them with correct normals (either facing in as if you were inside the cylinder -ie a tunnel or out as in looking at a pipe) which is the trickier part.

I'm currently doing this now (which is what brought me here) and have the cylinder drawn but pretty sure my normals are incorrect as my lighting looks a bit off. I'll post some code when I figure it out.

Edit : realized the code also doesn't actually draw a circle. Here is how to do that (in 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

//note may need to redefine the original vertex to complete the circle depending on which GL draw type you are using. If so just take the arg to sin / cos to be 0 to complete the loop

Last Edit* : just realized I was overcomplicating the normals by re-using some calculate normal from triangle code I had. Instead I realized how simple the normal calculation is for a cylinder if you consider the the origin 0,0 to be the center of each circular strip. The normal will be = vertex position scaled to length 1. for normals facing in on a cylinder (ie tunnel) the x,y values would be inverted (this is a assuming you are looking down the -z axis).

0

上一篇:

:下一篇

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号