最近准备从简单到困难跟几个教程用以加强自己的业务能力,相信很多小伙伴都做过胡闹厨房这一个案例,其实这个案例比较初级,但是也包含了很多平常可能注意不到小细节,所以我就以它为举例,拓展其中的数学知识
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是求向量模长,对三维向量模长公式为:
Vector3 move = new Vector3(x, 0, z);//* Time.deltaTime * speed;
Debug.Log(move.magnitude);
斜向移动的时候发现move的值变成了1.4这是怎么来的?
当组合键比如wd输入的时候 move =(1,0,1)所以模长如下
但是我们预期的正常位移值应该是这样子的 却变成了这样子:
2.解决问题
我们要将move的向量值单位化
单位向量的特点为模长为1 这样就完美符合了Radius=1的一个圆
之后由speed去控制具体的移动速度(time.deltatime不固定但是非常小 比如0.0056和0.0081,所以其对数量级影响大但对单位下的值影响小)
单位化三维向量:
几何表现:向量的各分量可能不为1,但是加起来的模长肯定为1
也就是说:
Vector3 move = new Vector3(x, 0, z);//* Time.deltaTime * speed;
move = move.normalized;
Debug.Log(move.magnitude);
这样无论我怎么按斜方向组合键都是1
因为我的x和z的值来源都是input.getaxisraw 所以固定为1
这些情况下 move=(1,0,0)或者(0,0,1)模长=1
斜角的计算因为将(1,0,1)更改成了(1/根号2,0,1/根号2),所以模长如下
3.总结
虽然小学生来了都能解决这个单位化向量的问题,但是其确实线性代数中的根基,更常应用于那些需要着重关注方向而淡化向量长度差异的场景
比如在图形学中确定光照方向、计算法线方向等,使用单位向量可以方便地进行向量点积、叉积等运算来获取角度、判断位置关系等;