I have coordinates for 4 vertices/points that define a plane and the normal/perpendicular. The plane has an arbitrary rotation applied to it.
How can I 'un-rotate'/translate the points so that the plane has rotation 0 on x,y,z ?
I've tried to get the plane rotation from the plane's normal:
rotationX = atan2(normal.z,normal.y);
rotationY = atan2(normal.z,normal.x);
rotationZ = atan2(normal.y,normal.x);
Is this correct ?
How do I apply the inverse rotation to the position vectors ?
I've tried to create a matrix with those rotations and multiply it with the vertices, but it doesn't look right.
At the moment, I've wrote a simple test using Processing and can be seen here:
float s = 50.0f;//scale/unit
PVector[] face = {new PVector(1.08335042,0.351914703846,0.839020013809),
new PVector(-0.886264681816,0.69921118021,0.839020371437),
new PVector(-1.05991327763,-0.285596489906,-0.893030643463),
new PVector(0.909702301025,-0.63289296627,-0.893030762672)};
PVector n = new PVector(0.150384, -0.500000, 0.852869);
PVector[] clone;
void setup(){
size(400,400,P3D);
smooth();
clone = unRotate(face,n,true);
}
void draw(){
background(255);
translate(width*.5,height*.5);
if(mousePressed){
rotateX(map(mouseY,0,height,0,TWO_PI));
rotateY(map(mouseX,0,width,0,TWO_PI));
}
stroke(128,0,0);
beginShape(QUADS);
for(int i = 0 ; i < 4; i++) vertex(face[i].x*s,face[i].y*s,face[i].z*s);
endShape();
stroke(0,128,0);
beginShape(QUADS);
for(int i = 0 ; i < 4; i++) vertex(clone[i].x*s,clone[i].y*s,clone[i].z*s);
endShape();
}
//get rotation from normal
PVector getRot(PVector loc,Boolean asRadians){
loc.normalize();
float rz = asRadians ? atan2(loc.y,loc.x) : degrees(atan2(loc.y,loc.x));
float ry = asRadians ? atan2(loc.z,loc.x) : degrees(atan2(loc.z,loc.x));
float rx = asRadians ? atan2(loc.z,loc.y) : degrees(atan2(loc.z,loc.y));
return new PVector(rx,ry,rz);
}
//translate vertices
PVector[] unRotate(PVector[] verts,PVector no,Boolean doClone){
int vl = verts.length;
PVector[] clone;
if(doClone) {
clone = new PVector[vl];
for(int i = 0; i
Any syntax/pseudo code or explanation is useful.
What trying to achieve is this:
If I have a rotated plane:
How can move the vertices to have something that would have no rotation:
Thanks!
UPDATE:
@muad
I'm not sure I understand. I thought I was using matrices for rotations. PMatrix3D's rotateX,rotateY,rotateZ calls should done the rotations for me. Doing it manually would be declaring 3d matrices and multiplying them. Here's a little snippet to illustrate this:
PMatrix3D rx = new PMatrix3D(1, 0, 0, 0,
0, cos(rot.x),-sin(rot.x), 0,
0, sin(rot.x),cos(rot.x) , 0,
0, 0, 0, 1);
PMatrix3D ry = new PMatrix3D(cos(rot.y), 0,sin(rot.y), 0,
0, 1,0 , 0,
-sin(rot.y), 0,cos(rot.y), 0,
0, 0,0 , 1);
PMatrix3D rz = new PMatrix3D(cos(rot.z),-sin(rot.z), 0, 0,
sin(rot.z), cos(rot.z), 0, 0,
0 , 0, 1, 0,
0 , 0, 0, 1);
PMatrix3D r = new PMatrix3D();
r.apply(rx);r.apply(ry);r.apply(rz);
//test
PMatrix rmat = new PMatrix3D();rmat.rotateX(rot.x);rmat.rotateY(rot.y);rmat.rotateZ(rot.z);
float[] frmat = new float[16];rmat.get(frmat);
float[] fr = new float[16];r.get(fr);
println(frmat);println(fr);
/*
Outputs:
[0] 0.059300933
[1] 0.09312407
[2] -0.99388695
[3] 0.0
[4] 0.90466285
[5] 0.41586864
[6] 0.09294289
[7] 0.0
[8] 0.42198166
[9] -0.9046442
[10] -0.059584484
[11] 0.0
[12] 0.0
[13] 0.0
[14] 0.0
[15] 1.0
[0] 0.059300933
[1] 0.09312407
[2] -0.99388695
[3] 0.0
[4] 0.90466285
[5] 0.41586864
[6] 0.09294289
[7] 0.0
[8] 0.42198166
[9] -0.9046442
[10] -0.059584484
[11] 0.0
[12] 0.0
[13] 0.0
[14] 0.0
[15] 1.0
*/