gpt4 book ai didi

java - OpenGL "zoom": object clipping and brightness

转载 作者:行者123 更新时间:2023-11-30 09:52:06 26 4
gpt4 key购买 nike

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

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

  2. 当我放大时,对象变暗。缩小,它变得更亮。我有一个大约 0、0、100 的灯光位置。我有一个非常简单的灯光,位置在 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);

我没有衰减设置,我认为需要启用衰减设置才能使光线受到距离的影响。无论如何,我不会改变对象的距离,只是缩放它。当然,面部的位置正在发生变化,但变化不大。无论如何,我认为放大会使它变得更亮,而不是更暗。

这恰好是在Android平台上使用opengl-es 1.0。

最佳答案

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

A light's position is transformed by the current ModelView matrix at the time the position is specified with a call to glLight*().

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

如果您真的想像相机上的变焦镜头那样“变焦”,那么您可以更改传递给 gluPerspective 的视野参数。这意味着您将获得扁平或夸张的透视效果,就像使用真实相机一样。

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

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

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

关于java - OpenGL "zoom": object clipping and brightness,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4372011/

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