Disclaimer: I’ll say I have read the math for dummies, so I think I understand the rotations using lookat and stuff. But bear with me, because I’m still having issues.
First, my rotation. It almost works, except for some exception cases.
- If I drag diagonally across my screen, my wireframe sphere will rotate in 1 axis correctly, and the other access incorrectly. Ex: drag diagonally up and right, sphere will rotate right, but also rotate down instead of up.
- Somewhere during the rotation, sometimes an axis “flips”, such that something like dragging up causes the sphere to rotate downward.
I feel like these two issues are connected–I can’t see how though. Mind you, this is now trying to be done in a touchListener. In the code below, I got the analogListener working with swipe detection, but needed the touchListener for scale events too, so I dropped the analogListener’s use. I have it here for understanding purposes.
[java]
private TouchListener touchListener = new TouchListener() {
public void onTouch(String name, TouchEvent event, float tpf) {
logger.log(Level.INFO,"{0} event",event.getType());
Quaternion roll = null;
switch(event.getType()){
case DOWN:
logger.log(Level.INFO,"down at {0} {1} ",new Object[]{event.getX(),event.getY()});
break;
case MOVE:
logger.log(Level.INFO,"down moving at {0} {1} ",new Object[]{event.getDeltaX(),event.getDeltaY()});
float x = event.getDeltaX();
float y = event.getDeltaY();
if(Math.abs(x) < 2){
x = 0;
}
if(Math.abs(y) < 2){
y = 0;
}
float[] angles = new float[]{FastMath.QUARTER_PI * y * .01f,FastMath.QUARTER_PI * x * .01f,0};
//float[] angles = new float[]{0,FastMath.QUARTER_PI * event.getDeltaX()* .01f,0};
roll = new Quaternion().fromAngles(angles);
roll.multLocal(lookAt);
roll.multLocal(up);
break;
case SCALE_START:
inputManager.removeListener(analogListener);
logger.log(Level.INFO,"{0} scale start",event.getScaleFactor());
scale_factor = event.getScaleFactor();
break;
case SCALE_MOVE:
logger.log(Level.INFO,"{0} scale moving {1} {2}",new Object[]{event.getScaleFactor(),event.getScaleSpan(),event.isScaleSpanInProgress()});
scale_factor = event.getScaleFactor();
if(event.getScaleSpan() != previous_scalespan){
scale_factor = event.getScaleFactor();
previous_scalespan = event.getScaleSpan();
} else {
event.setConsumed();
}
break;
case SCALE_END:
inputManager.addListener(analogListener,"down swipe", "left swipe", "up swipe","right swipe");
logger.log(Level.INFO,"scale end");
scale_factor =1;
break;
default:
scale_factor = 1;
break;
}
/*if(scale_factor > 1){
scale_factor = 1.05f;
} else if(scale_factor < 1) {
scale_factor = .95f;
}*/
}
};
private AnalogListener analogListener = new AnalogListener() {
public void onAnalog(String name, float value, float tpf) {
if(scale_factor == 1){
logger.log(Level.INFO,"{0} + {1}",new Object[]{name,value});
Quaternion roll = new Quaternion();
if(name.equals("up swipe")){
roll = new Quaternion().fromAngleAxis(-FastMath.QUARTER_PI * value * 10, Vector3f.UNIT_X);
roll.multLocal(lookAt);
roll.multLocal(up);
}
if(name.equals("right swipe")){
roll = new Quaternion().fromAngleAxis(FastMath.QUARTER_PI * value * 10, Vector3f.UNIT_Y);
roll.multLocal(lookAt);
roll.multLocal(up);
}
if(name.equals("down swipe")){
roll = new Quaternion().fromAngleAxis(FastMath.QUARTER_PI * value * 10, Vector3f.UNIT_X);
roll.multLocal(lookAt);
roll.multLocal(up);
}
if(name.equals("left swipe")){
roll = new Quaternion().fromAngleAxis(-FastMath.QUARTER_PI * value * 10, Vector3f.UNIT_Y);
roll.multLocal(lookAt);
roll.multLocal(up);
}
}
// sphere.setLocalRotation(new Quaternion().fromAngles(0, 0, 0));
}
};
@Override
public void simpleUpdate(float tpf) {
sphere.lookAt(lookAt, up);
sphere.scale(scale_factor);
if(sphere.getLocalScale().x > 2.5f){
sphere.setLocalScale(new Vector3f(2.5f,2.5f,2.5f));
} else if(sphere.getLocalScale().x < .5f){
sphere.setLocalScale(new Vector3f(.5f,.5f,.5f));
}
logger.log(Level.INFO,"sphere is now: {0}",sphere.getLocalScale());
//TODO: add update code
}
[/java]
Also, when I scale the object any which way, all of a sudden, rotation along the x axis (up and down rotation) becomes locked. Why?