Я делаю 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;
}
}