找出矩阵是否相交以进行剔除测试?

时间:2016-02-17 10:02:17

标签: android opengl-es opengl-es-2.0

我正在开发一款2D游戏,我无法使用旋转传感器旋转视图并在屏幕上查看不同的纹理。

我使用此方法散布所有纹理:

public void position(ShaderProgram program, float[] rotationMatrix , float[] projectionMatrix , float longitude , float latitude , float radius)
{
    this.radius = radius;
    viewMat = new float[MATRIX_SIZE];
    mvpMatrix = new float[MATRIX_SIZE];

    // correct coordinate system to fit landscape orientation
    SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, viewMat);

    //correct the axis so that the direction of Y axis is to the sky and Z is to the front
    Matrix.rotateM(viewMat, 0, -90f, 1f, 0f, 0f);

    // first rotation - longitude
    Matrix.rotateM(viewMat, 0, longitude, 0f, 1f, 0f);

    //second rotation - latitude
    Matrix.rotateM(viewMat, 0, latitude, 1f, 0f, 0f);

    // used to control the distance of viewing the texture (currently only z translation is used)
    Matrix.translateM(viewMat, 0 , 0f , 0f , radius);

    //multiply the adjusted view matrix with projection matrix
    Matrix.multiplyMM(mvpMatrix, 0, projectionMatrix, 0, viewMat, 0);

    //send mvp matrix to shader
    GLES20.glUniformMatrix4fv(program.getMatrixLocation(), 1, false, mvpMatrix, 0);
}

然而,当我渲染大量纹理时,帧速率变得非常迟缓。所以我考虑过使用剔除。

在为每个纹理设置不同的视图矩阵后,我应该如何执行剔除测试?

我的意思是,我如何比较表示我现在观看的矩阵与矩阵相交的矩阵是否代表每个纹理,以便我决定是否绘制它?

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,但每个方法都需要更多,只需要一个矩阵。矩阵(假设对象的中心位于0,0而不应用任何矩阵)将不会处理只能看到对象的一部分的情况。

您可以使用8个点(例如立方体)定义原始对象的边界。想象一下,如果你用与物体相同的矩阵绘制这8个点,那么点将出现在物体周围,这样他们就可以定义一个表面来装箱物体本身。

因此,这些点可以与您生成的矩阵(整个MVP矩阵)相乘,它将它们投影到坐标系的openGL可绘制部分。现在你只需要检查如果这些点中的任何一个在每个轴的[-1,1]内,那么你必须绘制对象。所以x,y和z必须介于-1和1之间。

更新

实际上,即使所有8个点都在这些坐标之外,也可能不会发生交叉。你需要一个合适的算法来找到两个形状的交集...