我有一个简单的opengl应用程序,可以显示任意3D模型。我想实现缩放。我现在使用glScale,并在某种程度上工作。但是,我有两个问题。
任何类型的缩放(+)都会快速到达对象边缘位于近剪裁平面内的点。现在,我的zNear是0.1,所以增加对象的比例会导致剪裁是有道理的。我想知道是否还有其他方法可以达到更好的效果。
当我放大时,物体会变暗。缩小,它变得更亮。我的光线位置在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);
我没有衰减设置,我认为需要启用衰减设置才能使光线受到距离的影响。无论如何,我不是要改变物体的距离,只是缩放它。确保面部的位置发生变化,但不是很明显。无论如何,我认为放大会使它变得更亮,而不是更暗。
这恰好是在Android平台上使用opengl-es 1.0,如果这是相关的。
任何帮助表示赞赏。
答案 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)。