我在场景中有两个对象 - 一个立方体和一个平面。我希望飞机更大,因为它将代表地面。
当我加载模型文件时,我的两个对象都具有相同的宽度和深度。
这是我的onDrawFrame事件:
gl.glClear( GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT );
gl.glEnable( GL10.GL_CULL_FACE );
gl.glCullFace( GL10.GL_BACK );
gl.glFrontFace( GL10.GL_CCW );
gl.glLoadIdentity();
// draw the cube
gl.glTranslatef( 0.0f, 0.0f, 0.0f );
gl.glEnableClientState( GL10.GL_VERTEX_ARRAY );
gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, vertexBuffer );
gl.glDrawElements( GL10.GL_TRIANGLES, cubeIndices.length, GL10.GL_UNSIGNED_SHORT, indexBufferCube );
gl.glDisableClientState( GL10.GL_VERTEX_ARRAY );
// draw the plane
gl.glTranslatef( 0.0f, 0.0f, 0.0f );
gl.glEnableClientState( GL10.GL_VERTEX_ARRAY );
gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, vertexBufferPlane );
gl.glDrawElements( GL10.GL_TRIANGLES, planeIndices.length, GL10.GL_UNSIGNED_SHORT, indexBufferPlane );
gl.glDisableClientState( GL10.GL_VERTEX_ARRAY );
问题是当我试图缩放“飞机”时。并这样做:
// draw the cube
gl.glTranslatef( 0.0f, 0.0f, 0.0f );
gl.glEnableClientState( GL10.GL_VERTEX_ARRAY );
gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, vertexBuffer );
gl.glDrawElements( GL10.GL_TRIANGLES, cubeIndices.length, GL10.GL_UNSIGNED_SHORT, indexBufferCube );
gl.glDisableClientState( GL10.GL_VERTEX_ARRAY );
// draw the plane
gl.glTranslatef( 0.0f, 0.0f, 0.0f );
gl.glScalef( 2f, 2f, 2f ); // make the plane 2x bigger
gl.glEnableClientState( GL10.GL_VERTEX_ARRAY );
gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, vertexBufferPlane );
gl.glDrawElements( GL10.GL_TRIANGLES, planeIndices.length, GL10.GL_UNSIGNED_SHORT, indexBufferPlane );
gl.glDisableClientState( GL10.GL_VERTEX_ARRAY );
当导航场景时,我得到非常奇怪的结果,飞机和立方体以不同的速度移动,而不是同步。我是否滥用glScalef函数?
我所要做的就是制造飞机'模型巨大,立方体大小相同,当我使用GLU.gluLook在世界各地移动时,他们会移动'相互关联。有什么建议?
答案 0 :(得分:1)
首先,确保在绘制每个对象时使用gl.glPushMatrix()
和gl.glPopMatrix()
,否则一个对象的转换可能会与其他对象一起累积:
// draw the cube
gl.glPushMatrix();
{
gl.glTranslatef( 0.0f, 0.0f, 0.0f );
gl.glEnableClientState( GL10.GL_VERTEX_ARRAY );
gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, vertexBuffer );
gl.glDrawElements( GL10.GL_TRIANGLES, cubeIndices.length, GL10.GL_UNSIGNED_SHORT, indexBufferCube );
gl.glDisableClientState( GL10.GL_VERTEX_ARRAY );
}
gl.glPopMatrix()
// draw the plane
gl.glPushMatrix();
{
gl.glTranslatef( 0.0f, 0.0f, 0.0f );
gl.glScalef( 2f, 2f, 2f ); // make the plane 2x bigger
gl.glEnableClientState( GL10.GL_VERTEX_ARRAY );
gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, vertexBufferPlane );
gl.glDrawElements( GL10.GL_TRIANGLES, planeIndices.length, GL10.GL_UNSIGNED_SHORT, indexBufferPlane );
gl.glDisableClientState( GL10.GL_VERTEX_ARRAY );
}
gl.glPopMatrix()
其次,您需要考虑在应用比例时,对象将围绕其 pivot 进行缩放,枢轴位置取决于您创建网格的方式。
例如,对于您的平面和立方体,枢轴需要位于(0,0,0),这意味着立方体和平面的所有顶点位置都需要相对于(0,0, 0)并且枢轴位于"中心"对象。
如果枢轴不在物体的中心,那么当你以一种统一的方式进行缩放(每个轴上相同的比例)时,它会在某些轴上比其他轴更加拉伸,你会变得怪异结果