Iphone 你如何用开口画圆柱体?
你如何用开口画圆柱体 您需要通过对象加载来完成。不能使用Open GL ES调用三维形状基本体Iphone 你如何用开口画圆柱体?,iphone,opengl-es,Iphone,Opengl Es,你如何用开口画圆柱体 您需要通过对象加载来完成。不能使用Open GL ES调用三维形状基本体 看看JeffLamarche的博客,有很多关于如何在那里加载对象的非常好的资源 通过计算对象的几何图形,确实可以在OpenGL ES中绘制圆柱体。开源项目在其gluts_geometry.c源文件中有实体(圆柱体、球体等)的几何图形绘制例程。不幸的是,这些函数使用了glBegin()和glEnd()调用,这在OpenGL ES中是不存在的 OpenGL ES部分工作圆柱体实现的代码可以在论坛线程中找到
看看JeffLamarche的博客,有很多关于如何在那里加载对象的非常好的资源 通过计算对象的几何图形,确实可以在OpenGL ES中绘制圆柱体。开源项目在其gluts_geometry.c源文件中有实体(圆柱体、球体等)的几何图形绘制例程。不幸的是,这些函数使用了glBegin()和glEnd()调用,这在OpenGL ES中是不存在的
OpenGL ES部分工作圆柱体实现的代码可以在论坛线程中找到。第一步是编写绘制三角形的子例程。那就交给你了。然后画一系列三角形,组成圆柱体的形状。诀窍是用一个具有大量边(如64条边)的多边形近似一个圆。我脑子里有一些伪代码
for (i = 0; i < 64; i++)
{
angle = 360 * i / 63; // Or perhaps 2 * PI * i / 63
cx[i] = sin(angle);
cy[i] = cos(angle);
}
for (i = 0; i < 63; i++)
{
v0 = Vertex(cx[i], cy[i], 0);
v1 = Vertex(cx[i + 1], cy[i + 1], 0);
v2 = Vertex(cx[i], cy[i], 1);
v3 = Vertex(cx[i + 1], cy[i + 1], 1);
DrawTriangle(v0, v1, v2);
DrawTriangle(v1, v3, v2);
// If you have it: DrawQuad(v0, v1, v3, v2);
}
(i=0;i<64;i++)的
{
角度=360*i/63;//或者可能是2*PI*i/63
cx[i]=sin(角度);
cy[i]=cos(角);
}
对于(i=0;i<63;i++)
{
v0=顶点(cx[i],cy[i],0);
v1=顶点(cx[i+1],cy[i+1],0);
v2=顶点(cx[i],cy[i],1);
v3=顶点(cx[i+1],cy[i+1],1);
牵引三角(v0、v1、v2);
DrawTriangle(v1、v3、v2);
//如果有:DrawQuad(v0、v1、v3、v2);
}
代码中几乎肯定有错误。最有可能的是,我把三角形绘制中的缠绕顺序搞砸了,这样你就可以只看到一半的三角形,或者只看到背面的非常奇怪的情况
性能将很快要求您绘制三角形条带和风扇以提高效率,但这应该可以让您开始。您可以通过计算几何图形来按程序绘制圆柱体。不过,最重要的是,您应该使其支持,并且您还需要计算贴图坐标,可能还有法线。因此,从头开始需要一些思考
我已经在C#中为Unity3D创建了一个模块,它可以实现这一点,并允许您调整参数。你应该能够轻松地转换成C或C++,因为几何计算是无处不在的。观看以了解其内容并从中下载代码。我希望这可以帮助您,这是我在OpenGLES 2.0 for Android中对圆柱体的实现
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;
public class Cylinder {
public Cylinder(int n) {
this.numOfVertex = n;
float[] vertex = new float[3 * (n + 1) * 2];
byte[] baseIndex = new byte[n];
byte[] topIndex = new byte[n];
byte[] edgeIndex = new byte[n*2 + 2];
double perAngle = 2 * Math.PI / n;
for (int i = 0; i < n; i++) {
double angle = i * perAngle;
int offset = 6 * i;
vertex[offset + 0] = (float)(Math.cos(angle) * radious) + cx;
vertex[offset + 1] = -height;
vertex[offset + 2] = (float)(Math.sin(angle) * radious) + cy;
vertex[offset + 3] = (float)(Math.cos(angle) * radious) + cx;
vertex[offset + 4] = height;
vertex[offset + 5] = (float)(Math.sin(angle) * radious) + cy;
topIndex[i] = (byte)(2*i);
baseIndex[i] = (byte)(2*i +1);
edgeIndex[2*i + 1] = baseIndex[i];
edgeIndex[2*i] = topIndex[i];
}
edgeIndex[2*n] = topIndex[0];
edgeIndex[2*n+1] = baseIndex[0];
ByteBuffer vbb = ByteBuffer
.allocateDirect(vertex.length * 4)
.order(ByteOrder.nativeOrder());
mFVertexBuffer = vbb.asFloatBuffer();
mFVertexBuffer.put(vertex);
mFVertexBuffer.position(0);
normalBuffer = mFVertexBuffer;
mCircleBottom = ByteBuffer.allocateDirect(baseIndex.length);
mCircleBottom.put(baseIndex);
mCircleBottom.position(0);
mCircleTop = ByteBuffer.allocateDirect(topIndex.length);
mCircleTop.put(topIndex);
mCircleTop.position(0);
mEdge = ByteBuffer.allocateDirect(edgeIndex.length);
mEdge.put(edgeIndex);
mEdge.position(0);
}
public void draw(GL10 gl)
{
gl.glCullFace(GL10.GL_BACK);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFVertexBuffer);
gl.glNormalPointer(GL10.GL_FLOAT, 0, normalBuffer);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glPushMatrix();
gl.glColor4f(1f, 0, 0, 0);
gl.glDrawElements( GL10.GL_TRIANGLE_STRIP, numOfVertex * 2 + 2, GL10.GL_UNSIGNED_BYTE, mEdge);
gl.glPopMatrix();
gl.glPushMatrix();
gl.glColor4f(0.9f, 0, 0, 0);
gl.glDrawElements( GL10.GL_TRIANGLE_FAN, numOfVertex, GL10.GL_UNSIGNED_BYTE, mCircleTop);
gl.glPopMatrix();
gl.glPushMatrix();
gl.glTranslatef(0, 2*height, 0);
gl.glRotatef(-180, 1, 0, 0);
gl.glColor4f(0.9f,0, 0, 0);
gl.glDrawElements( GL10.GL_TRIANGLE_FAN, numOfVertex , GL10.GL_UNSIGNED_BYTE, mCircleBottom);
gl.glPopMatrix();
}
private FloatBuffer mFVertexBuffer;
private FloatBuffer normalBuffer;
private ByteBuffer mCircleBottom;
private ByteBuffer mCircleTop;
private ByteBuffer mEdge;
private int numOfVertex;
private int cx = 0;
private int cy = 0;
private int height = 1;
private float radious = 1;
}
导入java.nio.ByteBuffer;
导入java.nio.ByteOrder;
导入java.nio.FloatBuffer;
导入javax.microedition.khronos.opengles.GL10;
公营气瓶{
公共气瓶(国际北){
this.numoftext=n;
浮点[]顶点=新浮点[3*(n+1)*2];
byte[]baseIndex=新字节[n];
字节[]topIndex=新字节[n];
字节[]边索引=新字节[n*2+2];
双perAngle=2*Math.PI/n;
对于(int i=0;i
感谢您的回复。然而,有人告诉我,只要使用“四边形”,就可以在OpenGLES中绘制圆柱体。在这一点上,我想避免使用3d建模软件。有人能给出一个更具体的答案吗?四边形在OpenGL ES上是不可用的,因为它们是用来缩小软件包的。最简单的p