unity3d 我无法理解Unity(c#)中的向量

fzsnzjdm  于 2022-12-13  发布在  C#
关注(0)|答案(1)|浏览(159)

在以下代码的最后第二行代码中,使用AddForce()方法,我不明白为什么需要找到方向和大小并将它们相乘以使其成为Vector2参数这样一个漫长的过程,而我们只需将参数作为new Vector2即可完成(* 一个x分量,一个y分量 *)。我不明白这样做的目的是什么?
或者,我不明白**new Vector2(* 一个x分量,一个y分量 *)**是什么意思。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// A teddy bear
/// </summary>
public class TeddyBear : MonoBehaviour
{
    /// <summary>
    /// Start is called before the first frame update
    /// </summary>
    void Start()
    {
        // get the teddy bear moving
        const float MinImpulseForce = 3f;
        const float MaxImpulseForce = 5f;
        float magnitude = Random.Range(MinImpulseForce, MaxImpulseForce);
        float angle = Random.Range(Mathf.PI / 2, Mathf.PI);
        Vector2 direction = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle));
        GetComponent<Rigidbody2D>().AddForce(
            direction * magnitude , ForceMode2D.Impulse);

    }
    
}
rdrgkggo

rdrgkggo1#

这不是关于向量的,而是关于伪随机数的分布。当你使用Random.Range时,数字(非常接近)均匀地分布在那个范围内。你会看到不是所有的向量都是可能的。事实上,可能的向量以特定的形状存在,重要的是可能的向量可以存在的形状。以及它们在那个形状中的分布。
他们可以生成一个随机的x和一个随机的y坐标,这将确保向量在这些变量中均匀分布,这意味着可能的向量可以存在于一个
正方形
中(或者如果xy的范围不同,则为矩形)。
那么在每个方向和距离上得到向量的概率就不会是一致的(例如,在正方形的角的方向上,向量可能离中心更远)。另一种思考方式是xy是独立的,但结果是angledistance之间存在相关性。
相反,他们希望生成极坐标中的数字,换句话说,通过angledistance(在这个例子中他们称之为magnitud),这样他们就知道向量在这些变量中是均匀分布的。这也意味着可能的向量可以存在于一个中。* 重申一下,这确保了angledistance之间没有相关性。*
这就是你在这里看到的:

float magnitude = Random.Range(MinImpulseForce, MaxImpulseForce);
float angle = Random.Range(Mathf.PI / 2, Mathf.PI);

嗯......实际上,这并不是整个Angular 范围,所以这不是一个完整的圆,而是一个扇形圆。并且假设MinImpulseForce可能不是零(实际上是3f),所以这实际上是一个扇形环,一个圆环(一个2D圆环的扇形)。* 重申一下:可能存在的向量的形状是很重要的。
既然他们决定使用极坐标,向量构造函数取x和y,他们就做了一个极坐标到笛卡尔坐标的转换,如下所示:

new Vector2(Mathf.Cos(angle), Mathf.Sin(angle)) * magnitude;
  • 除了在下面的例子中乘以magnitude。*

那是一样的:

new Vector2(Mathf.Cos(angle) * magnitude, Mathf.Sin(angle) * magnitude);

但使用向量标量乘法的时间更短。

相关问题