当它在我的屏幕上呈现我身后的立方体时,如何修复我的正交投影数学?

问题描述 投票:0回答:0

在我的数学中,除了当我将相机旋转 180 度时,一切都正常,我可以看到我身后的所有积木。它似乎颠倒了控件,但它们实际上是起作用的,因为它仍在绘制块,就好像它们处于正确的位置一样,只是将它们显示在屏幕上。这是我用来计算正交投影的代码。

public double[][] draw() {
        double [][] rotationZ = new double [][]{
            {cos(angleZ), -sin(angleZ), 0},
            {sin(angleZ), cos(angleZ), 0},
            {0, 0, 1},
        };

        double [][] rotationX = new double [][]{
            {1, 0, 0},
            {0, cos(angleX), -sin(angleX)},
            {0, sin(angleX), cos(angleX)},
        };

        double [][] rotationY = new double [][]{
            {cos(angleY), 0, sin(angleY)},
            {0, 1, 0},
            {-sin(angleY), 0, cos(angleY)},
        };

        double[][] projected = new double[8][];
        for(int i = 0; i < points.size(); i ++) {
            double[] rotated = multiplyMatrices(rotationY, points.get(i).toMatrix());
            rotated = multiplyMatrices(rotationX, rotated);
            rotated = multiplyMatrices(rotationZ, rotated);
            double z = 1 / rotated[2];

            double[][] projection = new double[][]{
                    {z, 0, 0},
                    {0, z, 0},
                };

            double[] projected2d = multiplyMatrices(projection, rotated);

            projected2d = scaleMatrix(projected2d, 200);

            projected[i] = projected2d;
        }
        return(projected);
    }

这是我的矩阵乘法代码:

private double[][] multiplyMatrices(double A[][], double B[][])
{
    int row1 = A.length;
    int col1 = A[0].length;
    int row2 = B.length;
    int col2 = B[0].length;

    double C[][] = new double[row1][col2];

    for (int i = 0; i < row1; i++) {
        for (int j = 0; j < col2; j++) {
            for (int k = 0; k < row2; k++)
                C[i][j] += A[i][k] * B[k][j];
        }
    }

    return(C);
}

private double[] multiplyMatrices(double A[][], double B[])
{
    int colsA = A[0].length;
    int rowsA = A.length;
    int rowsB = B.length;

    double[] result = new double[rowsA];
    for (int j = 0; j < rowsA; j ++) {
            double sum = 0;
            for (int n = 0; n < colsA; n ++) {
                sum += A[j][n] * B[n];
            }
            result[j] = sum;
        }
    return result;
}

我试着让它添加到立方体的 x、y 和 z 位置是绝对值,以防搞砸任何东西,但它没有改变任何东西,因为我意识到它全部在旋转中,如果我设置立方体旋转到 180 度,它正常动作但显示在屏幕上并反转。

java matrix-multiplication orthographic
© www.soinside.com 2019 - 2024. All rights reserved.