hi,
I learned how to scale, move the node
now I want to learn about rotation
I tried mostly with quaternion (althought it is still a bit unclear for me)
Box b1 = newBox("box1",min,max);
Quaternion rl = new Quaternion(); // rl = rotateleft
rl.fromAngleAxis(90, new Vector3f(0,0,1)); // if I understand well, then it rotates the box 90 grad along z axis
b1.setLocalRotation(rl);
that code above rotate the whole box and move its location a bit, but I wanted to rotate the box to stay at its current position and rotate from its middle point
I also tried b1.getCenter();
rotatePoints
but all of them failed (may be because I didnt use them right)
Can anyone help me ?
The box should not move when you apply a rotation.
When you create the box, make sure that the center is a empty vector. And don't modify the center. (use setLocalTranslation() to modify the location.)
I didnt modify the center (I dont even know how ^^ , maybe setcenter() ?)
can you take a look at my code ?
I used the setlocaltransition like you said, so i dont think i modified the center
may be the problem is quaternion.from angelaxis ?
I also made important code, where you should take a look, bold.
only 2 blocks :D
import com.jme.app.BaseGame;
import com.jme.bounding.BoundingBox;
import com.jme.image.Texture;
import com.jme.input.InputSystem;
import com.jme.input.KeyBindingManager;
import com.jme.input.KeyInput;
import com.jme.math.Quaternion;
import com.jme.math.Vector3f;
import com.jme.renderer.Camera;
import com.jme.renderer.ColorRGBA;
import com.jme.scene.Node;
import com.jme.scene.shape.Box;
import com.jme.scene.shape.Sphere;
import com.jme.scene.state.TextureState;
import com.jme.system.DisplaySystem;
import com.jme.system.JmeException;
import com.jme.util.TextureManager;
import com.jme.util.Timer;
/**
* Tutorial 2 shows how to build our own Application
* framework for Flag Rush.
* For Flag Rush Tutorial Series.
* @author Mark Powell
*/
public class Leprobesson2 extends BaseGame {
private Camera cam;
private Node scene;
private TextureState ts;
private int width, height, depth, freq;
private boolean fullscreen;
protected Timer timer;
private Box s;
public static void main(String[] args) {
Leprobesson2 app = new Leprobesson2();
app.setConfigShowMode(ConfigShowMode.AlwaysShow,Leprobesson2.class.getResource("pics/whitebeard.jpg"));
app.start();
}
protected void update(float interpolation) {
//update the time to get the framerate
timer.update();
interpolation = timer.getTimePerFrame();
//if escape was pressed, we exit
if (KeyBindingManager.getKeyBindingManager().isValidCommand("exit")) {
finished = true;
}
[b]if (KeyBindingManager.getKeyBindingManager().isValidCommand("right")) {
Quaternion rot = new Quaternion().fromAngleAxis(1, new Vector3f(0,1,0));
s.setLocalRotation(s.getLocalRotation().multLocal(rot));
}[/b]
if (KeyBindingManager.getKeyBindingManager().isValidCommand("left")) {
// s.setLocalRotation(s.getLocalRotation().
}
}
protected void render(float interpolation) {
//Clear the screen
display.getRenderer().clearBuffers();
display.getRenderer().draw(scene);
}
/**
* initializes the display and camera.
*/
protected void initSystem() {
//store the properties information
width = settings.getWidth();
height = settings.getHeight();
depth = settings.getDepth();
freq = settings.getFrequency();
fullscreen = settings.isFullscreen();
try {
display = DisplaySystem.getDisplaySystem(settings.getRenderer());
display.createWindow(width, height, depth, freq, fullscreen);
cam = display.getRenderer().createCamera(width, height);
} catch (JmeException e) {
e.printStackTrace();
System.exit(1);
}
//set the background to black
display.getRenderer().setBackgroundColor(ColorRGBA.black);
//initialize the camera
cam.setFrustumPerspective(45.0f, (float)width / (float)height, 1, 1000);
Vector3f loc = new Vector3f(0.0f, 0.0f, 25.0f);
Vector3f left = new Vector3f(-1.0f, 0.0f, 0.0f);
Vector3f up = new Vector3f(0.0f, 1.0f, 0.0f);
Vector3f dir = new Vector3f(0.0f, 0f, -1.0f);
// Move our camera to a correct place and orientation.
cam.setFrame(loc, left, up, dir);
/** Signal that we've changed our camera's location/frustum. */
cam.update();
/** Get a high resolution timer for FPS updates. */
timer = Timer.getTimer();
display.getRenderer().setCamera(cam);
KeyBindingManager.getKeyBindingManager().set("exit",
KeyInput.KEY_ESCAPE);
KeyBindingManager.getKeyBindingManager().set("right",
KeyInput.KEY_RIGHT);
KeyBindingManager.getKeyBindingManager().set("left",
KeyInput.KEY_LEFT);
}
/**
* initializes the scene
*/
protected void initGame() {
scene = new Node("Scene graph node");
[b] //Create our Sphere
Quaternion rot = new Quaternion().fromAngleAxis(1, new Vector3f(0,1,0));
s = new Box("Sphere",new Vector3f(0,0,0),new Vector3f(10,10,10));
s.setLocalTranslation(new Vector3f(0, 0, -40));
s.setLocalRotation(rot);
s.setModelBound(new BoundingBox());
s.updateModelBound();[/b]
ts = display.getRenderer().createTextureState();
ts.setEnabled(true);
ts.setTexture(TextureManager.loadTexture(Leprobesson2.class.getClassLoader()
.getResource("pics/whitebeard.jpg"),
Texture.MinificationFilter.BilinearNearestMipMap,
Texture.MagnificationFilter.Bilinear));
s.setRenderState(ts);
scene.attachChild(s);
//update the scene graph for rendering
scene.updateGeometricState(0.0f, true);
scene.updateRenderState();
}
/**
* will be called if the resolution changes
*
*/
protected void reinit() {
display.recreateWindow(width, height, depth, freq, fullscreen);
}
/**
* clean up the textures.
*
*/
protected void cleanup() {
ts.deleteAll();
}
}
edit: added code tags
The Center of your Box is 5,5,5 because the way you created the Box:
// the center will be 5,5,5:
s = new Box("Sphere",new Vector3f(0,0,0),new Vector3f(10,10,10));
// center will be 0,0,0
s = new Box("Sphere",new Vector3f(-5,-5,-5),new Vector3f(5,5,5));
// yet another constructor where center is explicitly st to 0,0,0:
s = new Box("Sphere",new Vector3f(0,0,0), 10, 10, 10);
Also when rotating you should always use the interpolation value to get a smoother rotation:
if (KeyBindingManager.getKeyBindingManager().isValidCommand("right")) {
Quaternion rot = new Quaternion().fromAngleAxis(100*interpolation*FastMath.DEG_TO_RAD, new Vector3f(0,1,0));
s.setLocalRotation(s.getLocalRotation().multLocal(rot));
}
it works much much better now
thank you very much