您的位置:首页 > 移动开发 > Unity3D

Unity 中的向量的 相关使用1

2015-10-28 09:22 369 查看

Unity 中的 Vector向量的 相关使用1

孙广东 2015.10.28

以下页面提供有关在您的代码中有效地使用向量的一些建议。

理解向量算法

向量算术是 3D 图形、 物理和动画的基础,深度的理解它是有用的。下面是主要的操作和一些建议,它们可以用于许多的事的说明。

当两个向量相加时,结果是相当于以原始向量为”步骤”,一个接一个。请注意这两个参数的顺序并不重要,因为结果是相同的无论哪种方式。



如果第一个向量作为空间中的点然后第二个可以被解释为一个偏移量,或者从这一个位置”跳”到另一个位置。例如,找到地面以上 5 个单位 上的某个位置,可以使用以下的计算方法:-

var pointInAir = pointOnGround + new Vector3(0, 5, 0);


如果向量代表力量,那么它是更加直观,他们代表了方向和大小 (大小表示力的大小)。添加两个力在一个新的向量的向量结果等于力量的结合。这一概念经常是有用的当施加力与几个单独的组件,立刻采取行动 (如,被推着向前走火箭可能也受侧风)。

向量减法是最常用的去的方向和距离从一个对象到另一个。注意这两个参数的顺序无关紧要用减法:-



// The vector d has the same magnitude as c but points in the opposite direction.
var c = b - a;
var d = a - b;


作为数字,添加负的一个向量是 这两个向量 反着减。

// These both give the same result.
var c = a - b;
var c = a + -b;


负的一个向量具有相同的原始大小和点沿同一行,但在相反的方向。

标量乘法和除法

一个向量乘以一个标量结果指出在原方向相同的向量。然而,新矢量大小等于乘以标量值的原始大小。

当向量表示运动的一个偏移量或一种力量,这些操作很有用。他们允许您更改该矢量的大小而不影响它的方向。

当任何向量除以其自身magnitude时,结果是一个向量,其大小是 1,被称为归一化的向量。如果一个归一化的向量乘以一个标量结果大小将等于该标量值。 这是有用的当力的方向不变,但强度是可控 (例如,从一辆车的车轮力总是向前推但功率控制由驱动程序)。

点积

点积采用两个向量,并返回一个标量。这个标量等于两个向量相乘的结果乘以向量之间的角度的余弦值的大小。当这两个向量的归一化时,余弦值基本上是第一个向量在第二方向上投影 (或反之亦然-参数的顺序并不重要)。



它从的角度来考虑很容易,然后使用计算器找到相应的余弦。但是,它很有用要直观地了解一些主要的余弦值,如下图所示:-



点积是一个非常简单的操作,可以使用 Mathf.Cos 函数代替或矢量幅度操作在某些情况下 (它不会做同样的事情,但有时效果是等效)。然而,计算点积功能需要更少的 CPU 时间,所以它可以是一种有价值的优化。

差积

结果向量是垂直于两个输入向量。”左手规则”可以用来记住输出向量的方向从排序的输入向量。如果第一个参数匹配到拇指的手和食指的第二个参数,然后结果会指向方向的中指。如果颠倒的参数顺序然后结果向量会指向相反的方向,但会有同一数量级。



结果大小等于输入的向量相乘,然后该值乘以他们之间角度的正弦值的大小。一些有用的正弦函数值如下所示:-



从一个对象到另一个对象的方向和距离

相减 就是 方向了

// Gets a vector that points from the player's position to the target's.
var heading = target.position - player.position;


指向目标对象的方向,这个矢量的大小等于两个位置之间的距离。对象之间的距离等于方向矢量的大小和 此向量可以除以其大小 得到归一化的方向处理:-

var distance = heading.magnitude;
var direction = heading / distance; // This is now the normalized direction.


这种方法最好是使用大小(magnitude )和归一化(normalized )属性两个分开,因为它们是两个相当消耗CPU(他们都涉及计算平方根)。

如果你只需要使用距离进行比较 (接近检查等) 然后你可以完全避免计算magnitude 等。SqrMagnitude 属性是大小的 平方值,像大小但无需耗时开平方根操作。而比比较针对距离的大小,您可以比较距离平方的量:-

if (heading.sqrMagnitude < maxRange * maxRange) {
// Target is within range.
}


这是比在比较真实大小的更高效。

有时,一个目标的地上的heading 是必需的。例如,想象站在地上的Player需要接近一个漂浮在空中的目标。如果你减去的目标从球员的位置然后结果向量将指向向上的目标。这是不适合面向玩家的变换,因为他也会指向上方 ; 真正需要的是从 Player 的位置到地上直接低于目标位置矢量。这很容易获得该减法运算的结果,将 Y 坐标设置为零:-

计算一个法线/垂直向量

一个法线向量 (即垂直于平面的向量) 在网格生成过程中经常需要,也可能用于路径跟踪和其他情况。鉴于三个点在平面上,说网格三角形的角点,很容易找到法线。拿任何三个点,然后其中任意两点相减得出两个向量:-



var a: Vector3;
var b: Vector3;
var c: Vector3;

var side1: Vector3 = b - a;
var side2: Vector3 = c - a;


这两个向量叉积cross 会得出第三个向量也就是垂直于表面的向量。 “左手规则” 可以用来决定法线的法线。

var perp: Vector3 = Vector3.Cross(side1, side2);


如果输入向量的顺序相反的结果将完全相反的方向。

对于网格,法向量必须是规范化的。这可以通过归一化normalized 的属性,但还有另一个技巧是偶尔有用的。你也可以除以其大小得到啊:-

var perpLength = perp.magnitude;
perp /= perpLength;


原来三角形的面积等于 perpLength / 2。这是有用的如果你需要找到整个网格的表面面积 或想要基于其相对领域的概率随机选择三角形。

方向和距离从一个对象到另一个

一个向量在另一个向量上的投影大小

一辆车的车速表工作通常通过轮子的转速测量。这辆车可能不会直接向前移动(它可能会侧身打滑) 这个案例部分的议案不会方向测速仪可以测量。对象 rigidbody.velocity 矢量是在其整体运动的方向的,如果要求得 向前的速度:-

var fwdSpeed = Vector3.Dot(rigidbody.velocity, transform.forward);


自然,方向可以是任何你喜欢但方向向量总是必须这种计算 归一化。不只是结果比速度的大小更正确,也避免了慢平方根运算参与寻找大小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity 向量