Android 三维模拟:设置平截头体、视口、摄影机等

Android 三维模拟:设置平截头体、视口、摄影机等,android,math,matrix,opengl-es,3d,Android,Math,Matrix,Opengl Es,3d,学习OpenGLES2.0,使用java(适用于Android) 目前,我正在使用以下工具设置视口、ViewMatrix和平截头体并进行转换: GLES20.glViewport(0, 0, width, height) // max, full screen Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ); Matrix.frustumM

学习OpenGLES2.0,使用java(适用于Android)

目前,我正在使用以下工具设置视口、ViewMatrix和平截头体并进行转换:

GLES20.glViewport(0, 0, width, height)  // max, full screen

Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY,
            lookZ, upX, upY, upZ);

Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);

Matrix.translateM(mModelMatrix,  0,  x,  y,  z);
以下是我想做的:

简而言之,我希望尽可能真实地显示对象,在设备屏幕上投影时,根据对象的位置和形状显示对象。(在这个阶段,我不关心纹理、灯光等)

问题:

假设我想显示一个立方体(每边4英寸长),就好像它漂浮在一个10英寸平板电脑的显示屏后面20英寸,我正拿着这个平板电脑,离我的眼睛有16英寸远。视线是开着的(沿着)z轴垂直穿过平板电脑显示屏的中心,立方体的中心位于z轴上

我应该传递给上述两个函数的参数的正确值是什么,以设置ViewMatrix和Frustum来模拟上述情况

如果不使用缩放,将在模型空间中以(0,0,0)为中心定义的立方体边的值(长度)是多少

最后,我应该传递给上面的translate函数的z值是多少,这样立方体看起来就在显示屏后面20英寸


我需要设置其他的吗?

让我们一步一步地完成这个过程。首先,使用
inch
作为世界空间单位是有意义的。这样,您就不必在单位之间转换

让我们从投影开始。如果您只希望平板电脑后面的对象可见,那么您可以将
znear
设置为16。
zfar
可以任意选择(取决于场景)

接下来,我们需要垂直视野。如果平板电脑的屏幕高度为
h英寸
(这可以通过纵横比和对角线长度计算得出。如果需要此计算,请留下注释),
fovy
可以按如下方式计算:

float fovy = 2 * atan(h / 2 / 16); //screen is 16 inches away
//needs to be converted to degrees
Matrix.perspectiveM(mProjectionMatrix, 0, fovy * 180.0f / PI, aspect, znear, zfar);
这已经是最困难的部分了

让我们继续查看视图矩阵。如果您的相机未与世界坐标系对齐,则使用视图矩阵。现在这取决于您希望如何设置世界坐标系。如果您希望眼睛作为原点,则根本不需要视图矩阵。我们还可以将显示指定为原点,如下所示:

//looking from 16 inches in front of the tablet to the origin
Matrix.setLookAtM(mViewMatrix, 0, 0, 0, 16, 0, 0, 0, 0, 1, 0);
定位立方体也同样容易。如果希望其边长为4英寸,则制作边长为4英寸的立方体。如果希望其中心位于屏幕后面20英寸,则将其平移此量(假设上面的视图矩阵):


Nio Shertler,谢谢你的回答。你的解决方案看起来很有希望。我实现了你在我的程序中写的东西,如果我将“setLookAtM”参数更改为Matrix,立方体就会出现。setLookAtM(mViewMatrix,0,0,0,-16,0,0,0,0,0,1,0)。16应该是-16吗”“奇怪。您是否已将多维数据集定位在
-20
?上述方法创建了一个右手坐标系,其中z轴通常指向相机。是的,我看到了一个立方体。以下是参数I传入的方法:Matrix.setLookAtM(mViewMatrix,0,0,0,0,0,-16,0,1,0);续。透视矩阵(mProjectionMatrix,0,(float)(fovy*180.0f/Math.PI),纵横比,16100);矩阵.translateM(mModelMatrix,0,0.0f,0.0f,-20.0f);您以不同的方式定义了视图矩阵。您的外观从
(0,0,0)
(0,0,-16)
;我的视图从
(0,0,16)
(0,0,0)
Matrix.translateM(mModelMatrix,  0,  0,  0,  -20);