Java opengl";zoom";:对象剪裁和亮度

Java opengl";zoom";:对象剪裁和亮度,java,android,opengl-es,Java,Android,Opengl Es,我有一个简单的opengl应用程序,可以显示任意的3D模型。我想实现缩放。我现在使用的是glScale,并且在一定程度上有效。然而,我有两个问题 任何类型的缩放(+)都会快速到达对象边位于近剪裁平面内的点。现在,我的zNear类似于0.1,因此增加对象的比例将导致剪切是有意义的。我想知道是否还有其他方法可以达到更好的效果 当我放大时,对象变得更暗。缩小,它会变得更亮。我有一个光的位置在0,0,100左右。我有非常简单的照明定位在0,0100,只使用漫反射 gl.glEnable(GL10.GL_

我有一个简单的opengl应用程序,可以显示任意的3D模型。我想实现缩放。我现在使用的是glScale,并且在一定程度上有效。然而,我有两个问题

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

  • 当我放大时,对象变得更暗。缩小,它会变得更亮。我有一个光的位置在0,0,100左右。我有非常简单的照明定位在0,0100,只使用漫反射

    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);
    
  • 我没有衰减设置,我认为需要启用衰减设置才能使灯光受到距离的影响。无论如何,我不会改变对象的距离,只是缩放它。确保面的位置正在更改,但不会显著更改。无论如何,我认为放大会使它变得更亮,而不是更暗

    如果相关的话,这恰好是在android平台上使用opengl es 1.0


    感谢您的帮助

    缩放将改变对象的照明方式,因为法线也会被缩放(正如您在自己的回答中指出的,可以通过调用
    glEnable(GL\u NORMALIZE)
    强制进行缩放)。请注意,根据指定的时间,灯光本身可能没有等效的变换:

    通过调用glLight*()指定位置时,灯光的位置由当前模型视图矩阵进行变换

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

    如果您真的想像照相机上的变焦镜头那样“变焦”,那么您可以将传入的视野参数更改为
    glupperspective
    。这将意味着你有平坦或夸张的透视效果,就像你使用真实的相机一样

    典型应用程序通常希望更改相机相对于对象的位置。最简单的方法是使用
    gluLookAt

    注意投影矩阵和模型视图矩阵之间的差异;应更改投影的透视图,而放置相机应影响模型视图。看

    注意。。。我刚刚意识到,您使用的OpenGL es可能不支持这些确切的功能;你应该能够很容易地找到如何获得相同的结果。

    对#2的部分回答是我没有缩放法线。换句话说,当对象缩放得更小时,先前规格化的法线值具有更大的(相对)幅值,从而导致面反射更多的光。。。反之亦然

    您可以设置一个参数

    glEnable(GL_NORMALIZE)
    
    它解决了这个问题,但牺牲了一些额外的计算。完整的故事就在这里,


    (参见#16)。

    我之前曾尝试缩放GLU.lookAt()眼Z参数。效果是什么,直到某个阈值,然后对象开始剪辑。物体的(表面)大小从未改变。如果你使用正交投影(或非常小的视场透视,倾向于相同的东西),就会发生这种情况。啊,我应该知道的。这就是我在深夜回答问题时发生的事情。我现在编辑我的答案。