Hi All,
I’m just looking for the best approach to change the world axis to correspond to for example Blender’s system. Blender uses a right handed system but with Y-axis pointing in the depth and Z-axis pointing up.
I’ve found the ofSetCoordHandedness method but that only swaps direction. It calls ofScale(1, 1, -1);. I could use ofRotate instead to swap the axis. I guess I then need to set that before I draw something.
But is this the best approach. Is there any better method which would result in the axis system exactly the same as Blender’s?
Any ideas very welcome.
I am struggling with the same problem and I stumbled across the following post: http://forum.openframeworks.cc/t/quad-warping-an-entire-opengl-view-solved/509/0 Which is old but does explain how to load a custom matrix namely using: glMultMatrixf();
So i tried loading the “default” matrix created by theo as such:
//lets make a matrix for openGL
GLfloat myMatrix[16];
//we set it to the default - 0 translation
//and 1.0 scale for x y z and w
for(int i = 0; i < 16; i++){
if(i % 5 != 0) myMatrix[i] = 0.0;
else myMatrix[i] = 1.0;
}
glMultMatrixf(myMatrix);
And I tried to recreate a custom changed matrix as found here: http://stackoverflow.com/questions/1263072/changing-a-matrix-from-right-handed-to-left-handed-coordinate-system/1264880#1264880
By doing:
/*
Default matrix:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
flipped:
1 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
*/
//lets make a matrix for openGL
GLfloat myMatrix[16];
//we set it to the default - 0 translation
//and 1.0 scale for x y z and w
for(int i = 0; i < 16; i++){
myMatrix[i] = 0.0;
}
myMatrix[0] = 1.0;
myMatrix[6] = 1.0;
myMatrix[9] = 1.0;
myMatrix[15] = 1.0;
glMultMatrixf(myMatrix);
This I tried both in setup and draw but if I set an object position then it seems the X/Y/Z axis remain exactly the same.
Is OF doing some openGL matrix stuff each frame that I am not aware of ?
Or am I thinking to simply by thinking I can change the matrix like that ?
I think I managed to work with the Blender coord system as it seems it’s actually very simple:
ofQuaternion rotX, rotY, rotZ;
//blenderY rot
rotY.makeRotate(15, 0, 1, 0);
//blenderY
rotZ.makeRotate( 19, 0, 0, 1);
//blenderZ
rotX.makeRotate( 35, 1, 0, 0);
cam.setOrientation(rotX * rotY * rotZ);
ofLogVerbose() << "rot: " << ofToString(cam.getOrientationEuler());
cam.setPosition(0,-5,10);
This works 1 on 1 with blender. So no axis swapping at all 