找到发射弹丸的角度以到达特定点

2023-12-09

所以,Dani 在他的稍微新的视频中 -> “制作游戏,但我只有 3 天”(https://youtu.be/S7Dl6ATRK2M)制造了一个拥有弓箭的敌人(5:39)。我试图重新创建它,但没有运气...我也找不到他使用的网站...今天我发现了这个https://physicals.stackexchange.com/questions/56265/how-to-get-the-angle-needed-for-a-projectile-to-pass-through-a-given-point-for-t。它工作得很好,但如果目标很远,而且它不那么准确,仍然会出现问题。到目前为止的代码是

float CalculateAngle()
    {
        float gravity = Physics.gravity.magnitude;
        float deltaX = targetPositionMod.x - currentPosition.x;
        float deltaY = targetPositionMod.y - currentPosition.y;
        float RHSFirstPart = (velocity * velocity) / (gravity * deltaX);
        float RHSSecondPart = Mathf.Sqrt(
                ((velocity * velocity) * ((velocity * velocity) - (2 * gravity * deltaY)) 
                                / (gravity * gravity * deltaX * deltaX))
                                                - 1);
        float tanθ = RHSFirstPart - RHSSecondPart;
        float angle = Mathf.Atan2(tanθ, 1) * Mathf.Rad2Deg;
        if (angle < 0) return angle;
        return -angle;
    }

- 角度是因为当 x 旋转为负值 (Unity) 时,前轴起点向上。也许这没有按预期进行的原因是我不太擅长这种物理(部分原因是我只有 14 岁)。也许问题出在代码上,也许问题出在公式上。任何帮助表示赞赏。

谢谢...

编辑: 弓箭手类别是:

using UnityEngine;
using System;
public class Archer : MonoBehaviour
{
    [SerializeField] float velocity = default;
    [SerializeField] Transform target = default;
    [SerializeField] GameObject arrowPrefab = default;
    [SerializeField] float coolDown = default;
    Vector3 targetPositionMod;
    Vector3 currentPosition;
    Vector3 targetPosition;
    float countDown = 0f;

    void Start()
    {
        countDown = coolDown;
        UpdateVariables();
    }

    void Update()
    {
        UpdateVariables();
        SetAngle();
        ShootBullet();
    }
    
    void UpdateVariables()
    {
        currentPosition = transform.position;
        targetPositionMod = Mod(target.position);
        targetPosition = target.position;
        targetPosition.x /= 10;
        targetPosition.y /= 10;
        targetPosition.z /= 10;
        countDown -= Time.deltaTime;
    }

    void SetAngle()
    {
        Vector3 direction = targetPosition - currentPosition;
        Quaternion lookRotation = Quaternion.LookRotation(direction);
        Vector3 rotation = lookRotation.eulerAngles;
        rotation.x = (float) CalculateAngle();
        transform.rotation = Quaternion.Euler(rotation.x, rotation.y, 0f);
    }

    void ShootBullet()
    {
        if (!(countDown <= 0f)) return;
        countDown = coolDown;
        GameObject arrow = Instantiate(arrowPrefab, transform.position, transform.rotation);
        Rigidbody Rigidbody = arrow.GetComponent<Rigidbody>();
        Rigidbody.AddForce(transform.forward * velocity, ForceMode.Impulse);
    }

    double CalculateAngle()
    {
        double gravity = Physics.gravity.magnitude;
        double deltaX = targetPositionMod.x - currentPosition.x;
        double deltaY = targetPositionMod.y - currentPosition.y;
        double RHSFirstPart = (velocity * velocity) / (gravity * deltaX);
        double RHSSecondPart = Math.Sqrt(
                (((velocity * velocity) * ((velocity * velocity) - (2 * gravity * deltaY)) 
                                / (gravity * gravity * deltaX * deltaX))
                                                - 1));
        double tanθ = RHSFirstPart - RHSSecondPart;
        double angle = Math.Atan2(tanθ, 1) * Mathf.Rad2Deg;
        if (angle < 0) return angle;
        return -angle;
    }
    
    Vector3 Mod(Vector3 Vec)
    {
        if (Vec.x < 0) Vec.x -= 2 * Vec.x;
        if (Vec.y < 0) Vec.y -= 2 * Vec.y;
        if (Vec.z < 0) Vec.z -= 2 * Vec.z;
        Vec.x /= 10;
        Vec.y /= 10;
        Vec.z /= 10;
        return Vec;
    }
}

好的,正如我所看到的,您从 StackExchange 实现的公式是正确的,但您必须记住两件事:

  1. Unity中有一个3D世界,所以水平距离不仅仅是pos1.x - pos2.x, but Mathf.Sqrt( deltaX * deltaX + deltaZ * deltaZ ), where deltaX = targetPositionMod.x - currentPosition.x and deltaZ = targetPositionMod.z - currentPosition.z
  2. 在计算机实现中,你没有 100% 的数学准确性,因此由于计算准确性可能会出现一些问题。它可以对很远的距离产生影响。您可以尝试使用double代替float或者找到反正切函数的另一个实现(我认为,这真的很有帮助)。但只有当第一个建议没有帮助时才尝试这个(第二个)建议。它更难实现并且会稍微减慢计算速度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

找到发射弹丸的角度以到达特定点 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 控制 WinForms 中的嵌套限制

    我正在运行时创建表单的控件 出于某种原因 我需要深度超过 49 个嵌套控件 即控件包含在另一个控件中 但出现以下错误 如何添加更多相互嵌套的控件 这是一段可能会重现该错误的代码 public partial class Form1 Form
  • 在 Struts2 中实现

    我目前正在处理一个项目 我的应用程序中有多个选择框 每个值应根据第一个列表中选择的先前值进行更改 这是我的代码 我没有获得第二个选择列表 这是我的jsp
  • Django FilteredSelectMultiple 未在页面上呈现

    我目前使用的是 Django 版本 1 11 2 并且想在管理页面之外使用 FilteredSelectMultiple 小部件 这是我的 forms py class TBDAuthGroupManageForm forms Form p
  • UPDATE count=count+1 是否存在并发?

    我想知道 我会遇到并发问题吗 这不在交易中 这段代码是为了Sqlite prototype 但我计划将它与 MySql 或来自 MS 的 SQL 一起使用 command CommandText UPDATE tag name SET co
  • 如何使用 Verilog 宏模拟 $display?

    我想创建一个具有多个参数的宏 就像 display 一样 我的代码看起来像这样 但它不起作用 define format macro A write s sformatf A 这就是我调用 format macro 的方式 format m
  • 如何创建自定义 UIAlertView

    我们正在创建一个沉浸式应用程序 它需要具有类似于UIAlertView 但我们不希望它看起来像一个系统对话框 我们想使用我们自己的图形 我已经完成了大部分工作 但遇到了一些障碍 如何使 UIView 显示在状态栏上方 以便我可以变暗 就像U
  • 删除“联合”非连续范围

    我不能使用rng EntireRow Delete当范围不连续时 并且范围是由 Union 构建的 我知道我可以使用排序和自动筛选根据条件删除多行 我想学习新东西 我对向后删除或使用循环不感兴趣 这太耗时了 当范围 usun 不连续时 代码
  • 使用终结器清理弱引用缓存?

    假设我有一个由弱引用或软引用组成的缓存 这些弱 软引用需要在某个时候关闭 理想情况下 一旦 GC 从缓存中删除对象 就应该关闭这些对象 使用终结器 清理器来关闭这些资源 同时仍然在程序末尾循环缓存并手动关闭它们是否合适 public voi
  • WinRT XAML 中的 Flyout 控件在哪里?

    JavaScript 中的 Flyout 控件对于 设置 窗格和按钮 Flyout 扩展非常方便 但是 WinRT XAML 的 Flyout 控件在哪里 您正在寻找的控件在 XAML 中称为 Popup 与 Flyout 的 JavaSc
  • PARTIAL_STATE_SAVING 是否应该设置为 false?

    今天 2012 年 4 月 MyFaces 和 Mojarra 的 JSF 2 1 实现似乎都在部分状态保存方面存在缺陷 并且 PARTIAL STATE SAVING 应设置为 false 这是真的 是否应该将 PARTIAL STATE
  • 从 Postman 的 API 连接对象存储时出现未经授权的错误

    我正在尝试使用邮递员中提供的 API 获取对象存储容器详细信息 但我收到未经授权的错误 API 信息可在http developer openstack org api ref object storage index html expan
  • SAPUI5中的“apply()”函数是什么

    我知道这是一个愚蠢的问题 但我在很多地方看到了以下声明 something apply this arguments 有人可以向我解释一下这个函数的使用或者给我指出某种文档吗 apply 是 javascript 函数的方法 请参阅文档ap
  • 无法搁置 VS2012 中对 TFS2010 的更改

    我们正在使用 TFS2010 仅用于源代码控制 直到最近每个人都在使用 VS2010 我们的开发人员刚刚安装了VS2012 在 Visual Studio 中下拉代码效果很好 当您转到团队资源管理器中的 待处理更改 时 我们会看到TF201
  • Windows运行时:如何在椭圆形按钮中设置图像?

  • 计划任务未运行 - Coldfusion 服务器管理

    我有一系列计划任务 这些任务都在一天中的不同时间运行 自从 Coldfusion 版本 7 迁移到 10 以来 这些任务已停止运行 当我选中将结果输出到文件的框时 我得到一个文本文件 其中仅显示 连接失败 我已经尝试了有关该任务的用户名和密
  • Android:无法在 HTC 上查询 ContactsContract.Directory

    我编写了一个示例应用程序 它从 GAL 公司目录 在 帐户 中定义为 Exchange ActiveSync 返回联系人数据 同一个应用程序在一堆不同的设备上运行得很好 但在我测试过的 HTC 上却不行 One X 与 Android 4
  • Pandas 用数字字符串对列进行排序

    我有一个下面的数据框 col1 Numb10 Numb11 Numb12 Numb7 Numb8 如何按数字顺序排序 col1 Numb7 Numb8 Numb10 Numb11 Numb12 我尝试过但出现错误TypeError cann
  • .NET 的 XmlSerializer 的 Java 替代方案是什么

    我正在将 C 应用程序移植到 Java 但不知道它的详细信息 我应该用什么来替换Java中 Net的XmlSerializer 谢谢 JAXB是你最好的选择 它也是一个 Java 标准 有趣的帖子 由布莱斯 道安 JAXB 与 XStrea
  • SQL Server-如何将变量和查询结果写入文本文件?

    如何使用 T SQL 变量值和查询结果写入文本文件 我实际上想继续追加 您可以使用 SQL CLR 将您想要的任何内容写入文件 您可以自己编写代码 也可以使用 SQL 库 我是作者 该函数不是免费的 但也不昂贵 并使用 File Write
  • 找到发射弹丸的角度以到达特定点

    所以 Dani 在他的稍微新的视频中 gt 制作游戏 但我只有 3 天 https youtu be S7Dl6ATRK2M 制造了一个拥有弓箭的敌人 5 39 我试图重新创建它 但没有运气 我也找不到他使用的网站 今天我发现了这个http