Bugfix: fixes to scale/rotation setting and reading.
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10762 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
a3876e49de
commit
b4dfd528ee
@ -1783,16 +1783,46 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
|
|||||||
vector.set(scaleX, scaleY, scaleZ);
|
vector.set(scaleX, scaleY, scaleZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the scale.
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* the X scale
|
||||||
|
* @param y
|
||||||
|
* the Y scale
|
||||||
|
* @param z
|
||||||
|
* the Z scale
|
||||||
|
*/
|
||||||
public void setScale(float x, float y, float z) {
|
public void setScale(float x, float y, float z) {
|
||||||
m00 *= x;
|
TempVars vars = TempVars.get();
|
||||||
m11 *= y;
|
vars.vect1.set(m00, m10, m20);
|
||||||
m22 *= z;
|
vars.vect1.normalizeLocal().multLocal(x);
|
||||||
|
m00 = vars.vect1.x;
|
||||||
|
m10 = vars.vect1.y;
|
||||||
|
m20 = vars.vect1.z;
|
||||||
|
|
||||||
|
vars.vect1.set(m01, m11, m21);
|
||||||
|
vars.vect1.normalizeLocal().multLocal(y);
|
||||||
|
m01 = vars.vect1.x;
|
||||||
|
m11 = vars.vect1.y;
|
||||||
|
m21 = vars.vect1.z;
|
||||||
|
|
||||||
|
vars.vect1.set(m02, m12, m22);
|
||||||
|
vars.vect1.normalizeLocal().multLocal(z);
|
||||||
|
m02 = vars.vect1.x;
|
||||||
|
m12 = vars.vect1.y;
|
||||||
|
m22 = vars.vect1.z;
|
||||||
|
vars.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the scale.
|
||||||
|
*
|
||||||
|
* @param scale
|
||||||
|
* the scale vector to set
|
||||||
|
*/
|
||||||
public void setScale(Vector3f scale) {
|
public void setScale(Vector3f scale) {
|
||||||
m00 *= scale.x;
|
this.setScale(scale.x, scale.y, scale.z);
|
||||||
m11 *= scale.y;
|
|
||||||
m22 *= scale.z;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -330,8 +330,31 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Quaternion fromRotationMatrix(float m00, float m01, float m02,
|
public Quaternion fromRotationMatrix(float m00, float m01, float m02,
|
||||||
float m10, float m11, float m12,
|
float m10, float m11, float m12, float m20, float m21, float m22) {
|
||||||
float m20, float m21, float m22) {
|
// first normalize the forward (F), up (U) and side (S) vectors of the rotation matrix
|
||||||
|
// so that the scale does not affect the rotation
|
||||||
|
float lengthSquared = m00 * m00 + m10 * m10 + m20 * m20;
|
||||||
|
if (lengthSquared != 1f && lengthSquared != 0f) {
|
||||||
|
lengthSquared = 1.0f / FastMath.sqrt(lengthSquared);
|
||||||
|
m00 *= lengthSquared;
|
||||||
|
m10 *= lengthSquared;
|
||||||
|
m20 *= lengthSquared;
|
||||||
|
}
|
||||||
|
lengthSquared = m01 * m01 + m11 * m11 + m21 * m21;
|
||||||
|
if (lengthSquared != 1f && lengthSquared != 0f) {
|
||||||
|
lengthSquared = 1.0f / FastMath.sqrt(lengthSquared);
|
||||||
|
m01 *= lengthSquared;
|
||||||
|
m11 *= lengthSquared;
|
||||||
|
m21 *= lengthSquared;
|
||||||
|
}
|
||||||
|
lengthSquared = m02 * m02 + m12 * m12 + m22 * m22;
|
||||||
|
if (lengthSquared != 1f && lengthSquared != 0f) {
|
||||||
|
lengthSquared = 1.0f / FastMath.sqrt(lengthSquared);
|
||||||
|
m02 *= lengthSquared;
|
||||||
|
m12 *= lengthSquared;
|
||||||
|
m22 *= lengthSquared;
|
||||||
|
}
|
||||||
|
|
||||||
// Use the Graphics Gems code, from
|
// Use the Graphics Gems code, from
|
||||||
// ftp://ftp.cis.upenn.edu/pub/graphics/shoemake/quatut.ps.Z
|
// ftp://ftp.cis.upenn.edu/pub/graphics/shoemake/quatut.ps.Z
|
||||||
// *NOT* the "Matrix and Quaternions FAQ", which has errors!
|
// *NOT* the "Matrix and Quaternions FAQ", which has errors!
|
||||||
@ -439,7 +462,8 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl
|
|||||||
* @return the rotation matrix representation of this quaternion.
|
* @return the rotation matrix representation of this quaternion.
|
||||||
*/
|
*/
|
||||||
public Matrix4f toRotationMatrix(Matrix4f result) {
|
public Matrix4f toRotationMatrix(Matrix4f result) {
|
||||||
|
Vector3f originalScale = result.toScaleVector();
|
||||||
|
result.setScale(1, 1, 1);
|
||||||
float norm = norm();
|
float norm = norm();
|
||||||
// we explicitly test norm against one here, saving a division
|
// we explicitly test norm against one here, saving a division
|
||||||
// at the cost of a test and branch. Is it worth it?
|
// at the cost of a test and branch. Is it worth it?
|
||||||
@ -471,6 +495,7 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl
|
|||||||
result.m21 = (yz + xw);
|
result.m21 = (yz + xw);
|
||||||
result.m22 = 1 - (xx + yy);
|
result.m22 = 1 - (xx + yy);
|
||||||
|
|
||||||
|
result.setScale(originalScale);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user