Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android opengles透视投影_Android_Animation_Opengl Es_Android Animation - Fatal编程技术网

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函数来创建偏心透视矩阵。你可以像这家伙一样自己创造它:。他在帖子中引用了矩阵背后的数学知识。