Обработка 3: Как сохранить оси в их положении по умолчанию? - PullRequest
1 голос
/ 22 января 2020

Я делаю 3D-игру-головоломку в Processing 3.5.4, где пользователь нажимает на кубы головоломки, чтобы вращать их.

Вращения, которые пользователь может сделать:

  • Ось X (вверх), нажав правую кнопку мыши
  • Ось Y (вправо), нажав левую кнопку мыши
  • Ось Z (от верхней грани к правой грани), нажав центр click
Проблема в том, что каждый куб вращается вместе со своими осями. Это означает, что если я поверну куб
по оси Y, а затем захочу повернуть его по оси X, он не будет вращаться, как ожидалось, но он будет
вращаться по оси Z, но против по часовой стрелке.
Я полагаю, что оси вращаются вместе с кубом, поэтому, если я поверну куб вправо, ось Z станет
осью X, и если я продолжу вращать оси Z и X, будут обращены и так вкл.

Я прав? Если да, как я могу сохранить оси в их положении по умолчанию?

PS: Я хотел бы сделать это без использования библиотек, если это возможно.

Код для куба головоломки:
    public class PuzzleCube
    {
        private final float l;
        private final PVector position;
        private float angX, angY, angZ;
        private float endX, endY, endZ;
        private boolean rotateX, rotateY, rotateZ;
        private final int puzzleWidth, puzzleHeight;
        private final PImage[] textures;

        public PuzzleCube(float l, PVector position, int puzzleWidth,
            int puzzleHeight, PImage[] textures)
        {
            textureMode(NORMAL);
            this.l = l;
            this.position = position;
            this.puzzleWidth = puzzleWidth;
            this.puzzleHeight = puzzleHeight;
            this.textures = textures;
            angX = 0.0;
            angY = 0.0;
            angZ = 0.0;
            endX = HALF_PI;
            endY = HALF_PI;
            endZ = HALF_PI;
            rotateX = false;
            rotateY = false;
            rotateZ = false;
        }

        private void update()
        {
            if (rotateX)
                turnX();
            if (rotateY)
                turnY();
            if (rotateZ)
                turnZ();
        }

        public void draw(float u, float v)
        {

            update();
            float h = (float) 1 / puzzleWidth; // For UV coordinates
            float w = (float) 1 / puzzleHeight; // For UV coordinates
            pushMatrix();
            // Placing the cube in the right position
            translate(position.x + (l / 2) * (puzzleWidth - 3),
                      position.y + (l / 2) * (puzzleHeight - 3));
            // Rotating the cube
            rotateY(angY);
            rotateX(angX);
            rotateZ(angZ);
            // Puzzle cube creation here...
            // With beginShape(), endShape() and texture()
            // Not posted due to the length of the code
            popMatrix();
        }

        private void turnX()
        {
            final double inc = HALF_PI / (frameRate / 6);
            if (angX < endX)
                angX += inc;
            if (angX >= endX)
            {
                angX = endX;
                endX += HALF_PI;
                rotateX = false;
            }
        }

        private void turnY()
        {
            final double inc = HALF_PI / (frameRate / 6);
            if (angY < endY)
                angY += inc;
            if (angY >= endY)
            {
                angY = endY;
                endY += HALF_PI;
                rotateY = false;
            }
        }

        private void turnZ()
        {
            final double inc = HALF_PI / (frameRate / 6);
            if (angZ < endZ)
                angZ += inc;
            if (angZ >= endZ)
            {
                angZ = endZ;
                endZ += HALF_PI;
                rotateZ = false;
            }
        }

...