📄 matrix4f.java
字号:
}
/**
* <code>setInverseTranslation</code> will set the matrix's inverse
* translation values.
*
* @param translation
* the new values for the inverse translation.
* @throws JmeException
* if translation is not size 3.
*/
public void setInverseTranslation(float[] translation) {
if (translation.length != 3) { throw new JmeException(
"Translation size must be 3."); }
m03 = -translation[0];
m13 = -translation[1];
m23 = -translation[2];
}
/**
* <code>angleRotation</code> sets this matrix to that of a rotation about
* three axes (x, y, z). Where each axis has a specified rotation in
* degrees. These rotations are expressed in a single <code>Vector3f</code>
* object.
*
* @param angles
* the angles to rotate.
*/
public void angleRotation(Vector3f angles) {
float angle;
float sr, sp, sy, cr, cp, cy;
angle = (angles.z * FastMath.DEG_TO_RAD);
sy = FastMath.sin(angle);
cy = FastMath.cos(angle);
angle = (angles.y * FastMath.DEG_TO_RAD);
sp = FastMath.sin(angle);
cp = FastMath.cos(angle);
angle = (angles.x * FastMath.DEG_TO_RAD);
sr = FastMath.sin(angle);
cr = FastMath.cos(angle);
// matrix = (Z * Y) * X
m00 = cp * cy;
m10 = cp * sy;
m20 = -sp;
m01 = sr * sp * cy + cr * -sy;
m11 = sr * sp * sy + cr * cy;
m21 = sr * cp;
m02 = (cr * sp * cy + -sr * -sy);
m12 = (cr * sp * sy + -sr * cy);
m22 = cr * cp;
m03 = 0.0f;
m13 = 0.0f;
m23 = 0.0f;
}
/**
* <code>setRotationQuaternion</code> builds a rotation from a
* <code>Quaternion</code>.
*
* @param quat
* the quaternion to build the rotation from.
* @throws NullPointerException
* if quat is null.
*/
public void setRotationQuaternion(Quaternion quat) {
quat.toRotationMatrix(this);
}
/**
* <code>setInverseRotationRadians</code> builds an inverted rotation from
* Euler angles that are in radians.
*
* @param angles
* the Euler angles in radians.
* @throws JmeException
* if angles is not size 3.
*/
public void setInverseRotationRadians(float[] angles) {
if (angles.length != 3) { throw new JmeException(
"Angles must be of size 3."); }
double cr = FastMath.cos(angles[0]);
double sr = FastMath.sin(angles[0]);
double cp = FastMath.cos(angles[1]);
double sp = FastMath.sin(angles[1]);
double cy = FastMath.cos(angles[2]);
double sy = FastMath.sin(angles[2]);
m00 = (float) (cp * cy);
m10 = (float) (cp * sy);
m20 = (float) (-sp);
double srsp = sr * sp;
double crsp = cr * sp;
m01 = (float) (srsp * cy - cr * sy);
m11 = (float) (srsp * sy + cr * cy);
m21 = (float) (sr * cp);
m02 = (float) (crsp * cy + sr * sy);
m12 = (float) (crsp * sy - sr * cy);
m22 = (float) (cr * cp);
}
/**
* <code>setInverseRotationDegrees</code> builds an inverted rotation from
* Euler angles that are in degrees.
*
* @param angles
* the Euler angles in degrees.
* @throws JmeException
* if angles is not size 3.
*/
public void setInverseRotationDegrees(float[] angles) {
if (angles.length != 3) { throw new JmeException(
"Angles must be of size 3."); }
float vec[] = new float[3];
vec[0] = (angles[0] * FastMath.RAD_TO_DEG);
vec[1] = (angles[1] * FastMath.RAD_TO_DEG);
vec[2] = (angles[2] * FastMath.RAD_TO_DEG);
setInverseRotationRadians(vec);
}
/**
*
* <code>inverseTranslateVect</code> translates a given Vector3f by the
* translation part of this matrix.
*
* @param vec
* the Vector3f data to be translated.
* @throws JmeException
* if the size of the Vector3f is not 3.
*/
public void inverseTranslateVect(float[] vec) {
if (vec.length != 3) { throw new JmeException(
"vec must be of size 3."); }
vec[0] = vec[0] - m03;
vec[1] = vec[1] - m13;
vec[2] = vec[2] - m23;
}
/**
*
* <code>inverseTranslateVect</code> translates a given Vector3f by the
* translation part of this matrix.
*
* @param data
* the Vector3f to be translated.
* @throws JmeException
* if the size of the Vector3f is not 3.
*/
public void inverseTranslateVect(Vector3f data) {
data.x -= m03;
data.y -= m13;
data.z -= m23;
}
/**
*
* <code>inverseTranslateVect</code> translates a given Vector3f by the
* translation part of this matrix.
*
* @param data
* the Vector3f to be translated.
* @throws JmeException
* if the size of the Vector3f is not 3.
*/
public void translateVect(Vector3f data) {
data.x += m03;
data.y += m13;
data.z += m23;
}
/**
*
* <code>inverseRotateVect</code> rotates a given Vector3f by the rotation
* part of this matrix.
*
* @param vec
* the Vector3f to be rotated.
*/
public void inverseRotateVect(Vector3f vec) {
float vx = vec.x, vy = vec.y, vz = vec.z;
vec.x = vx * m00 + vy * m10 + vz * m20;
vec.y = vx * m01 + vy * m11 + vz * m21;
vec.z = vx * m02 + vy * m12 + vz * m22;
}
public void rotateVect(Vector3f vec) {
float vx = vec.x, vy = vec.y, vz = vec.z;
vec.x = vx * m00 + vy * m01 + vz * m02;
vec.y = vx * m10 + vy * m11 + vz * m12;
vec.z = vx * m20 + vy * m21 + vz * m22;
}
/**
* <code>toString</code> returns the string representation of this object.
* It is in a format of a 4x4 matrix. For example, an identity matrix would
* be represented by the following string. com.jme.math.Matrix3f <br>[<br>
* 1.0 0.0 0.0 0.0 <br>
* 0.0 1.0 0.0 0.0 <br>
* 0.0 0.0 1.0 0.0 <br>
* 0.0 0.0 0.0 1.0 <br>]<br>
*
* @return the string representation of this object.
*/
public String toString() {
StringBuffer result = new StringBuffer("com.jme.math.Matrix4f\n[\n");
result.append(" ");
result.append(m00);
result.append(" ");
result.append(m01);
result.append(" ");
result.append(m02);
result.append(" ");
result.append(m03);
result.append(" \n");
result.append(" ");
result.append(m10);
result.append(" ");
result.append(m11);
result.append(" ");
result.append(m12);
result.append(" ");
result.append(m13);
result.append(" \n");
result.append(" ");
result.append(m20);
result.append(" ");
result.append(m21);
result.append(" ");
result.append(m22);
result.append(" ");
result.append(m23);
result.append(" \n");
result.append(" ");
result.append(m30);
result.append(" ");
result.append(m31);
result.append(" ");
result.append(m32);
result.append(" ");
result.append(m33);
result.append(" \n]");
return result.toString();
}
/**
*
* <code>hashCode</code> returns the hash code value as an integer and is
* supported for the benefit of hashing based collection classes such as
* Hashtable, HashMap, HashSet etc.
*
* @return the hashcode for this instance of Matrix4f.
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
int hash = 37;
hash = 37 * hash + Float.floatToIntBits(m00);
hash = 37 * hash + Float.floatToIntBits(m01);
hash = 37 * hash + Float.floatToIntBits(m02);
hash = 37 * hash + Float.floatToIntBits(m03);
hash = 37 * hash + Float.floatToIntBits(m10);
hash = 37 * hash + Float.floatToIntBits(m11);
hash = 37 * hash + Float.floatToIntBits(m12);
hash = 37 * hash + Float.floatToIntBits(m13);
hash = 37 * hash + Float.floatToIntBits(m20);
hash = 37 * hash + Float.floatToIntBits(m21);
hash = 37 * hash + Float.floatToIntBits(m22);
hash = 37 * hash + Float.floatToIntBits(m23);
hash = 37 * hash + Float.floatToIntBits(m30);
hash = 37 * hash + Float.floatToIntBits(m31);
hash = 37 * hash + Float.floatToIntBits(m32);
hash = 37 * hash + Float.floatToIntBits(m33);
return hash;
}
/**
* are these two matrices the same? they are is they both have the same mXX values.
*
* @param o
* the object to compare for equality
* @return true if they are equal
*/
public boolean equals(Object o) {
if (!(o instanceof Matrix4f) || o == null) {
return false;
}
if (this == o) {
return true;
}
Matrix4f comp = (Matrix4f) o;
if (Float.compare(m00,comp.m00) != 0) return false;
if (Float.compare(m01,comp.m01) != 0) return false;
if (Float.compare(m02,comp.m02) != 0) return false;
if (Float.compare(m03,comp.m03) != 0) return false;
if (Float.compare(m10,comp.m10) != 0) return false;
if (Float.compare(m11,comp.m11) != 0) return false;
if (Float.compare(m12,comp.m12) != 0) return false;
if (Float.compare(m13,comp.m13) != 0) return false;
if (Float.compare(m20,comp.m20) != 0) return false;
if (Float.compare(m21,comp.m21) != 0) return false;
if (Float.compare(m22,comp.m22) != 0) return false;
if (Float.compare(m23,comp.m23) != 0) return false;
if (Float.compare(m30,comp.m30) != 0) return false;
if (Float.compare(m31,comp.m31) != 0) return false;
if (Float.compare(m32,comp.m32) != 0) return false;
if (Float.compare(m33,comp.m33) != 0) return false;
return true;
}
public void write(JMEExporter e) throws IOException {
OutputCapsule cap = e.getCapsule(this);
cap.write(m00, "m00", 1);
cap.write(m01, "m01", 0);
cap.write(m02, "m02", 0);
cap.write(m03, "m03", 0);
cap.write(m10, "m10", 0);
cap.write(m11, "m11", 1);
cap.write(m12, "m12", 0);
cap.write(m13, "m13", 0);
cap.write(m20, "m20", 0);
cap.write(m21, "m21", 0);
cap.write(m22, "m22", 1);
cap.write(m23, "m23", 0);
cap.write(m30, "m30", 0);
cap.write(m31, "m31", 0);
cap.write(m32, "m32", 0);
cap.write(m33, "m33", 1);
}
public void read(JMEImporter e) throws IOException {
InputCapsule cap = e.getCapsule(this);
m00 = cap.readFloat("m00", 1);
m01 = cap.readFloat("m01", 0);
m02 = cap.readFloat("m02", 0);
m03 = cap.readFloat("m03", 0);
m10 = cap.readFloat("m10", 0);
m11 = cap.readFloat("m11", 1);
m12 = cap.readFloat("m12", 0);
m13 = cap.readFloat("m13", 0);
m20 = cap.readFloat("m20", 0);
m21 = cap.readFloat("m21", 0);
m22 = cap.readFloat("m22", 1);
m23 = cap.readFloat("m23", 0);
m30 = cap.readFloat("m30", 0);
m31 = cap.readFloat("m31", 0);
m32 = cap.readFloat("m32", 0);
m33 = cap.readFloat("m33", 1);
}
public Class<? extends Matrix4f> getClassTag() {
return this.getClass();
}
/**
* @return true if this matrix is identity
*/
public boolean isIdentity() {
return
(m00 == 1 && m01 == 0 && m02 == 0 && m03 == 0) &&
(m10 == 0 && m11 == 1 && m12 == 0 && m13 == 0) &&
(m20 == 0 && m21 == 0 && m22 == 1 && m23 == 0) &&
(m30 == 0 && m31 == 0 && m32 == 0 && m33 == 1);
}
/**
* Apply a scale to this matrix.
*
* @param scale
* the scale to apply
*/
public void scale(Vector3f scale) {
m00 *= scale.getX();
m10 *= scale.getX();
m20 *= scale.getX();
m30 *= scale.getX();
m01 *= scale.getY();
m11 *= scale.getY();
m21 *= scale.getY();
m31 *= scale.getY();
m02 *= scale.getZ();
m12 *= scale.getZ();
m22 *= scale.getZ();
m32 *= scale.getZ();
}
static final boolean equalIdentity(Matrix4f mat) {
if (Math.abs(mat.m00 - 1) > 1e-4) return false;
if (Math.abs(mat.m11 - 1) > 1e-4) return false;
if (Math.abs(mat.m22 - 1) > 1e-4) return false;
if (Math.abs(mat.m33 - 1) > 1e-4) return false;
if (Math.abs(mat.m01) > 1e-4) return false;
if (Math.abs(mat.m02) > 1e-4) return false;
if (Math.abs(mat.m03) > 1e-4) return false;
if (Math.abs(mat.m10) > 1e-4) return false;
if (Math.abs(mat.m12) > 1e-4) return false;
if (Math.abs(mat.m13) > 1e-4) return false;
if (Math.abs(mat.m20) > 1e-4) return false;
if (Math.abs(mat.m21) > 1e-4) return false;
if (Math.abs(mat.m23) > 1e-4) return false;
if (Math.abs(mat.m30) > 1e-4) return false;
if (Math.abs(mat.m31) > 1e-4) return false;
if (Math.abs(mat.m32) > 1e-4) return false;
return true;
}
// XXX: This tests more solid than converting the q to a matrix and multiplying... why?
public void multLocal(Quaternion rotation) {
Vector3f axis = new Vector3f();
float angle = rotation.toAngleAxis(axis);
Matrix4f matrix4f = new Matrix4f();
matrix4f.fromAngleAxis(angle, axis);
multLocal(matrix4f);
}
@Override
public Matrix4f clone() {
try {
return (Matrix4f) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError(); // can not happen
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -