签到

05月05日
尚未签到

共有回帖数 0

    高傲自我

    等级:
    开篇废话:最新在写脚本时遇到了很多Vector的数学计算,于是恶补了一下Vector的知识和使用技巧,学完后感觉受益匪浅,本着知识无国界,技术无隐私的原则,特与大家分享。若有不足还请指正。

    入题:
    本文用Vector3来做介绍,因为使用最广,其他的诸如Vector2等等都是一样的道理,脚本使用的是C#

    向量在Unity的含义
    在Unity中最常用的类就是Vector3这个类了,简单的说是向量,实际上远非如此。在Unity中Vector3有一下几种含义
    1. 三个数字打一包:
    这种用法没有几何意义,就是三个数,没其他的。比如欧拉角,缩放比例,都是这样的用法,这种情况不能看成是向量。所以对这种用法做向量运算的话结果可能会很奇怪。

    2. 空间位置的“点”:
    关键词是“点”,这种情况用的最多的是transform.Position,它表示的是位置,与x,y,z坐标对应,在某些计算下有集合含义,可以做运算。

    3. 空间位置的“方向线段”:
    方向线段这才是向量真正的姿态,一个向量有两个含义:大小和方向,所以向量可以拆分成两部分来看,大小就是模(|v|),方向就是标准化(Vn),例如描述一个朝Vn方向大小为|v|的速度。
    这里有一个隐藏属性,就是从原点(0,0,0)出发。两点一线。
    所以向量可以分解为v=|v|* Vn


    向量和常数(i)的运算:
    不能加减。
    iV=Vi=(ix,iy,iz) 满足交换律。代表把线拉长多少倍
    V/i = (x/i, y/i, z/i) 注意 i/V是不行的。代表把线缩小多少倍


    向量的常用运算和意义:
    1. 向量的长度(模|v|)
    注意只有当做”方向线段“的时候模才有意义,简单的说就是这条线有多长,就是你用尺子量出来的数据。

    公式:
    脚本:v.magnitude,v.sqrMagnitude

    sqrMagnitude代表模的平方,为啥会有这么个东西呢?其实仅仅是因为平方根的计算会很耗时,sqrMagnitude的效率会高很多,例如在比较模的大小这类的问题上,比较sqrMagnitude的大小就足够了。


    2. 向量的标准化(单位向量 Vn)
    同样,是对“方向线段”的描述, 意思是把这条线拉长或者缩短,让他的模等于1,他最大的作用就是表示方向,判断两个向量是不是一个方向,判断Vn就可以了。

    公式:
    脚本:v.normalized, v.Normalize()
    使用技巧:如要把任意V长度变成5,直接5*Vn就可以了

    v.normalized是计算自己标准后的向量,然后返回别处用,自己的值不会改变。
    v.Normalize()是把自己标准化,自己的值会改变。


    3. 向量相加(Va+Vb)
    看做“方向线段”可以用来表示路径,速度等的叠加。
    例如:走到a点再走到b点的结果。先以速度a出发再受到速度b的结果。

    公式:
    脚本: 直接写Va+Vb


    4. 向量相减(Va-Vb)
    看做“点”时表示:将两点连成方向线段,方向由b指向a。如此一来要计算两点之间的距离和相对方向就很容易了,距离是|Va-Vb|, 相对方向是Va-Vb再标准化。这个很实用
    看做“方向线段”可以用来求速度,路径等的逆运算,回滚等。

    公式:
    脚本: 直接写Va-Vb

    5. 向量点乘(Va.Vb)
    具体含义比较模糊代表,在物理学中,已知力与位移,点乘的结果为功, 看做“方向线段”可以用来求夹角,个人感觉这是最有用的地方。

    公式: 注意结果是一个常数
    脚本: Vector3.Dot(va, vb)
    实用技巧:,可以直接得到夹角,比较好的是Unity提供了这个方法Vector3.Angle(Va, Vb)。

    6. 向量叉乘(Va x Vb)
    这个感觉很少用,我也几乎没用过,坐等大神来解答

    脚本: Vector3. Cross (va, vb)


    7. 投影(Vp)
    V在轴Vb上的影子, 这个概念不好说清楚,可以去问度娘,可以用来做向量的切割,比如要限制物体的运动方向时可以使用投影。

    公式:
    脚本: Vector3.Project(V, Vb);

    8. 反射(Vr)
    V对于法线N的反射,这个最有意思了,想想一下光反射或者桌球反弹,就是那个概念。可以用于模拟一下物理碰撞。
    公式: 注意此处N需要标准化
    脚本: Vector3. Reflect (V, N);

    楼主 2016-03-11 12:23 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知