2013-03-29 51 views
0

我試圖在使用OpenGL ES 1.1的3D世界中繪製粒子(這是2D)。如何在三維世界中繪製2D對象

3D世界(不包括2D粒子)看起來是這樣的: 3D world without particles

當試圖繪製2D粒子在3D世界中,它看起來像這樣(請注意網格現在移動莫名其妙的底部左邊角落): 3D world attempted with particles

但是,我希望它直接在3D網格上繪製。關於如何實現這一目標的任何想法,或者爲什麼它移到左下角?

繼承人我的工作到目前爲止。

- (void)drawFrame 
{  
    [(EAGLView *)self.view setFramebuffer]; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

///////////// 3D Drawing the Grid floor 

    glDisable(GL_BLEND); 
    glDisable(GL_TEXTURE_2D); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 
    glDepthMask(GL_TRUE); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    static GLfloat z = 0; 
    gluLookAt(0, 5, -10, 0, 0, 0, 0, 1, 0); 
    z += 0.075f; 

    // Rotate the scene 
    glRotatef(angle, 0, 1, 0); 

    // Draw the Floor 
    glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
    glDisableClientState(GL_COLOR_ARRAY); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(3, GL_FLOAT, 0, zFloorVertices); 
    glDrawArrays(GL_LINES, 0, 42); 
    glVertexPointer(3, GL_FLOAT, 0, xFloorVertices); 
    glDrawArrays(GL_LINES, 0, 42); 

//////////// 2D drawing the particle system 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glOrthof(0.0f, 320.0f, 0.0f, 480.0f, -100.0f, 100.0f); 

    glDisable(GL_DEPTH_TEST); 
    glDisable(GL_CULL_FACE); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 

    [explosion1 update:UPDATE_INTERVAL]; 

    if (explosion1.active != YES) 
    { 
     explosion1.sourcePosition = Vector2fMake(200, 200); 
     explosion1.active = YES; 
     explosion1.duration = 1; 
     explosion1.sourcePositionVariance = Vector2fMake(0, rand() % 20); 
    } 

    [explosion1 renderParticles]; 

    [(EAGLView *)self.view presentFramebuffer]; 
} 

- (void)initOpenGLES1 
{ 
    // Set the clear color 
    glClearColor(0, 0, 0, 1.0f); 

    // Projection Matrix config 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    CGSize layerSize = self.view.layer.frame.size; 
    gluPerspective(45.0f, (GLfloat)layerSize.width/(GLfloat)layerSize.height, 0.1f, 750.0f); 

    // Modelview Matrix config 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    // This next line is not really needed as it is the default for OpenGL ES 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glDisable(GL_BLEND); 

    // Enable depth testing 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 
    glDepthMask(GL_TRUE); 
} 

回答

0

想通了,不得不重置gluPerspective的3D渲染。

// 3D 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

CGSize layerSize = self.view.layer.frame.size; 
gluPerspective(45.0f, (GLfloat)layerSize.width/(GLfloat)layerSize.height, 0.1f, 750.0f); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); //gets rid of any rotations, movement, or other changes to the virtual world and puts us back at the origin standing upright 

....