gpt4 book ai didi

java - 缩放 3D 对象会产生奇怪的结果

转载 作者:行者123 更新时间:2023-12-01 11:10:15 24 4
gpt4 key购买 nike

我的场景中有两个对象 - 一个立方体和一个平面。我希望飞机更大,因为它代表地面。

当我加载模型文件时,两个对象都具有相同的宽度和深度。

这是我的 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.gluLookAt 在世界各地移动时,它们会相互关联地“移动”。有什么建议么?

最佳答案

首先,请确保在绘制每个对象时使用 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()

其次,您需要考虑当您应用缩放时,对象将围绕其枢轴缩放,枢轴位置取决于您创建网格的方式。

例如,对于您的平面和立方体,枢轴需要位于 (0,0,0),这意味着立方体和平面的所有顶点位置都需要相对于 (0,0, 0) 并且枢轴位于对象的“中心”。

如果枢轴不在对象的中心,那么当您像您一样以统一的方式缩放(每个轴上的比例相同)时,它会在某些轴上比其他轴上拉伸(stretch)得更多,并且您会得到奇怪的结果。

关于java - 缩放 3D 对象会产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32465334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com