在LWJGL3中使用lerp?

时间:2017-12-28 09:29:40

标签: java lwjgl

如何在lerp课程中使用我的vector3f功能?目前lerp函数如下所示:

public Vector3f lerp(Vector3f other, float alpha) {
    return this.scale(1f - alpha).add(other.scale(alpha));
}

我有positionvelocity个向量,它们会在更新时使用add函数。现在我想要一些平滑的动作,但是,我不确定你将如何正确使用lerp。我已经看过并阅读了一些教程,但似乎都没有解决这种功能。任何帮助将不胜感激。

更新

所以我一直在看这个视频here他有一系列关于lerp的视频,带有非常好的图表演示,这给了我关于线性插值如何工作的线索,所以我决定再给它一个射击。我写了一个新的Vector2f方法。

    public Vector2f lerpT(Vector2f currentPos, Vector2f newPos, float alpha)
{
    return currentPos.scale(1f - alpha).add(newPos.scale(alpha));
    //return Vector3f point1 + alpha * (point2 - point1);
}

我的主要课程是这样的:

public class Main {

    public static void main(String[] args) throws IOException {
    init();
}

public static void init() {

    Vector2f currentPosition = new Vector2f(0.3f,0.7f);
    Vector2f newPosition = new Vector2f(1.3f,0.8f);

    Vector2f lerpPos = new Vector2f().lerpT(currentPosition, newPosition, 0f);

    System.out.println("Testing LERP: " + "5/01/2018" + "\n");
    System.out.println(lerpPos.x);
    System.out.println(lerpPos.y);

}

这是打印到控制台的内容。

X:0.79999995 Y:0.75

我找到了一些方格纸,并决定将其映射为有用的。我用计算器计算公式,并在代码中计算的x和y的lerpPos向量中得到相同的值。我还将其更改为Vector2f以使其更简单。而不是LWJGL我决定在java中创建一个简单的控制台程序。虽然我理解了一点,但我不确定我应该如何使用具有lerp功能的速度矢量,所以我可以给出一些加速度(?)。我看到公式中的alpha是如何重要的,但我不确定如何利用它。如果有的话,我想尝试一些缓和和放松,但是在这一刻,所需要的巫术似乎有点过头了。哦,我会一直在努力。

我要将完成的代码发布到我的github,当我启动并运行时,我会在这里发布一个链接。再次,任何帮助都会非常感激

更新:

public class Player {

private TexturedModel model;
public Vector3f position;
public Vector3f velocity;
public Vector3f acceleration;
public static Vector3f direction;


public static float maxVelocity = 0.5f;
private float rotX, rotY, rotZ;
private float scaleX, scaleY, scaleZ;
private float maxHolder;
public Player(TexturedModel model, Vector3f position, float rotX, float rotY, float rotZ,
        float scaleX, float scaleY, float scaleZ) {
    this.model = model;
    this.rotX = rotX;
    this.rotY = rotY;
    this.rotZ = rotZ;
    this.scaleX = scaleX;
    this.scaleY = scaleY;
    this.scaleZ = scaleZ;
    this.position = position;

    Random random = new Random();

    position = new Vector3f();
    velocity = new Vector3f();
    acceleration = new Vector3f();
    direction = new Vector3f();
}

public void update() {
    velocity = velocity.add(acceleration);
    position = position.add(velocity);
    maxHolder = maxVelocity;
    //position.length()

    //Limit
    if (velocity.length() > maxVelocity) {
            velocity = velocity.normalize().scale(maxVelocity);
        }
        else if (velocity.dot(direction) < 0.0) {
            velocity = new Vector3f(0,0,0);
        }

}


public void movePlayer() {

    if (KeyboardInput.isKeyDown(GLFW_KEY_D)) {
        this.acceleration.x = 0.001f;

    }

    if (KeyboardInput.isKeyDown(GLFW_KEY_A)) {
        this.acceleration.x = -0.001f;

    }

    if (KeyboardInput.isKeyDown(GLFW_KEY_W)) {
        this.acceleration.y = 0.001f;

    }

    if (KeyboardInput.isKeyDown(GLFW_KEY_S)) {
        this.acceleration.y = -0.001f;

    }

    if (!KeyboardInput.isKeyDown(GLFW_KEY_W) && !KeyboardInput.isKeyDown(GLFW_KEY_S) && !KeyboardInput.isKeyDown(GLFW_KEY_D) && !KeyboardInput.isKeyDown(GLFW_KEY_A)){ 
        this.velocity.x = 0;
        this.velocity.y = 0;
        this.velocity.z = 0;
        this.acceleration.x = 0f;
        this.acceleration.y = 0;
        this.acceleration.z = 0;
    }
}
public void applyForce(Vector3f force) {
    acceleration = force;
}

public void increasePosition(float dx, float dy, float dz) {
    this.velocity.x += dx;
    this.velocity.y += dy;
    this.velocity.z += dz;
}

public void increaseRotation(float dx, float dy, float dz) {
    this.rotX += dx;
    this.rotY += dy;
    this.rotZ += dz;
}

public TexturedModel getModel() {
    return model;
}

public void setModel(TexturedModel model) {
    this.model = model;
}

public void setVelocity(Vector3f velocity) {
    this.velocity = velocity;
}

public Vector3f getPosition() {
    return position;
}

public void setPosition(Vector3f position) {
    this.position = position;
}

public float getRotX() {
    return rotX;
}

public void setRotX(float rotX) {
    this.rotX = rotX;
}

public float getRotY() {
    return rotY;
}

public void setRotY(float rotY) {
    this.rotY = rotY;
}

public float getRotZ() {
    return rotZ;
}

public void setRotZ(float rotZ) {
    this.rotZ = rotZ;
}

public float getScaleX() {
    return scaleX;
}

public void setScaleX(float scaleX) {
    this.scaleX = scaleX;
}

public float getScaleY() {
    return scaleY;
}

public void setScaleY(float scaleY) {
    this.scaleY = scaleY;
}

public float getScaleZ() {
    return scaleZ;
}

public void setScaleZ(float scaleZ) {
    this.scaleZ = scaleZ;
}

}

下面是当前的代码:当我放开键时,它加速但速度快速回到0。我希望它减速。从概念上讲,它应该很容易。

0 个答案:

没有答案