Pls Help on Default rotation pivot and behavior of rotateX, rotateY, rotateZ

Started by madhava.s, January 29, 2013, 10:43:12 AM

Previous topic - Next topic

madhava.s

i was experimenting with rotation plane around it's geometric center with mathematical X,Y,Z axis(not default Y Z axis of ) , I needed to do trial and error to get the position. Tried searching documentation, couldn't find it. Pls anybody shed some light on this, if it's already there in documentation n I have missed pls point me towards that.

madhava.s


Thomas.

You have to use object's rotation axis...

pitch...
Matrix m = object.getRotationMatrix();
SimpleVector axis = m.getXAxis();
object.rotateAxis(axis, angle);

madhava.s

Thanks thomas, Problem solved only for Y-axis. :(
For Y-axis object rotates on center where as for Z & X axes plane circles around a point out it's bounds. pasting code below.

Matrix m = object.getRotationMatrix();
        SimpleVector objectAxis ;
        switch(axis){
            case X_AXIS:objectAxis=m.getXAxis();
                        objectAxis.add(object.getCenter());
                        object.rotateAxis(objectAxis, radians);
                        break;                       
               
            case Y_AXIS:objectAxis=m.getYAxis();
                        objectAxis.add(object.getCenter());
                        object.rotateAxis(objectAxis,radians);
                        break;
               
            case Z_AXIS:objectAxis=m.getZAxis();
                        objectAxis.add(object.getCenter());
                        object.rotateAxis(objectAxis,radians);
                        break;
        }



EgonOlsen


madhava.s

Tried to translate vector from origin to Geometric center. I was thinking this will give us vector parallel to absolute axes.

EgonOlsen

Quote from: madhava.s on January 30, 2013, 06:29:30 PM
Tried to translate vector from origin to Geometric center. I was thinking this will give us vector parallel to absolute axes.
That makes no sense. The rotation happens in object space around the given axis with the rotation pivot as position vector. Place the rotation pivot inside of your plane (in object space, NOT in world space) and simply rotate around the result of get?Axis(). Don't translate the returned vector.

madhava.s

Removed translation code still behavior is same . I'm using below code to set Rotation Pivot

                float[] bounds=layer1.getMesh().getBoundingBox();
                layer1.setCenter(SimpleVector.create(
                (bounds[0]+bounds[1])/2,
                (bounds[2]+bounds[3])/2,
                (bounds[4]+bounds[5])/2));
        layer1.setRotationPivot(layer1.getCenter());

Anything wrong here?


EgonOlsen

Maybe we should take one step back and clarify what your actual problem is. because i'm not quite sure anymore. Is the problem that you don't know where to place the rotation pivot or that you are having trouble to rotate around the correct axis?

madhava.s

Problem is i'm unable rotate around axis , but don't know where have I gone wrong in placing the Rotation pivot or rotating the axis.

madhava.s

Thanks Egon and Thanks to paul for his examples. Dummy object did the trick
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package jcptexp;

import com.threed.jpct.*;
import java.awt.Color;

public class JcptExp {
   
    public static void main(String[] args) {
                World w = new World();
FrameBuffer fb = new FrameBuffer(800, 600, FrameBuffer.SAMPLINGMODE_NORMAL);
fb.disableRenderer(IRenderer.RENDERER_SOFTWARE);
fb.enableRenderer(IRenderer.RENDERER_OPENGL);
                Object3D dummy=Object3D.createDummyObj();
Object3D toy= Primitives.getCube(1);
Object3D toy2=Primitives.getPlane(2, 10f);


toy.setScale(0.5f);
toy2.setScale(2f);

toy.setAdditionalColor(Color.BLUE);
toy2.setAdditionalColor(Color.YELLOW);
toy2.setEnvmapDirection(Object3D.ENVMAP_XZ);
                toy2.rotateAxis(toy2.getRotationMatrix().getXAxis(), -0.3f);
                toy2.rotateAxis(toy2.getRotationMatrix().getYAxis(),0.2f);
                toy2.rotateAxis(toy2.getRotationMatrix().getYAxis(), -0.2f);
w.getCamera().moveCamera(Camera.CAMERA_MOVEOUT, 100);
w.getCamera().moveCamera(Camera.CAMERA_MOVEUP, 50);
                w.getCamera().setOrientation(SimpleVector.create(1,0,0), SimpleVector.create(0,-1,0));
                w.getCamera().align(toy2);
w.setAmbientLight(130, 130, 130);
                toy2.setOrientation(SimpleVector.create(1,0,0), SimpleVector.create(0,-1,0));
                dummy.setOrientation(SimpleVector.create(1,0,0), SimpleVector.create(0,-1,0));
                toy2.rotateZ(0.01f);
toy.build();
toy2.build();
float[] bounds=toy2.getMesh().getBoundingBox();
toy.addParent(toy2);
toy2.addParent(dummy);
w.addObject(toy);
w.addObject(toy2);

w.getCamera().lookAt(toy.getTransformedCenter());

offset(toy2, new SimpleVector(2,2,0));

                int i=-1;
while(!org.lwjgl.opengl.Display.isCloseRequested()) {
                        i*=-1;
                        //dummy.setRotationPivot(SimpleVector.create(i*0.001f,0,0));
                        dummy.rotateAxis(dummy.getRotationMatrix().getYAxis(),-0.0002f);
fb.clear(Color.RED);
w.renderScene(fb);
w.draw(fb);
fb.update();
fb.displayGLOnly();

                        try {
//Thread.sleep(100);
} catch(Exception e) {}

                       


}
fb.dispose();
System.exit(0);
}

static private void offset(Object3D which, SimpleVector amount) {
Matrix mb=which.getTranslationMatrix();
which.setTranslationMatrix(new Matrix());
which.translate(amount);
which.translateMesh();
which.setTranslationMatrix(mb);
}

}