📄 matrix3f.java
字号:
*
* @param i
* the row to set.
* @param row
* the data to set.
*/
public void setRow(int i, Vector3f row) {
if (row == null) {
logger.warning("Row is null. Ignoring.");
return;
}
switch (i) {
case 0:
m00 = row.x;
m01 = row.y;
m02 = row.z;
break;
case 1:
m10 = row.x;
m11 = row.y;
m12 = row.z;
break;
case 2:
m20 = row.x;
m21 = row.y;
m22 = row.z;
break;
default:
logger.warning("Invalid row index.");
throw new JmeException("Invalid row index. " + i);
}
}
/**
* <code>set</code> places a given value into the matrix at the given
* position. If the position is invalid a <code>JmeException</code> is
* thrown.
*
* @param i
* the row index.
* @param j
* the colum index.
* @param value
* the value for (i, j).
*/
public void set(int i, int j, float value) {
switch (i) {
case 0:
switch (j) {
case 0: m00 = value; return;
case 1: m01 = value; return;
case 2: m02 = value; return;
}
case 1:
switch (j) {
case 0: m10 = value; return;
case 1: m11 = value; return;
case 2: m12 = value; return;
}
case 2:
switch (j) {
case 0: m20 = value; return;
case 1: m21 = value; return;
case 2: m22 = value; return;
}
}
logger.warning("Invalid matrix index.");
throw new JmeException("Invalid indices into matrix.");
}
/**
*
* <code>set</code> sets the values of the matrix to those supplied by the
* 3x3 two dimenion array.
*
* @param matrix
* the new values of the matrix.
* @throws JmeException
* if the array is not of size 9.
*/
public void set(float[][] matrix) {
if (matrix.length != 3 || matrix[0].length != 3) { throw new JmeException(
"Array must be of size 9."); }
m00 = matrix[0][0];
m01 = matrix[0][1];
m02 = matrix[0][2];
m10 = matrix[1][0];
m11 = matrix[1][1];
m12 = matrix[1][2];
m20 = matrix[2][0];
m21 = matrix[2][1];
m22 = matrix[2][2];
}
/**
* Recreate Matrix using the provided axis.
*
* @param uAxis
* Vector3f
* @param vAxis
* Vector3f
* @param wAxis
* Vector3f
*/
public void fromAxes(Vector3f uAxis, Vector3f vAxis, Vector3f wAxis) {
m00 = uAxis.x;
m10 = uAxis.y;
m20 = uAxis.z;
m01 = vAxis.x;
m11 = vAxis.y;
m21 = vAxis.z;
m02 = wAxis.x;
m12 = wAxis.y;
m22 = wAxis.z;
}
/**
* <code>set</code> sets the values of this matrix from an array of
* values assuming that the data is rowMajor order;
*
* @param matrix
* the matrix to set the value to.
*/
public void set(float[] matrix) {
set(matrix, true);
}
/**
* <code>set</code> sets the values of this matrix from an array of
* values;
*
* @param matrix
* the matrix to set the value to.
* @param rowMajor
* whether the incoming data is in row or column major order.
*/
public void set(float[] matrix, boolean rowMajor) {
if (matrix.length != 9) throw new JmeException(
"Array must be of size 9.");
if (rowMajor) {
m00 = matrix[0];
m01 = matrix[1];
m02 = matrix[2];
m10 = matrix[3];
m11 = matrix[4];
m12 = matrix[5];
m20 = matrix[6];
m21 = matrix[7];
m22 = matrix[8];
} else {
m00 = matrix[0];
m01 = matrix[3];
m02 = matrix[6];
m10 = matrix[1];
m11 = matrix[4];
m12 = matrix[7];
m20 = matrix[2];
m21 = matrix[5];
m22 = matrix[8];
}
}
/**
*
* <code>set</code> defines the values of the matrix based on a supplied
* <code>Quaternion</code>. It should be noted that all previous values
* will be overridden.
*
* @param quaternion
* the quaternion to create a rotational matrix from.
*/
public void set(Quaternion quaternion) {
quaternion.toRotationMatrix(this);
}
/**
* <code>loadIdentity</code> sets this matrix to the identity matrix.
* Where all values are zero except those along the diagonal which are one.
*
*/
public void loadIdentity() {
m01 = m02 = m10 = m12 = m20 = m21 = 0;
m00 = m11 = m22 = 1;
}
/**
* @return true if this matrix is identity
*/
public boolean isIdentity() {
return
(m00 == 1 && m01 == 0 && m02 == 0) &&
(m10 == 0 && m11 == 1 && m12 == 0) &&
(m20 == 0 && m21 == 0 && m22 == 1);
}
/**
* <code>fromAngleAxis</code> sets this matrix4f to the values specified
* by an angle and an axis of rotation. This method creates an object, so
* use fromAngleNormalAxis if your axis is already normalized.
*
* @param angle
* the angle to rotate (in radians).
* @param axis
* the axis of rotation.
*/
public void fromAngleAxis(float angle, Vector3f axis) {
Vector3f normAxis = axis.normalize();
fromAngleNormalAxis(angle, normAxis);
}
/**
* <code>fromAngleNormalAxis</code> sets this matrix4f to the values
* specified by an angle and a normalized axis of rotation.
*
* @param angle
* the angle to rotate (in radians).
* @param axis
* the axis of rotation (already normalized).
*/
public void fromAngleNormalAxis(float angle, Vector3f axis) {
float fCos = FastMath.cos(angle);
float fSin = FastMath.sin(angle);
float fOneMinusCos = ((float)1.0)-fCos;
float fX2 = axis.x*axis.x;
float fY2 = axis.y*axis.y;
float fZ2 = axis.z*axis.z;
float fXYM = axis.x*axis.y*fOneMinusCos;
float fXZM = axis.x*axis.z*fOneMinusCos;
float fYZM = axis.y*axis.z*fOneMinusCos;
float fXSin = axis.x*fSin;
float fYSin = axis.y*fSin;
float fZSin = axis.z*fSin;
m00 = fX2*fOneMinusCos+fCos;
m01 = fXYM-fZSin;
m02 = fXZM+fYSin;
m10 = fXYM+fZSin;
m11 = fY2*fOneMinusCos+fCos;
m12 = fYZM-fXSin;
m20 = fXZM-fYSin;
m21 = fYZM+fXSin;
m22 = fZ2*fOneMinusCos+fCos;
}
/**
* <code>mult</code> multiplies this matrix by a given matrix. The result
* matrix is returned as a new object. If the given matrix is null, a null
* matrix is returned.
*
* @param mat
* the matrix to multiply this matrix by.
* @return the result matrix.
*/
public Matrix3f mult(Matrix3f mat) {
return mult(mat, null);
}
/**
* <code>mult</code> multiplies this matrix by a given matrix. The result
* matrix is returned as a new object.
*
* @param mat
* the matrix to multiply this matrix by.
* @param product
* the matrix to store the result in. if null, a new matrix3f is
* created. It is safe for mat and product to be the same object.
* @return a matrix3f object containing the result of this operation
*/
public Matrix3f mult(Matrix3f mat, Matrix3f product) {
float temp00, temp01, temp02;
float temp10, temp11, temp12;
float temp20, temp21, temp22;
if (product == null) product = new Matrix3f();
temp00 = m00 * mat.m00 + m01 * mat.m10 + m02 * mat.m20;
temp01 = m00 * mat.m01 + m01 * mat.m11 + m02 * mat.m21;
temp02 = m00 * mat.m02 + m01 * mat.m12 + m02 * mat.m22;
temp10 = m10 * mat.m00 + m11 * mat.m10 + m12 * mat.m20;
temp11 = m10 * mat.m01 + m11 * mat.m11 + m12 * mat.m21;
temp12 = m10 * mat.m02 + m11 * mat.m12 + m12 * mat.m22;
temp20 = m20 * mat.m00 + m21 * mat.m10 + m22 * mat.m20;
temp21 = m20 * mat.m01 + m21 * mat.m11 + m22 * mat.m21;
temp22 = m20 * mat.m02 + m21 * mat.m12 + m22 * mat.m22;
product.m00 = temp00;
product.m01 = temp01;
product.m02 = temp02;
product.m10 = temp10;
product.m11 = temp11;
product.m12 = temp12;
product.m20 = temp20;
product.m21 = temp21;
product.m22 = temp22;
return product;
}
/**
* <code>mult</code> multiplies this matrix by a given
* <code>Vector3f</code> object. The result vector is returned. If the
* given vector is null, null will be returned.
*
* @param vec
* the vector to multiply this matrix by.
* @return the result vector.
*/
public Vector3f mult(Vector3f vec) {
return mult(vec, null);
}
/**
* Multiplies this 3x3 matrix by the 1x3 Vector vec and stores the result in
* product.
*
* @param vec
* The Vector3f to multiply.
* @param product
* The Vector3f to store the result, it is safe for this to be
* the same as vec.
* @return The given product vector.
*/
public Vector3f mult(Vector3f vec, Vector3f product) {
if (null == product) {
product = new Vector3f();
}
float x = vec.x;
float y = vec.y;
float z = vec.z;
product.x = m00 * x + m01 * y + m02 * z;
product.y = m10 * x + m11 * y + m12 * z;
product.z = m20 * x + m21 * y + m22 * z;
return product;
}
/**
* <code>multLocal</code> multiplies this matrix internally by
* a given float scale factor.
*
* @param scale
* the value to scale by.
* @return this Matrix3f
*/
public Matrix3f multLocal(float scale) {
m00 *= scale;
m01 *= scale;
m02 *= scale;
m10 *= scale;
m11 *= scale;
m12 *= scale;
m20 *= scale;
m21 *= scale;
m22 *= scale;
return this;
}
/**
* <code>multLocal</code> multiplies this matrix by a given
* <code>Vector3f</code> object. The result vector is stored inside the
* passed vector, then returned . If the given vector is null, null will be
* returned.
*
* @param vec
* the vector to multiply this matrix by.
* @return The passed vector after multiplication
*/
public Vector3f multLocal(Vector3f vec) {
if (vec == null) return null;
float x = vec.x;
float y = vec.y;
vec.x = m00 * x + m01 * y + m02 * vec.z;
vec.y = m10 * x + m11 * y + m12 * vec.z;
vec.z = m20 * x + m21 * y + m22 * vec.z;
return vec;
}
/**
* <code>mult</code> multiplies this matrix by a given matrix. The result
* matrix is saved in the current matrix. If the given matrix is null,
* nothing happens. The current matrix is returned. This is equivalent to
* this*=mat
*
* @param mat
* the matrix to multiply this matrix by.
* @return This matrix, after the multiplication
*/
public Matrix3f multLocal(Matrix3f mat) {
return mult(mat, this);
}
/**
* Transposes this matrix in place. Returns this matrix for chaining
*
* @return This matrix after transpose
*/
public Matrix3f transposeLocal() {
float[] tmp = new float[9];
get(tmp, false);
set(tmp, true);
return this;
}
/**
* Inverts this matrix as a new Matrix3f.
*
* @return The new inverse matrix
*/
public Matrix3f invert() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -