游戏导弹的定向螺旋

时间:2016-12-13 07:19:13

标签: java math 3d

我的数学不是很好但是我试图学习虽然..

我试图做的是给我的游戏导弹一个螺旋火箭效果,但我不知道如何使用Sin和Cos来使螺旋在正确的方向上发挥作用..

顺便说一句,这是一款3D游戏:

问题在于,根据导弹朝向哪个方向,螺旋看起来会变形或变平......

什么是以数学方式计算基于导弹X,Y,Z /方向的螺旋线的最佳方法?我一直试图弄清楚它很长时间:/

非常感谢!

            double x = radius * Math.cos(theta);
            double y = radius * Math.sin(theta);
            double z = radius * Math.cos(theta);
            location.add(x,y,z);
            missile.shootFlame(location,2);
            location.subtract(x,y,z);

1 个答案:

答案 0 :(得分:1)

基础载体

你需要导弹的整体方向为 3D 向量,让它称之为W。从中你需要获得另外两个彼此垂直的向量U,V。要获得它们,您可以利用跨产品。所以:

  1. 制作W单位向量

    只需W = W/|W|所以:

    l=sqrt(Wx*Wx+Wy*Wy+Wz*Wz);
    Wx/=l;
    Wy/=l;
    Wz/=l;
    
  2. 选择U作为与[{1}}不平行的任何方向

    所以从W开始,如果U=(1.0,0.0,0.0)选择U==W。如果你有任何东西需要锁定以将其用作U方向,那么坐标系将不会随时间旋转(如Up,North,Sun ...)

    U=(0.0,1.0,0.0)应该是单位,所以如果不正常化就像在#1

  3. 计算U

    它应与V垂直,因此请使用cross product:

    U,W

    单位向量的交叉乘积也是单位向量,因此无需标准化。

  4. 重新计算V = W x U

    当我们手动选择U时,我们需要确保它也与U垂直,所以:

    V,W
  5. 现在我们有3个垂直基矢量,其中U = V x W 位于螺旋螺钉的平面内,U,V是整个运动方向。

    如果您不知道如何计算叉积,请参阅:

    现在Helix很简单:

    1. <强>定义

      所以我们需要[edit2],我们需要半径U,V,W,移动速度r [units],角速度v [units/s]时间o [rad/s]和开始位置{{ 1}}。

    2. Helix等式

      我们需要的是等式返回实际位置的时间所以:

      t>=0.0 [s]

      改写为标量:

      P0
    3. [edit1]因为您无法正确复制粘贴和/或正确更改我的代码......

      ang = o*t;
      P(t) = P0 + U*r*cos(ang) + V*r*sin(ang) + W*v*t;
      

      这应该为您提供行程线性距离的螺旋点

      ang = o*t;
      x = P0x + Ux*r*cos(ang) + Vx*r*sin(ang) + Wx*v*t;
      y = P0y + Uy*r*cos(ang) + Vy*r*sin(ang) + Wy*v*t;
      z = P0z + Uz*r*cos(ang) + Vz*r*sin(ang) + Wz*v*t;
      

      螺丝:

      Vector w = loc.getDirection();
      
      double wX = w.getX();
      double wY = w.getY();
      double wZ = w.getZ();
      double l = Math.sqrt((wX * wX) + (wY * wY) + (wZ * wZ));
      wX = wX / l;
      wY = wY / l;
      wZ = wZ / l;
      w = new Vector(wX,wY,wZ); // you forget to change W and use it latter ...
      
      Vector u = new Vector(0, 1.0, 0);  
      if (Math.abs(wX)<1e-3) // if U and W are the same chose different U
       if (Math.abs(wZ)<1e-3)
        u = new Vector(1.0, 0.0, 0);
      
      Vector v = w.crossProduct(u);
      u = v.crossProduct(w);
      
      double radius = 10; // helix radius [units]
      double speed = 2.00; // movement speed [unit/s]
      double omega = 0.628; // angular speed [rad/s]
      //double omega = 36.0; // angular speed [deg/s]
      for (double i = 0; i < 100; i += 1.0) // time [s]
       {
       double angle = omega * i; // actual screw position [rad] or [deg]
       double x = u.getX() * radius * Math.cos(angle) + v.getX() * radius * Math.sin(angle) + wX * speed * i;
       double y = u.getY() * radius * Math.cos(angle) + v.getY() * radius * Math.sin(angle) + wY * speed * i;
       double z = u.getZ() * radius * Math.cos(angle) + v.getZ() * radius * Math.sin(angle) + wZ * speed * i;
       loc.add(x,y,z); // What is this? should not you set the x,y,z instead of adding?
       //do work
       loc.subtract(x,y,z); // what is this?
       }
      

      不要忘记重新输入/输出正确的speed*imax = 2.0*100.0 = 200.0 units 行(我选择[rad],因为我的数学库使用的是我所使用的)。不确定如果我正确地翻译到你的环境可能会有像omega*imax/(2*Pi) ~= 0.628*100.0/6.28 ~= 10 screws // in case of sin,cos want [rad] omega*imax/360.0 = 36.0*100.0/360 = 10.0 screws // in case of sin,cos want [deg] 有不同名称的错误或omega可以在中间或仅变量声明等上完成,我不知道因为我不编码它