opengl“zoom”:对象剪切和亮度

时间:2010-12-06 23:25:03

标签: java android opengl-es

我有一个简单的opengl应用程序,可以显示任意3D模型。我想实现缩放。我现在使用glScale,并在某种程度上工作。但是,我有两个问题。

  1. 任何类型的缩放(+)都会快速到达对象边缘位于近剪裁平面内的点。现在,我的zNear是0.1,所以增加对象的比例会导致剪裁是有道理的。我想知道是否还有其他方法可以达到更好的效果。

  2. 当我放大时,物体会变暗。缩小,它变得更亮。我的光线位置在0,0,1附近。我的照明非常简单,位于0,0,100,仅使用漫反射。

    gl.glEnable(GL10.GL_LIGHTING);
    gl.glEnable(GL10.GL_LIGHT0);
    gl.glEnable(GL10.GL_COLOR_MATERIAL);
    
    
    float[] lights;
    
    
    lights = new float[] { 0f, 0f, 0f, 1f };
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lights, 0);
    lights = new float[] { 1f, 1f, 1f, 1f };
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lights, 0);
    lights = new float[] { 0f, 0f, 0f, 1f };
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, lights, 0);
    
    
    float matAmbient[] = { 0f, 0f, 0f, 1f };
    float matDiffuse[] = { 1f, 1f, 1f, 1f };
    float matSpecular[] = { 0f, 0f, 0f, 1f };
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, matAmbient, 0);
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, matDiffuse, 0);
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, matSpecular, 0);
    
    
    float lightPosition[] = { mesh.mid.vertex[X], mesh.mid.vertex[Y], 100f,
            1f };
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPosition, 0);
    
  3. 我没有衰减设置,我认为需要启用衰减设置才能使光线受到距离的影响。无论如何,我不是要改变物体的距离,只是缩放它。确保面部的位置发生变化,但不是很明显。无论如何,我认为放大会使它变得更亮,而不是更暗。

    这恰好是在Android平台上使用opengl-es 1.0,如果这是相关的。

    任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

缩放将改变对象点亮的方式,因为法线也会缩放(正如您在自己的答案中所指出的那样,可以强制调用glEnable(GL_NORMALIZE))。请注意,根据指定的时间,灯本身可能没有等效的转换: http://www.opengl.org/resources/faq/technical/lights.htm

  

当通过调用glLight *()指定位置时,当前ModelView矩阵会转换灯光的位置。

根据您想要的缩放效果类型,您可以通过不同方式实现缩放。

如果您真的希望“缩放”摄像机上的变焦镜头,那么您可以更改传入gluPerspective的视野参数。这意味着您可以使用平面或夸张的视角效果,就像使用真实相机一样。

典型应用程序更常用的是改变相机相对于物体的位置。最简单的方法是使用gluLookAt

注意投影和模型视图矩阵之间的区别;应该对投影进行改变视角,而定位相机应该影响模型视图。见http://www.sjbaker.org/steve/omniv/projection_abuse.html

nb ...我刚才意识到你正在使用的OpenGL-es可能不支持那些确切的功能;你应该能够很容易地找到如何获得相同的结果。

答案 1 :(得分:1)

#2的部分答案是我没有缩放我的法线。换句话说,当对象缩放较小时,先前标准化的正常值具有较大(相对)幅度,导致面反射更多光......反之亦然。

您可以设置参数

glEnable(GL_NORMALIZE)

它以一些额外的计算为代价解决了这个问题。完整的故事在这里, http://www.opengl.org/resources/features/KilgardTechniques/oglpitfall/

(见#16)。