/** * Transform vector by multiplying it by this transform and put result back * into vector. * * @param vector */ public final void transform(Vector4f vector) { if (vector.getW() != 1.0) { throw new RuntimeException("Final element of vector must be 1."); } double x = mat00 * vector.getX() + mat01 * vector.getY() + mat02 * vector.getZ() + mat03; double y = mat10 * vector.getX() + mat11 * vector.getY() + mat12 * vector.getZ() + mat13; double z = mat20 * vector.getX() + mat21 * vector.getY() + mat22 * vector.getZ() + mat23; vector.setX((float) x); vector.setY((float) y); vector.setZ((float) z); vector.setW(1.0f); }
@Override public void put(int element, float... data) { VertexFormatElement.EnumUsage usage = parent.getVertexFormat().getElement(element).getUsage(); // transform normals and position if (usage == VertexFormatElement.EnumUsage.POSITION && data.length >= 3) { Vector4f vec = new Vector4f(data); vec.setW(1.0f); transformation.transform(vec); data = new float[4]; vec.get(data); } else if (usage == VertexFormatElement.EnumUsage.NORMAL && data.length >= 3) { Vector3f vec = new Vector3f(data); normalTransformation.transform(vec); vec.normalize(); data = new float[4]; vec.get(data); } super.put(element, data); }
@Override public void put(int element, float... data) { VertexFormatElement.EnumUsage usage = parent.getVertexFormat().getElement(element).getUsage(); // transform normals and position if (usage == VertexFormatElement.EnumUsage.POSITION && data.length >= 3) { Vector4f vec = new Vector4f(data); vec.setW(1.0f); transformation.transform(vec); data = new float[4]; vec.get(data); } else if (usage == VertexFormatElement.EnumUsage.NORMAL && data.length >= 3) { Vector3f vec = new Vector3f(data); normalTransformation.transform(vec); vec.normalize(); data = new float[4]; vec.get(data); } super.put(element, data); }
public static Vector4f generateRandomVector4f(Random random, Tuple4f lowerBound, Tuple4f upperBound) { Vector4f ret = new Vector4f(); ret.setX(generateRandomFloatInRange(random, lowerBound.getX(), upperBound.getX())); ret.setY(generateRandomFloatInRange(random, lowerBound.getY(), upperBound.getY())); ret.setZ(generateRandomFloatInRange(random, lowerBound.getZ(), upperBound.getZ())); ret.setW(generateRandomFloatInRange(random, lowerBound.getW(), upperBound.getW())); return ret; }
/** * Transform vectorIn using this transform and store result in vectorOut. * * @param vectorIn * @param vectorOut */ public final void transform(Vector4f vectorIn, Vector4f vectorOut) { if (vectorIn != vectorOut) { vectorOut.setX((float) (mat00 * vectorIn.getX() + mat01 * vectorIn.getY() + mat02 * vectorIn.getZ() + mat03)); vectorOut.setY((float) (mat10 * vectorIn.getX() + mat11 * vectorIn.getY() + mat12 * vectorIn.getZ() + mat13)); vectorOut.setZ((float) (mat20 * vectorIn.getX() + mat21 * vectorIn.getY() + mat22 * vectorIn.getZ() + mat23)); vectorOut.setW(1.0f); } else { transform(vectorIn); } }
/** * Multiply a 4x4 matrix by a 4x1 vector. Since result is stored in vector, the matrix must be 4x4. * @param matrix * @param vector */ public static void mult(DenseMatrix64F matrix, Vector4f vector) { if (matrix.numCols != 4 || matrix.numRows != 4) { throw new RuntimeException("Improperly sized matrices."); } float x = vector.getX(); float y = vector.getY(); float z = vector.getZ(); float w = vector.getW(); vector.setX((float) (matrix.get(0, 0) * x + matrix.get(0, 1) * y + matrix.get(0, 2) * z + matrix.get(0, 3) * w)); vector.setY((float) (matrix.get(1, 0) * x + matrix.get(1, 1) * y + matrix.get(1, 2) * z + matrix.get(1, 3) * w)); vector.setZ((float) (matrix.get(2, 0) * x + matrix.get(2, 1) * y + matrix.get(2, 2) * z + matrix.get(2, 3) * w)); vector.setW((float) (matrix.get(3, 0) * x + matrix.get(3, 1) * y + matrix.get(3, 2) * z + matrix.get(3, 3) * w)); }