我正在开发一个 3D 太空游戏,其中相机处于恒定的 2D(自上而下)状态。我能够向以给定速度移动的目标发射速度(s)的射弹,并且每次都击中它。伟大的!好吧,如果那个目标在父母周围有一个角速度呢?我注意到如果目标有一个正在旋转的父对象,我的投影不正确,因为它没有考虑角速度。
我的初始代码是围绕以下假设构建的:
Position_target + Velocity_target * t = Position_shooter + Velocity_shooter * t + Bulletspeed * t
我假设射手是静止的(或可能在移动)并且需要以恒定的幅度发射子弹。
我将上述简化为
Delta_Position = Position_target - Position_shooter
Delta_Velocity = Velocity_target - Velocity_shooter
Delta_Position + Delta_Velocity * t = BulletSpeed * t
对两边求平方,我得到一个二次方程,我可以在给定行列式结果或零的情况下求解 t。这很完美。我返回值,然后将目标的位置和当前速度投影到那个 t,然后我有炮塔脚本,它以给定的角速度向那个点旋转。如果炮塔说它在所有轴上的 1% 范围内看那个点,它会以速度发射子弹,如果目标不改变其航向或速度,它会 100% 命中。
我开始在我的飞船/小行星上添加组件,这些组件是父对象的子对象,例如连接到飞船的炮塔,炮塔本身就是目标。如果船围绕轴(例如 Y 轴)旋转并且炮塔不在 x=0 和 z=0 处,我的投影不再起作用。我认为使用 r * sin ( theta + omega * t) 作为 X 位置的角速度分量和 r * cos ( theta + omega * t) 作为 Z 位置的角速度分量可以工作。Theta 是当前旋转(相对于世界坐标),而 omega 是围绕 y 轴的 eulerAngle 旋转。
我很快意识到这只适用于绕 y 轴旋转,我不能将 sin 放入二次方程,因为我不能从中提取 t,所以我不能真正正确地投影这个。我尝试使用双曲线,但情况相同。我可以创建一个任意的 t,假设 t=2,然后计算对象在 2 秒内的位置。但我正在努力寻找一种方法来实现子弹速度投影。
Position_targetparent + Velocity_targetparent * t + [ANGULAR VELOCITY COMPONENT] = Position_shooter + Velocity_shooter * t + Bulletspeed * t
Delta_Position_X + Delta_Velocity_X * t + S * t = r * sin (theta + Omegay * t)
Delta_Position_Z + Delta_Velocity_Z * t + S * t = r * cos (theta + Omegay * t)
从这里开始,我一直在不停地旋转我的轮子,试图找出一个可行的解决方案。我将 eulerAngle.y 用于运行良好的欧米茄。最终,我只需要我应该射击的空间中的瞬时点,它是子弹速度和投影距离的乘积,然后我的炮塔瞄准脚本将负责其余的工作。
我一直在研究基于父母位置(旋转中心)的球坐标系
Vector3 deltaPosition = target.transform.position - target.transform.root.position;
r = deltaPosition .magnitude;
float theta = Mathf.Acos(deltaPosition.z / r);
float phi = Mathf.Atan2(deltaPosition.y,deltaPosition.x);
float xPos = r * Mathf.Sin(theta) * Mathf.Cos(phi)
float yPos = r * Mathf.Sin(theta) * Mathf.Sin(phi)
float zPos = r * Mathf.Cos(theta)
Vector3 currentRotation = transform.root.gameObject.transform.rotation.eulerAngles * Mathf.Deg2Rad;
Vector3 angularVelocity = transform.root.gameObject.GetComponent<Rigidbody>().angularVelocity;
在给定这些角度的情况下,我可以计算出物体的位置……但我正在努力将其转化为可以与 omega * t(角速度)方法一起使用的东西。
我想知道是否有更优雅的方法来解决这个问题,或者是否有人可以指出我正确的公式方向来帮助我思考这个问题?我在四元数和 EulerAngles 方面不是最好的,但我正在慢慢学习它们。也许我可以用这些做一些聪明的事情?