- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个 3D 太空游戏,其中相机处于恒定的 2D(自上而下)状态。我能够向以给定速度移动的目标发射速度为 (s) 的射弹,并且每次都击中它。伟大的!好吧,如果那个目标有一个围绕 parent 的角速度呢?我注意到如果目标有一个旋转的父对象,我的投影就不正确,因为它没有考虑角速度。
我的初始代码是基于以下假设构建的:
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 值,然后将目标的位置和当前速度转换到那个 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 用于 omega,效果很好。最终,我只需要我应该射击的那个瞬时空间点,它是子弹速度和投影距离的乘积,然后我的炮塔瞄准脚本将处理其余部分。
我一直在看一个基于父位置(旋转中心)的球坐标系
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 的最佳人选,但我正在慢慢学习它们。也许我可以用它们做一些聪明的事情?
最佳答案
虽然数学可能仍然很困难,但我怀疑您可以通过让“目标”计算其在局部空间中的 future 位置来大大简化数学。然后让它将该位置调用给它的父级,让它在本地空间中计算它,依此类推,直到到达世界空间。一旦您确定了它在世界空间中的 future 位置,您就可以将炮塔对准该目标。
例如,轨道飞船应该能够轻松计算出其 future 的轨道。这是一个椭圆方程。然后可以将该本地位置发送到其父(行星),该父(行星)大概也在轨道运行并计算相对于自身的位置。然后行星会将这个本地位置发送给它自己的父级(Star)等等。直到你到达世界空间。
您可以通过使子弹的行进时间恒定(灵活速度)来进一步简化此数学运算,这样您就可以简化计算特定时间的 future 位置。根据您的游戏规模,实际速度差异可能不会有太大差异。
另一个想法:您可以及时向前“模拟”目标对象,而不是通过蛮力进行所有计算。确保所有影响位置的代码都可以与实际更新循环分开运行。只需将时钟向前推进,无需实际移动即可查看其 future 位置。然后回到现在,在未来的位置开枪。
关于c# - Unity C# 向围绕移动轴旋转的目标发射炮弹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50515888/
只是想知道 Jquery Mobile 是否足够稳定以用于实时生产企业移动应用程序。 有很多 HTML5 框架,因为我们的团队使用 JQuery 已经有一段时间了,我们更愿意使用 Jquery 移动框
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 3 年前。 Improve t
所以我尝试在 JavaScript 中对元素进行拖放。我使用的视频教程在这里; https://www.youtube.com/watch?v=KTlZ4Hs5h80 。我已经按照它的说明进行了编码,
无法在移动 iOS(safari 和 chrome)上自动播放以前缓存的 mp3 音频 我正在 Angular 8 中开发一个应用程序,在该应用程序的一部分中,我试图在对象数组中缓存几个传入的音频 m
Git 基于内容而不是文件,所以我目前理解以下行为,但我想知道是否有特殊选项或 hack 来检测此类事情: git init mkdir -p foo/bar echo "test" foo/a.tx
我正在寻找语义 ui 正确的类来隐藏例如移动 View 中的 DIV。在 Bootstrap 中,我们有“visible-xs”和“hidden-xs”。 但是在语义ui上我只找到了“仅移动网格” 最
我正在使用 ubuntu 和 想要移动或复制大文件。 但是当我与其他人一起使用服务器时,我不想拥有所有内存并使其他进程几乎停止。 那么有没有办法在内存使用受限的情况下移动或复制文件? 最佳答案 如果你
这些指令有什么区别?以 ARM9 处理器为例,它不应该是: ASM: mov r0, 0 C: r0 = 0; ASM: ld r0, 0 C: r0 = 0; ? 我不知道为什么要使用一个或另一个:
我有一个文件夹,其中包含一些随机命名的文件,其中包含我需要的数据。 为了使用数据,我必须将文件移动到另一个文件夹并将文件命名为“file1.xml” 每次移动和重命名文件时,它都会替换目标文件夹中以前
我经常在 IB/Storyboard 中堆叠对象,几乎不可能拖动其他对象后面的对象而不移动前面的对象。无论如何我可以移动已经选择但位于其他对象后面的对象吗?当我尝试移动它时,它总是选择顶部的对象,还是
几个月前,我看到 Safari 7 允许推送通知,它似乎是一个非常有用的工具,除了我看到的每个示例都专注于桌面浏览,而不是移动设备。 Safari 推送通知是否可以在移动设备上运行,如果没有,是否有计
我有一个简单的 View 模型,其中包含修改后的 ObservableCollection使用 SynchronizationContext.Current.Send在 UI 线程上执行对集合的更改。
关于cassandra创建的数据文件和系统文件的位置,我需要移动在“cassandra.yaml”配置文件中设置的“commitlog_directory”、“data_file_directorie
我有这个代码 $(function() { var message = 'Dont forget us'; var original; var txt1 = ' - '; $(wind
我的客户报告说他的网站有一个奇怪的问题。该网站的 URL 是 your-montenegro.me 在 基于 Android 的浏览器 上加载时,页面底部会出现一个奇怪的空白区域。以下是屏幕截图: 华
我有这个 HTML 标记: Express 300 bsf Sign Up 我需要将元素从 DOM 上的一个
我有一个可重新排序的 TableView (UITableView 实例)。尽管我已经实现了 UITableViewDataSource 方法: tableView:moveRowAtIndexPat
我的客户报告说他的网站有一个奇怪的问题。该网站的 URL 是 your-montenegro.me 在 基于 Android 的浏览器 上加载时,页面底部会出现一个奇怪的空白区域。以下是屏幕截图: 华
我需要在拖放或复制/剪切和粘贴(复制与移动)期间获取操作类型。它是一个 Swing 应用程序,并且实现了 TransferHandle。我在操作结束时需要此信息,在 importData 方法中。 对
我编写了一个具有 add 和 get 方法的 SortedIntList 类。 我调用以下四个方法: SortedIntList mySortedIntList = new SortedIntList
我是一名优秀的程序员,十分优秀!