我正在尝试在java中编写一个glm移植。
目前我创建了一个包jglm,在这个包里面有所有不同的类Mat4,Vec4,Vec3等。
如:
public class Mat {
protected float[] matrix;
protected int order;
}
我可以通过输入
来打电话给他们jgml.Mat4 modelviewMatrix = new Jgml.Mat4(1.0f);
这很好..
现在我也在写一些方法,比如
mix(x, y, lerp)
我也想按照规定使用它,即
float value = jglm.mix(x, y, lerp)
但当然在这种情况下,Jglm必须是一个班级......
有没有办法将这两件事结合在一起?
编辑:如果我创建了一个类jglm.Jglm
package jglm;
/**
*
* @author gbarbieri
*/
public class Jglm {
public class Mat {
protected float[] matrix;
protected int order;
}
public class Mat4 extends Mat {
public Vec4 c0;
public Vec4 c1;
public Vec4 c2;
public Vec4 c3;
public Mat4(float value) {
order = 4;
matrix = new float[16];
for (int i = 0; i < 4; i++) {
matrix[i * 5] = value;
}
c0 = new Vec4(matrix, 0);
c1 = new Vec4(matrix, 4);
c2 = new Vec4(matrix, 8);
c3 = new Vec4(matrix, 12);
}
public float[] toFloatArray() {
return new float[]{
c0.x, c0.y, c0.z, c0.w,
c1.x, c1.y, c1.z, c1.w,
c2.x, c2.y, c2.z, c2.w,
c3.x, c3.y, c3.z, c3.w,};
}
}
public static float mix(float start, float end, float lerp) {
return (start + lerp * (end - start));
}
}
当我尝试实例化
时cameraToClipMatrix_mat4 = new Jglm.Mat4(1.0f);
我得到“包含Jglm.Mat4的封闭实例”
答案 0 :(得分:2)
将Mat
类中的所有方法声明为static
在声明中有静态修饰符,应该使用类名调用,而不需要创建类的实例。
例如:ClassName.methodName(args)
请参阅http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
中的类方法答案 1 :(得分:2)
目前我创建了一个包Jglm,在这个包里面有所有不同的类Mat4,Vec4,Vec3等。
在Java中,包必须全部以小写命名。以您的方式命名它会让任何查看代码的人感到惊讶,也可能会给编译器带来严重的名称解析问题。
导入我们正在使用的所有类也是习惯,所以我们只是通过代码中的简单名称来引用它们。也许你可以考虑宣布
package org.example.jglm;
public class Jglm {
public static void mix(double x, double y, Lerp lerp) {
...
}
}
在客户端,你会写
import org.example.Jglm;
void someMethod() {
Jglm.mix(x,y,lerp);
}
通常,当您在代码中需要一些纯函数时,请将它们声明为static
方法。查看java.lang.Math
源代码以获取指导。
答案 2 :(得分:1)
将Jglm类中的所有方法都设置为static将启用方法调用,包括实例和类名。