我正在尝试使用OpenGL ES 1.1在我的3D世界中绘制粒子(在2D中)。
3D世界(没有2D粒子)看起来像这样: 3D world without particles
当试图在3D世界中绘制2D粒子时,它看起来像这样(注意网格现在以某种方式移动到左下角): 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 :(得分:0)
想出来,不得不重置3D渲染的gluPerspective。
// 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
....