2015-07-24 2 views
0

Я пытаюсь нарисовать простой чертеж, соединяющий несколько вершин в OpenGL ES. Тем не менее, линия рисуется инвертированной или в другом положении, откуда она должна быть нарисована. Я приложил класс для рисования линий подЛинейный чертеж, обращенный в OpenGL ES

ConnectingPath.java 
-------------------- 

public class ConnectingPath { 

int positionBufferId; 

PointF[] verticesList; 
public float vertices[]; 
public FloatBuffer vertexBuffer; 

public ConnectingPath(LinkedList<PointF> verticesList, float[] colors) 
{ 
    List<PointF> tempCorners = verticesList; 

    int i = 0; 
    this.verticesList = new PointF[tempCorners.size()]; 
    for (PointF corner : tempCorners) { 
     this.verticesList[i++] = corner; 
    } 

} 

public float[] getTransformedVertices() 
{ 
    float z; 
    List<Float> finalVertices = new ArrayList<Float>(); 

    finalVertices.clear(); 
    for(PointF point : verticesList){ 
     finalVertices.add(point.x); 
     finalVertices.add(point.y); 
     finalVertices.add(0.0f); 
    } 

    int i = 0; 
    float[] verticesArray = new float[finalVertices.size()]; 
    for (Float f : finalVertices) { 
     verticesArray[i++] = (f != null ? f : Float.NaN); 
    } 
    return verticesArray; 
} 

public void initBooth(){ 
    vertices = this.getTransformedVertices(); 

    for(Float f : vertices){ 
     Log.d("Mapsv3--", f + ""); 
    } 

    ByteBuffer bb = ByteBuffer.allocateDirect(vertices.length * 4); 
    bb.order(ByteOrder.nativeOrder()); 
    vertexBuffer = bb.asFloatBuffer(); 
    vertexBuffer.put(vertices); 
    vertexBuffer.position(0); 

    int[] buffers = new int[1]; 
    GLES11.glGenBuffers(1, buffers, 0); 
    GLES11.glBindBuffer(GLES11.GL_ARRAY_BUFFER, buffers[0]); 
    GLES11.glBufferData(GLES11.GL_ARRAY_BUFFER, 4 * vertices.length, vertexBuffer, GLES11.GL_STATIC_DRAW); 
    positionBufferId = buffers[0]; 
} 

public void Render(GL10 gl){ 
    GLES11.glPushMatrix(); 
    GLES11.glBindBuffer(GLES11.GL_ARRAY_BUFFER, positionBufferId); 
    GLES11.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    GLES11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0); 
    GLES11.glBindBuffer(GLES11.GL_ARRAY_BUFFER, 0); 
    GLES11.glFrontFace(GL10.GL_CW); 
    GLES11.glLineWidth(10.0f); 
    GLES11.glColor4f(0.0f,0.0f,0.0f,1.0f); 
    GLES11.glDrawArrays(GL10.GL_LINE_STRIP, 0, verticesList.length); 
    GLES11.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    GLES11.glPopMatrix(); 
    } 
} 

рисования Код:

Renderer.java 
-------------- 

// Variables here 


public void onSurfaceChanged(GL10 gl, int width, int height) { 
    viewWidth = width; 
    viewHeight = height; 
} 

public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    gl.glEnable(GL10.GL_TEXTURE_2D);   //Enable Texture Mapping 
    gl.glShadeModel(GL10.GL_SMOOTH);   //Enable Smooth Shading 
    gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //Grey Background 
    gl.glClearDepthf(1.0f);      //Depth Buffer Setup 
    gl.glEnable(GL10.GL_DEPTH_TEST);   //Enables Depth Testing 
    gl.glDepthFunc(GL10.GL_LEQUAL);    
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
} 

public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluOrtho2D(gl, -viewWidth/2, viewWidth/2, -viewHeight/2,viewHeight/2); 
    gl.glTranslatef(center.x,center.y,0); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    gl.glTranslatef(0,0, 0); 
    gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
    gl.glEnable(GL10.GL_CULL_FACE); 
    gl.glCullFace(GL10.GL_FRONT); 

    if(connectingPath!=null){ 
     connectingPath.Render(gl); 
    } 

    gl.glDisable(GL10.GL_CULL_FACE); 
    gl.glLoadIdentity(); 
} 

Скриншот:

Screenshot of the Path drawn inverted

+1

Вы пробовали отрицать значения Y? – starhacker

+0

Нет ... но это будет неправильно? – Parithi

+0

Где вы предполагаете начало координат (0,0)? В OpenGL это нижний левый угол – BDL

ответ

0

Розыгрыш в OpenGL, кажется, перевернутый для вас из-за на то, как OpenGL определяет его координаты экрана. В отличие от большинства API 2D рисования, начало координат расположено в нижнем левом углу, что означает, что значения оси y увеличиваются при движении вверх. Очень хорошее объяснение доступно в OpenGL common pitfalls (Number 12):

Учитывая лист бумаги, люди пишут с верхней части страницы на дно. Происхождение для ввода текста находится в верхнем левом краю страницы (по крайней мере, на европейских языках). Однако, если бы вы попросили любого достойного математика-студента нарисовать несколько точек на графике X-Y, происхождение, несомненно, было бы в нижнем левом углу графика. Большинство API 2D-рендеринга имитируют авторов и используют 2D-систему координат, где начало координат находится в верхнем левом углу экрана или окна (по крайней мере, по умолчанию). С другой стороны, API-интерфейсы 3D-рендеринга принимают математически согласованное соглашение и предполагают более низкое левое начало координат для своих трехмерных систем координат.