最近准备从简单到困难跟几个教程用以加强自己的业务能力,相信很多小伙伴都做过胡闹厨房这一个案例,其实这个案例比较初级,但是也包含了很多平常可能注意不到小细节,所以我就以它为举例,拓展其中的数学知识

       CodeMonkey教程: https://www.youtube.com/watch?v=QDWlGOocKm8

        Siki学院汉化教程:如何使用Unity开发分手厨房(胡闹厨房)-Unity2023 - SiKi学院|SiKi学堂 - unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程

目录

1.情景 发现问题

 2.解决问题

​编辑3.总结


 

版本:Unity6

模板:3D核心(渲染管线:URP)

1.情景 发现问题

        角色移动大家都不陌生,无论是加position值,还是调用translate,rigidbody/2D中的三个api都可以做到

        就比如:

    float x = Input.GetAxisRaw("Horizontal");
    float z = Input.GetAxisRaw("Vertical");

    Vector3 move = new Vector3(x, 0, z) * Time.deltaTime * speed;

   transform.position += move;

        但是这样做有个问题就是角色斜角位移值与xz轴上不一致 不信把代码改成下面这样,来看一下move的值

        其中:move.magnitude是求向量模长,对三维向量模长公式为:

d7a6f9a926c84831901415add87a2b4c.png

  Vector3 move = new Vector3(x, 0, z);//* Time.deltaTime * speed;        
  Debug.Log(move.magnitude);

f6a2a33eadcd4bba8aaf93974003aa63.gif 

斜向移动的时候发现move的值变成了1.4这是怎么来的?

当组合键比如wd输入的时候 move =(1,0,1)所以模长如下

99945047bad341f6b660ce2dd9891e8b.png

   但是我们预期的正常位移值应该是这样子的                   却变成了这样子:

 b33416bab8a54bf493d8e2291bf0c3dc.png                        fc9bebaad9e54b99921ef31123bbbb6c.png

 2.解决问题

        我们要将move的向量值单位化

        单位向量的特点为模长为1 这样就完美符合了Radius=1的一个圆

        之后由speed去控制具体的移动速度(time.deltatime不固定但是非常小 比如0.0056和0.0081,所以其对数量级影响大但对单位下的值影响小)

单位化三维向量:79bc312f11c7452e9f23001bac1de72d.png

几何表现:向量的各分量可能不为1,但是加起来的模长肯定为1

 448da5d084fe49b08ff213657667a75d.png

也就是说: 

  Vector3 move = new Vector3(x, 0, z);//* Time.deltaTime * speed;
  move = move.normalized;
  Debug.Log(move.magnitude);

 这样无论我怎么按斜方向组合键都是130cf83b2382c48179660ea84c6856a6d.gif

因为我的x和z的值来源都是input.getaxisraw 所以固定为1

这些情况下 move=(1,0,0)或者(0,0,1)模长=1

斜角的计算因为将(1,0,1)更改成了(1/根号2,0,1/根号2),所以模长如下

6a1ca5e38caf453ab1d0c63b9715f606.png
3.总结

        虽然小学生来了都能解决这个单位化向量的问题,但是其确实线性代数中的根基,更常应用于那些需要着重关注方向而淡化向量长度差异的场景

        比如在图形学中确定光照方向、计算法线方向等,使用单位向量可以方便地进行向量点积、叉积等运算来获取角度、判断位置关系等;

 

 

 

 

 

 

 

       

         

       

 

Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐