Rubiks Cube segments rotation methods
Posted by Jakub_Klopotek on Sep 12, 2022; 1:52pm
URL: https://forum.jogamp.org/Rubiks-Cube-segments-rotation-methods-tp4041853.html
Hi, I've been trying to make a Rubiks cube in java3d. Right now I'm stuck at rotation problem. How to rotate segments of the cube by the least effort? I feel like I have to paste all my code in.
```
package rubikscubegeneral;
import java.awt.GraphicsConfiguration;
import javax.swing.JFrame;
import com.sun.j3d.exp.swing.JCanvas3D;
import com.sun.j3d.utils.geometry.*;
import javax.media.j3d.*;
import javax.swing.*;
import java.awt.*;
import com.sun.j3d.utils.universe.SimpleUniverse;
import javax.media.j3d.Transform3D;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.ViewingPlatform;
import sun.java2d.pipe.SpanShapeRenderer;
import java.awt.event.*;
public class RubiksCubeGeneral extends JFrame implements ActionListener, KeyListener {
private Button reset = new Button("reset kamery"); // cam reset
SimpleUniverse simpleU;
Vector3f[] pozycja = new Vector3f[8]; // vectors for cubes
TransformGroup[] tg = new TransformGroup[8]; // transform for cubes
public RubiksCubeGeneral() {
super("Kostka Rubika");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
canvas3D.setPreferredSize(new Dimension(800, 600));
add(canvas3D);
pack();
setVisible(true);
BranchGroup scena = utworzScene();
scena.compile();
canvas3D.addKeyListener(this); // key listener for canvas
simpleU = new SimpleUniverse(canvas3D);
//obsever placing
Transform3D przesuniecie_obserwatora = new Transform3D();
przesuniecie_obserwatora.set(new Vector3f(0, 0, 20.0f));
simpleU.getViewingPlatform().getViewPlatformTransform().setTransform(przesuniecie_obserwatora);
ViewingPlatform viewingPlatform = simpleU.getViewingPlatform();
//orbital camera
OrbitBehavior orbit = new OrbitBehavior(canvas3D, OrbitBehavior.REVERSE_ALL);
BoundingSphere sceneBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
orbit.setSchedulingBounds(sceneBounds);
viewingPlatform.setViewPlatformBehavior(orbit);
simpleU.addBranchGraph(scena);
// reset camera button
setLayout(new BorderLayout());
Panel bottom = new Panel();
bottom.add(reset);
reset.addActionListener(this);
add(BorderLayout.CENTER, canvas3D);
add(BorderLayout.SOUTH, bottom);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == reset) {
Transform3D przesuniecie_obserwatora = new Transform3D();
przesuniecie_obserwatora.set(new Vector3f(0, 0, 20.0f));
simpleU.getViewingPlatform().getViewPlatformTransform().setTransform(przesuniecie_obserwatora);
}
}
BranchGroup utworzScene() {
BranchGroup wezel_scena = new BranchGroup();
BoundingSphere bounds = new BoundingSphere(new Point3d(0, 0, 0), 10);
//lights
AmbientLight lightA = new AmbientLight();
lightA.setInfluencingBounds(bounds);
wezel_scena.addChild(lightA);
// cubes declaration
ColorCube[] szescian = new ColorCube[8];
Transform3D[] transform = new Transform3D[8];
// vectors to move cubes by ( at the start)
pozycja[0] = new Vector3f(-1.025f, 1.025f, 1.025f);
pozycja[1] = new Vector3f(1.025f, 1.025f, 1.025f);
pozycja[2] = new Vector3f(-1.025f, -1.025f, 1.025f);
pozycja[3] = new Vector3f(1.025f, -1.025f, 1.025f);
pozycja[4] = new Vector3f(-1.025f, 1.025f, -1.025f);
pozycja[5] = new Vector3f(1.025f, 1.025f, -1.0025f);
pozycja[6] = new Vector3f(-1.025f, -1.025f, -1.025f);
pozycja[7] = new Vector3f(1.025f, -1.025f, -1.025f);
// placing the cubes in their spots
for (int i = 0; i < 8; i++) {
szescian[i] = new ColorCube();
tg[i] = new TransformGroup();
tg[i].setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
tg[i].setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
transform[i] = new Transform3D();
transform[i].setTranslation(pozycja[i]);
tg[i].setTransform(transform[i]);
tg[i].addChild(szescian[i]);
wezel_scena.addChild(tg[i]);
}
return wezel_scena;
}
public static void main(String args[]) {
new RubiksCubeGeneral();
}
// key listener for rotations ( not done)
@Override
public void keyTyped(KeyEvent e) {
switch (e.getKeyChar()) {
case 'q': { }
break;
case 'w': {}
break;
case 'a':{} break;
case 's':{}break;
case 'r':{} break;
case 't':{} break;
case 'f':{} break;
case 'g':{} break;
}
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
```
Im new to java so sorry if this question does not makes sense.