Android opengles透视投影
我很难理解Android opengles透视投影,android,animation,opengl-es,android-animation,Android,Animation,Opengl Es,Android Animation,我很难理解glFrustum和gluPerspective是如何工作的。我理解透视投影的概念,但函数的行为与我期望的不同。 例如,如果我这样设置平截头体 glFrustumf(0, 10, 0, 10, 1, 100) 在点处有一个矩形 0, 0, 1, 0, 10, 1, 10, 10, 1, 10, 0, 1 然后绘制矩形,其左半部分位于屏幕外。如果左半部分在屏幕外面,我希望垂直的那半部分也在屏幕外面。但这也没有发生 在我看到的任何例子中,投影矩阵的坐标都取为 g
glFrustum
和gluPerspective
是如何工作的。我理解透视投影的概念,但函数的行为与我期望的不同。
例如,如果我这样设置平截头体
glFrustumf(0, 10, 0, 10, 1, 100)
在点处有一个矩形
0, 0, 1,
0, 10, 1,
10, 10, 1,
10, 0, 1
然后绘制矩形,其左半部分位于屏幕外。如果左半部分在屏幕外面,我希望垂直的那半部分也在屏幕外面。但这也没有发生
在我看到的任何例子中,投影矩阵的坐标都取为
glFrustumf(-10, 10, -10, 10, 1, 100)
但无论哪种方式,显示的任何部分都应该取决于矩形的坐标,对吗
更新:这是我正在使用的代码
fb1.put(new float [] {
0, 0, -1,
0, 10, -1,
10, 10, -1,
10, 0, -1
});
fb2.put(new float [] {
0, 1,
0, 0,
1, 0,
1, 1
});
indices.put(new short[] {
0, 1, 2, 2, 3, 0
});
public void onDrawFrame(GL10 gl) {
gl.glViewport(0, 0, this.width, this.height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(0, 10, 0, 10, 1, 100);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fb1);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, fb2);
gl.glDrawElements(GL10.GL_TRIANGLES, indices.limit(),
GL10.GL_UNSIGNED_SHORT, indices);
}
第一个是我得到的,第二个是我想要得到的。我还注意到有一点图像是垂直剪裁的
使用非对称坐标定义视锥体,如
GLFRUSTOMF(0,10,0,10,1100)
并不意味着世界上对象的位置会有任何不同。因此,您可能应该坚持使用对称的glFrustumf(-1.0,1.0,-1.0,1.0,1100)
并通过修改MODELVIEW
矩阵来移动您的矩形。使用非对称坐标定义视锥体,如glFrustumf(0,10,10,1100)
并不意味着您在世界上对对象的定位会有任何不同。因此,您可能应该坚持使用对称的glFrustumf(-1.0,1.0,-1.0,1.0,1100)
并通过修改MODELVIEW
矩阵移动矩形。用左边缘在-5处绘制。。。你什么意思,-5
什么?像素?剪辑空间坐标?你怎么知道画的是什么坐标?这意味着什么:如果x被翻译,我希望y也是?你问的问题让我有些困惑。@Tim我是说物体坐标。我说,因为矩形的左半部分在屏幕外面。为什么它不在屏幕外垂直。我认为这对我来说没有太大意义,如果我理解正确的话,它应该是可见的。我看到的一个可能的问题是,您的矩形直接位于近平面上,因此您离被剪裁只有一个舍入误差。你能把它往后推一点以远离近平面(例如z=2)吗?如果你仍然有问题,你能链接一个糟糕渲染的屏幕截图,并显示你的完整绘图代码吗?根据我对你提供的内容的理解,你的代码看起来是正确的,所以我不确定你为什么会得到这个结果。您确定您的GL_MODELVIEW矩阵是identity吗?你确定你的OpenGL视图在安卓布局的屏幕上居中吗?左边缘在-5。。。你什么意思,-5
什么?像素?剪辑空间坐标?你怎么知道画的是什么坐标?这意味着什么:如果x被翻译,我希望y也是?你问的问题让我有些困惑。@Tim我是说物体坐标。我说,因为矩形的左半部分在屏幕外面。为什么它不在屏幕外垂直。我认为这对我来说没有太大意义,如果我理解正确的话,它应该是可见的。我看到的一个可能的问题是,您的矩形直接位于近平面上,因此您离被剪裁只有一个舍入误差。你能把它往后推一点以远离近平面(例如z=2)吗?如果你仍然有问题,你能链接一个糟糕渲染的屏幕截图,并显示你的完整绘图代码吗?根据我对你提供的内容的理解,你的代码看起来是正确的,所以我不确定你为什么会得到这个结果。您确定您的GL_MODELVIEW矩阵是identity吗?你确定你的OpenGL视图在android布局的屏幕上居中吗?我想让矩形的左下角点位于原点,这样我就可以旋转而不必前后平移。据我所知,没有内置的OpenGL函数来创建偏心透视矩阵。你可以像这家伙一样自己创造它:。他在他的帖子中引用了矩阵背后的数学。我想让矩形的左下角点位于原点,这样我就可以旋转而不必前后平移。据我所知,没有内置的OpenGL函数来创建偏心透视矩阵。你可以像这家伙一样自己创造它:。他在帖子中引用了矩阵背后的数学知识。