我的Android代码存在问题,无法为其找到合理的解决方案。
我的代码通过Charles Loop实现细分。我有一个针对对象的所有边和面运行的半边数据结构。但所有这些都按计划运行。我的问题是显示点和与这些点的连接。我定义了我的顶点和我的索引来在我的Halfedge
类中绘制一个对象。在实现所有Halfedges之后,我想在进行任何细分之前绘制我的基础对象。
public HalfEdge()
{
Vector<Vector3f> vertices = new Vector<>();
int[] indices =
{
9, 10, 8,
12, 9, 11,
9, 1, 10,
10, 0, 8,
8, 3, 9,
12, 1, 9,
9, 3, 11,
11, 2, 12
};
vertices.add(new Vector3f(-0.5f, -0.5f, 0.5f));
vertices.add(new Vector3f(0.5f, -0.5f, 0.5f));
vertices.add(new Vector3f(0.5f, 0.5f, 0.5f));
vertices.add(new Vector3f(-0.5f, 0.5f, 0.5f));
vertices.add(new Vector3f(0.5f, -0.5f, -0.5f));
vertices.add(new Vector3f(-0.5f, -0.5f, -0.5f));
vertices.add(new Vector3f(-0.5f, 0.5f, -0.5f));
vertices.add(new Vector3f(0.5f, 0.5f, -0.5f));
vertices.add(new Vector3f(-0.5f, 0.0f, 0.5f));
vertices.add(new Vector3f(0.0f, 0.0f, 0.5f));
vertices.add(new Vector3f(0.0f, -0.5f, 0.5f));
vertices.add(new Vector3f(0.0f, 0.5f, 0.5f));
vertices.add(new Vector3f(0.5f, 0.0f, 0.5f));
vertices.add(new Vector3f(0.5f, 0.0f, 0.0f));
vertices.add(new Vector3f(0.5f, -0.5f, 0.0f));
vertices.add(new Vector3f(0.5f, 0.5f, 0.0f));
vertices.add(new Vector3f(0.5f, 0.0f, -0.5f));
vertices.add(new Vector3f(0.0f, 0.0f, -0.5f));
vertices.add(new Vector3f(0.0f, -0.5f, -0.5f));
vertices.add(new Vector3f(0.0f, 0.5f, -0.5f));
vertices.add(new Vector3f(-0.5f, 0.0f, -0.5f));
vertices.add(new Vector3f(-0.5f, 0.0f, 0.0f));
vertices.add(new Vector3f(-0.5f, -0.5f, 0.0f));
vertices.add(new Vector3f(-0.5f, 0.5f, 0.0f));
vertices.add(new Vector3f(0.0f, 0.5f, 0.0f));
vertices.add(new Vector3f(0.0f, -0.5f, 0.0f));
initHEDS(vertices,indices);
updateMesh();
}
这是立方体正面的一个例子。 updateMesh()正在填充我的Vertex-和IndexBuffer。
public float[] getVertices()
{
float[] floatVertex = new float[v.size() * 3];
for(int i = 0; i < v.size(); i++)
{
floatVertex[i*3] = v.elementAt(i).xyz.x;
floatVertex[i*3+1] = v.elementAt(i).xyz.y;
floatVertex[i*3+2] = v.elementAt(i).xyz.z;
}
return floatVertex;
}
public short[] getOldIndices()
{
short[] shortIndex = new short[f.size() * 3];
int count = 0;
for(int j = 0; j < f.size(); j++)
{
Edge indexer = f.elementAt(j).edge.previous;
Edge temp;
if(indexer.vertex.interpolated == true)
{
indexer = indexer.previous;
temp = indexer;
}
else
{
temp = indexer;
}
do {
shortIndex[count] = (short)v.indexOf(temp.vertex);
count++;
temp = temp.next;
if(temp.vertex.interpolated == true)
{
temp = temp.next;
}
}while(temp != indexer);
}
return shortIndex;
}
但这非常重要,因为结果是正确的,并且两个缓冲区都获得了正确的顶点/指数。
protected void setVertices(float[] vertices)
{
ByteBuffer vb = ByteBuffer.allocateDirect(vertices.length * 4);
vb.order(ByteOrder.nativeOrder());
vertexBuffer = vb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
vertCount = vertices.length;
}
protected void setIndices(short[] indices)
{
ByteBuffer ib = ByteBuffer.allocateDirect(indices.length * 2);
ib.order(ByteOrder.nativeOrder());
indexBuffer = ib.asShortBuffer();
indexBuffer.put(indices);
indexBuffer.position(0);
indexCount = indices.length;
}
问题是我现在画了8张脸。问题是只有7/8正确显示,最后一个面不会绘制最后一个连接。由于我使用GL_LINE_LOOP
,因此第一个和最后一个索引将在最后连接。但这并没有发生。经过数小时的工作后,我无法向自己解释这一点。
这是我的Draw方法:
public void draw(GL10 gl)
{
gl.glEnable(GL10.GL_CULL_FACE);
gl.glCullFace(GL10.GL_BACK);
gl.glFrontFace(GL10.GL_CW);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);
gl.glColor4f(1.0f,1.0f,1.0f,1.0f);
if( colorBuffer != null)
{
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
}
gl.glDrawElements(GL10.GL_LINE_LOOP, indexCount , GL10.GL_UNSIGNED_SHORT, indexBuffer);
gl.glEnable(GL10.GL_POINT_SMOOTH);
gl.glPointSize(30.0f);
gl.glColor4f(0.0f,1.0f,0.0f,1.0f);
gl.glDrawArrays(GL10.GL_POINTS, 0 ,vertCount / 3);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
如果有人能向我解释这一点会很酷。为什么没有绘制最后一个连接?!如果这是固定的,我的显示将适用于所有Loop-Subdivision步骤。 以下是一些显示实际问题的屏幕截图:
http://i.imgur.com/pBsIrHk.png
您可以看到我的立方体的正面和顶点的索引。
http://i.imgur.com/ztlH9qu.png
在这里,您可以看到迭代中最后一个面未连接的问题。
我希望有人可以帮助我! :)如果你们有问题等我可以更新这个帖子。