在我的数学中,除了当我将相机旋转 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 度,它正常动作但显示在屏幕上并反转。