Обработка 3: Как не позволить осям двигаться вместе с формой? - PullRequest
2 голосов
/ 29 января 2020

Я знаю, что это может быть рынок как дубликат, но никто не ответил на мой вопрос go за одну неделю, поэтому я спрашиваю снова:

Я делаю простую трехмерную головоломку, где вам нужно вращаться * n число кубов, вы делаете это, используя оси x, y и z.
Проблема в том, что всякий раз, когда я вращаю куб, например, по оси y (поворачивает вправо), а затем я хочу повернуть он на оси
x, он не будет go вверх, как ожидалось, но он будет вращаться влево, как если бы он был на оси z.

Я считаю, что проблема заключается в осях Сами себя, поэтому я спрашиваю: как мне не дать осям двигаться вместе с формой, и
заставить их сохранить свою позицию?

Вот код для вращения куба головоломки:

    // This is the x axis rotation,
    // the others are the same, just
    // with Y and Z instead of X
    private void turnX()
    {
        final double inc = HALF_PI / (frameRate / 6); // Increment step for the animation
        if (angX < endX)
            angX += inc;
        if (angX >= endX)
        {
            angX = endX;
            endX += HALF_PI;
            rotateX = false;
        }
    }
    // Capture mouse input
    public void mouseInput()
    {
        // x,y distance from the start position of the cube to the actual position
        // (translated to width / 2, height / 2)
        final float xDistance = position.x + (width - l * puzzleWidth) / 2 + l * (puzzleWidth - 2);
        final float yDistance = position.y + (height - l * puzzleHeight) / 2 + l * (puzzleHeight - 2);
        if ((mouseX > xDistance && mouseX < xDistance + l) && 
            (mouseY > yDistance && mouseY < yDistance + l))
        {
            if (mouseButton == RIGHT && !rotateY && !rotateZ)
                rotateX = true;
            else if (mouseButton == LEFT && !rotateX && !rotateZ)
                rotateY = true;
            else if (mouseButton == CENTER && !rotateX && !rotateY)
                rotateZ = true;
        }
    }


Любая помощь будет принята, и я хотел бы, если это возможно, сделать ее без каких-либо сторонних библиотек.

РЕДАКТИРОВАТЬ
Как и спросил @laancelot, вот часть рисования куба головоломки, она довольно длинная со всеми ее beginShape () и endShape ():

    final float h = (float) 1 / puzzleWidth;
    final float w = (float) 1 / puzzleHeight;
    pushMatrix();
    translate(position.x + (l / 2) * (puzzleWidth - 3),
              position.y + (l / 2) * (puzzleHeight - 3));  
    rotateY(angY);
    rotateX(angX);
    rotateZ(angZ);
    // Front
    beginShape();
        texture(textures[0]);
        vertex(-l/2, -l/2, l/2, u, v); // Alto-sinistra
        vertex(l/2, -l/2, l/2, u + w, v); // Alto-destra
        vertex(l/2, l/2, l/2, u + w, v + h); // Basso-destra
        vertex(-l/2, l/2, l/2, u, v + h); //Basso-sinistra
    endShape(CLOSE);
    // Rear
    beginShape();
        texture(textures[1]);
        vertex(-l/2, -l/2, -l/2, u + w, v);
        vertex(l/2, -l/2, -l/2, u, v);
        vertex(l/2, l/2, -l/2, u, v + h);
        vertex(-l/2, l/2, -l/2, u + w, v + h);
    endShape(CLOSE);
    // Right
    beginShape();
        texture(textures[2]);
        vertex(l/2, -l/2, l/2, u, v);
        vertex(l/2, -l/2, -l/2, u + w, v);
        vertex(l/2, l/2, -l/2, u + w, v + h);
        vertex(l/2, l/2, l/2, u, v + h);
    endShape(CLOSE);
    // Left
    beginShape();
        texture(textures[3]);
        vertex(-l/2, -l/2, l/2, u + w, v);
        vertex(-l/2, -l/2, -l/2, u, v);
        vertex(-l/2, l/2, -l/2, u, v + h);
        vertex(-l/2, l/2, l/2, u + w, v + h);
    endShape(CLOSE);
    // Top
    beginShape();
        texture(textures[4]);
        vertex(-l/2, -l/2, l/2, u, v + h);
        vertex(-l/2, -l/2, -l/2, u, v);
        vertex(l/2, -l/2, -l/2, u + w, v);
        vertex(l/2, -l/2, l/2, u + w, v + h);
    endShape(CLOSE);
    // Bottom
    beginShape();
        texture(textures[5]);
        vertex(l/2, l/2, l/2, u + w, v);
        vertex(l/2, l/2, -l/2, u + w, v + h);
        vertex(-l/2, l/2, -l/2, u, v + h);
        vertex(-l/2, l/2, l/2, u, v);
    endShape(CLOSE);
    popMatrix();
...