Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
234 views
in Technique[技术] by (71.8m points)

java/trig/math. relative axis of cube in 3 space, processing library(bug?)

I have a cube that rotates on its 3 axis, when key[a] == true it will spin to the left as if it was rolling that way. rotating the cube 45 degrees in any direction sets it back 90 degrees for the illusion of continuing. this maintains 3 axis that are < 45 degrees off from the environment

I believe this is correct but the x axis for the cube seems to be relative to the environment while y and z are relative to the cubes orientation, I can not find reference to this in the documentation is it a bug? https://processing.org/reference/rotateY_.html https://processing.org/reference/rotateX_.html

  if(keys[w]) { 
    if (x >= 359) x = 0;
    x = x + 1;
  }  
  if(keys[a]) { 
    if (z >= 359) z = 0;
    z = z + 1;
  }  
  if(keys[s]) { 
    if (x <= 0) x = 359;
    x = x - 1;
  }  
  if(keys[d]) { 
    if (z <= 0) z = 359;     
    z = z - 1;
  }
   
  // return 90 deg for magic trick       
  if (x > 45 && x < 180) x = 270 + x;
  if (x < 316 && x > 180) x = 360 - x;
 
  if (y > 45 && y < 180) y = 270 + y;
  if (y < 316 && y > 180) y = 360 - y;
 

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Matrix transformations are not commutative. The order matters. The matrix operations like rotate() specify a new matrix and multiply the current matrix by the new matrix.

Hence, there is a difference between doing this

rotateX(x);
rotateY(y);
rotateZ(z);

and doing that

rotateZ(z);
rotateY(y);
rotateX(x);

And

rotateX(x1 + x2);
rotateY(y1 + y2);
rotateZ(z1 + z2);

is not the same as

rotateX(x1);
rotateY(y1);
rotateZ(z1);
rotateX(x2);
rotateY(y2);
rotateZ(z2);

One possible solution to your problem would be to use Quaternions. Quaternions behave differently than Euler angles and have also no Gimbal lock issue. Processing use OpenGL under the hood and doesn't support quaternions. However a quaternion can be transformed to a matrix and a matrix can be applied by applyMatrix().


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...