Java LWJGL - 垂直射击错误

时间:2013-02-17 20:03:32

标签: java rotation position lwjgl

所以我制作了自己的FPS,图形和枪支以及所有这些很酷的东西;当我们射击时,子弹应在十字准线内随机取向,如下所定义:

    float randomX=(float)Math.random()*(0.08f*guns[currentWeapon].currAcc)-(0.04f*guns[currentWeapon].currAcc);
    float randomY=(float)Math.random()*(0.08f*guns[currentWeapon].currAcc)-(0.04f*guns[currentWeapon].currAcc);

    bulletList.add(new Bullet(new float[]{playerXpos, playerYpos, playerZpos}, new float[]{playerXrot+randomX, playerYrot+randomY}, (float) 0.5));

我们计算X和Y中的随机性(假设你的十字准线大小(枪支[currentWeapon] .currAcc)为10,然后子弹可以向任何一侧移动0.4并且它将保留在十字准线内。 计算完之后,我们将玩家位置作为子弹的起始位置,以及它的意图(具有额外随机性的玩家方向),最后是速度(不重要的是atm,tho)。 / p>

现在,每个框架,子弹都必须移动,所以我们称之为每个子弹:

position[0] -= (float)Math.sin(direction[1]*piover180) * (float)Math.cos(direction[0]*piover180) * speed;
position[2] -= (float)Math.cos(direction[1]*piover180) * (float)Math.cos(direction[0]*piover180) * speed;

position[1] += (float)Math.sin(direction[0]*piover180) * speed;

因此,对于X和Z位置,子弹根据玩家在Y轴和X轴上的旋转而移动(假设您在水平方向上看到Z,在X上看0度,在Y上看0; X将移动0 * 1 *速度和Z将移动1 * 1 *速度。

对于Y位置,子弹根据X轴上的旋转移动(在-90和90之间变化),这意味着如果玩家正在水平观看或者如果玩家正在垂直观看,则它会保持在相同的高度。 / p>

现在,问题如下: 如果我横向拍摄,一切都很美妙。如https://dl.dropbox.com/u/16387578/horiz.jpg

所示,子弹在十字线上蔓延

问题是,如果我开始向上看,子弹开始集中在中心周围,并使这条垂直线进一步向天空看去。 https://dl.dropbox.com/u/16387578/verti.jpg 第一幅图像在X轴上约为40º,第二幅图像稍微高一点,最后一张图像在垂直方向上。

我在这里做错了什么?我设计这个解决方案我自己可以非常肯定我搞砸了某个地方,但我无法弄清楚:/

2 个答案:

答案 0 :(得分:0)

基本上垂直偏移计算(浮点)Math.cos(方向[0] * piover180)弄乱了X和Z运动,因为它们都被减少到0.子弹会形成垂直线,因为它们' d随机旋转X轴。我的解决方案是在垂直偏移计算之后添加随机性,因此它们在您触发它们之后仍然左右和上下。

我还必须添加一个额外的随机值,否则你只需画一条对角线或十字架。

    float randomX=(float)Math.random()*(0.08f*guns[currentWeapon].currAcc)-(0.04f*guns[currentWeapon].currAcc);
    float randomY=(float)Math.random()*(0.08f*guns[currentWeapon].currAcc)-(0.04f*guns[currentWeapon].currAcc);
    float randomZ=(float)Math.random()*(0.08f*guns[currentWeapon].currAcc)-(0.04f*guns[currentWeapon].currAcc);

    bulletList.add(new Bullet(new float[]{playerXpos, playerYpos, playerZpos}, new float[]{playerXrot, playerYrot}, new float[]{randomX,randomY, randomZ},(float) 0.5));

移动代码......

    vector[0]= -((float)Math.sin(dir[1]*piover180) * (float)Math.cos(dir[0]*piover180)+(float)Math.sin(random[1]*piover180)) * speed;
    vector[1]= ((float)Math.sin(dir[0]*piover180)+(float)Math.sin(random[0]*piover180)) * speed;
    vector[2]= -((float)Math.cos(dir[1]*piover180) * (float)Math.cos(dir[0]*piover180)+(float)Math.sin(random[2]*piover180)) * speed;

答案 1 :(得分:0)

你不需要破坏任何复杂的数学运算,你的问题是当你绕着y轴旋转子弹以进行喷枪扩散时,如果你是直接向上看(也就是说,通过y轴,子弹正在绕着它前进的路径旋转,这意味着没有任何旋转(想象将你的手臂向前伸向墙壁并旋转成一个圆圈,并将你的手臂伸向天空并旋转成一个圆圈之间的区别。请注意当你指向天空(Y轴)时,你的手根本不会移动,所以你得到那些“对角线”的子弹传播。

诀窍是按照玩家正在查看的方向旋转之前传播,因为这样你就知道当你为了传播而旋转时,矢量保证是垂直的到x轴和y轴。

  this.vel = new THREE.Vector3(0,0,-1);
  var angle = Math.random() * Math.PI * 2;
  var mag = Math.random() * this.gun.accuracy;
  this.spread = new THREE.Vector2(Math.cos(angle) * mag,Math.sin(angle) * mag);
  this.vel.applyAxisAngle(new THREE.Vector3(0,1,0),this.spread.y / 100); //rotate first when angle gaurenteed to be perpendicular to x and y axes
  this.vel.applyAxisAngle(new THREE.Vector3(1,0,0),this.spread.x / 100); 
  this.vel.applyAxisAngle(new THREE.Vector3(1,0,0),player.looking.x); //then add player looking direction
  this.vel.applyAxisAngle(new THREE.Vector3(0,1,0),player.looking.y);
  this.offset = this.vel.clone()

我不使用java,但我希望你能通过这个javascript获得我正在做的主要想法。我正在通过spread.y和spread.x旋转向负z方向(相机的默认方向)的矢量,然后我按照玩家面对的角度的俯仰和偏航旋转。