Я знаю, что это может быть рынок как дубликат, но никто не ответил на мой вопрос 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();