如何使子弹在三维空间中向一个点移动

5
我目前正在使用Java LWJGL制作一款3D第一人称射击游戏。我想把一个子弹朝着世界上指定的点旋转和移动。我成功让子弹在Y轴上旋转,但无法在X轴和Z轴上旋转。我如何让子弹在Z轴和X轴上旋转,然后朝着指定点移动?
以下是我的子弹类代码:
package entities;

import org.lwjgl.util.vector.Vector3f;

import models.TexturedModel;
import renderEngine.DisplayManager;
import toolbox.MousePicker;

public class Bullet extends Entity{

private static Vector3f currentRay = new Vector3f();
private static final float RAY_RANGE = 600;
public static boolean reset = true;
public Bullet(TexturedModel model, Vector3f position, float rotX, float rotY, float rotZ, float scale) {
    super(model, position, rotX, rotY, rotZ, scale);

}
public void move(Bullet b){
    float distance =  2 * DisplayManager.getFrameTimeSeconds();
    currentRay = MousePicker.calculateMouseRay();
    Vector3f endPoint = MousePicker.getPointOnRay(currentRay, 10000);
    //I want my Bullet to move towards the Vector3f endPoint

    float zDistance = endPoint.z - this.getPosition().z;
    float xDistance = endPoint.x - this.getPosition().x;
    double angleToTurn = Math.toDegrees(Math.atan2(xDistance,     zDistance));
    this.setRotY((float)angleToTurn);
    float dx = (float) (distance * Math.sin(Math.toRadians(super.getRotY())));
    float dz = (float) (distance * Math.cos(Math.toRadians(super.getRotY())));

    super.increasePosition(dx, 0, dz);


}
    }

你确定要获取三个角度来旋转吗? 也许你可以考虑将瞬时速度设置为: targetPosition.sub(bulletPossition).normalize().scalarMult(bullet.maxSpeed) 然后在每个更新循环中将这个瞬时速度添加到位置上 (如果Vector3f提供的方法不完全相同,对不起,我已经有一段时间没有使用了 :))。 - Pignic
目标位置是什么? - Disser
抱歉,这是您调用的终点endPoint。 - Pignic
scalarMult()不想工作。 - Disser
也许我弄错了,bullet.maxSpeed 是一个浮点数吗? - Disser
正确的方法是使用scale而不是scalarMult,但思路是相同的,将归一化向量乘以一些速度以获得即时速度(如果您的子弹的最大速度以worldUnit每秒为单位,则可能还应该将速度除以FPS数)。 - Pignic
1个回答

4
你需要做的是获取使子弹靠近目标(这里是鼠标)endPoint所需的速度。
首先,你需要获取两个点之间的向量endPoint.sub(position);
然后你需要对其进行normalize()处理以获得方向。
你需要将其与所需速度进行scale()处理以获得即时速度。
最后,使用super.increasePosition(speed.x, speed.y, speed.z)让它朝着目标移动。

2
非常感谢!在经历了两个月的挫折后,它终于奏效了! - Disser
可以吗?您能否通过验证我的答案来关闭帖子?;) - Pignic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接