0

我正在尝试在 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 的封闭实例

4

3 回答 3

2

Mat将类中的所有方法声明 为static

在声明中带有 static 修饰符的,应该使用类名调用,而不需要创建类的实例。

前任:ClassName.methodName(args)

请参阅http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html中的类方法

于 2013-07-08T08:47:59.810 回答
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源代码以获取指导。

于 2013-07-08T08:53:01.847 回答
1

将 Jglm 类中的所有方法都设为静态将启用方法调用,包括实例和类名。

于 2013-07-08T08:49:55.633 回答