unity中mathf.Lerp的运用

2023-11-17



unity3d中经常用线性插值函数Lerp()来在两者之间插值,两者之间可以是两个材质之间、两个向量之间、两个浮点数之间、两个颜色之间,其函数原型如下:


1.Material.Lerp 插值

function Lerp(start : Material, end : Material, t : float) : void

在两个材质之间插值

 

2.Vector2.Lerp 插值

static functionLerp (from : Vector2, to : Vector2, t : float) : Vector2

两个向量之间的线性插值。按照数字t在form到to之间插值。

t是夹在0到1之间。当t=0时,返回from。当t=1时,返回to。当t=0.5时放回from和to之间的平均数。


3.Vector3.Lerp 插值

static functionLerp (from : Vector3, to :Vector3, t : float) :Vector3

两个向量之间的线性插值。按照数字t在from到to之间插值。


4.Vector4.Lerp 插值

static functionLerp (from : Vector4, to : Vector4, t : float) : Vector4

两个向量之间的线形插值。按照数字t在from到to之间插值。t是夹在[0…1]之间的值。,当t = 0时,返回from。当t = 1时,返回to。当t = 0.5 返回from和to的平均数。

 

5.Mathf.Lerp 插值

static functionLerp (from : float, to : float, t : float) : float

基于浮点数t返回a到b之间的插值,t限制在0~1之间。当t = 0返回from,当t = 1 返回to。当t = 0.5 返回from和to的平均值。

 

6.Color.Lerp 插值

static functionLerp (a : Color, b : Color, t : float) : Color

通过t在颜色a和b之间插值。

"t"是夹在0到1之间的值。当t是0时返回颜色a。当t是1时返回颜色b。

 

插值,从字面意思上看,就是在其间插入一个数值,这种理解是否正确呢?我们先从最简单的浮点数插值函数来分析:

Mathf.Lerp 插值

static functionLerp (from : float, to : float, t : float) : float

基于浮点数t返回a到b之间的插值,t限制在0~1之间。当t = 0返回from,当t = 1 返回to。当t = 0.5 返回from和to的平均值。

 

首先,我们来做一个试验,启动Unity3D,任建一个脚本文件,在其Start()中输入内容如下:


void Start () {

        print(Mathf.Lerp(0.0f, 100.0f,0.0f).ToString());

        print(Mathf.Lerp(0.0f, 100.0f,0.1f).ToString());

        print(Mathf.Lerp(0.0f, 100.0f,0.2f).ToString());

        print(Mathf.Lerp(0.0f, 100.0f,0.3f).ToString());

        print(Mathf.Lerp(0.0f, 100.0f,0.4f).ToString());

        print(Mathf.Lerp(0.0f, 100.0f,0.5f).ToString());

        print(Mathf.Lerp(0.0f, 100.0f,0.6f).ToString());

        print(Mathf.Lerp(0.0f, 100.0f,0.7f).ToString());

        print(Mathf.Lerp(0.0f, 100.0f,0.8f).ToString());

        print(Mathf.Lerp(0.0f, 100.0f,0.9f).ToString());

        print(Mathf.Lerp(0.0f, 100.0f,1.0f).ToString());

    }


运行Unity,在控制台将打印出:


       这个实验是在0到100之间插值,插入什么值,取决于第3个参数,从打印结果可看出,第3个参数是个比例因数,是0.1时表示0到100这个长度的十分之一,同理,0.2表示十分之二,依此类推。从这点上看来,我们起初从字面上所理解的插值就是插入一个数值是可以这样理解的。

       如果我们把上面那个脚本里的插值函数里的第一个参数变为100.0f,第二个参数变为110.0f,第三个参数保持不变,大家想想其运行结果该是什么呢?可不要认为是0、1、2、3、4、5、6、7、8、9、10了哟,实际结果是100、101、102、103、104、105、106….,因插值是把值插在原来的两数之间,这说明这个函数首先是根据第三个参数所给定的比例算出净增量,再加上起始数,最终算出插值值的。


unity3d游戏开发中,应用最多的是Vector3.Lerp 向量插值,下面我们以此插值来猜推其内部实现机理以及一些应用。


如图,在空间中存在两点A(0,10,0)与B(10,0,-10),我们在A、B两点间插入一C点,假设C点的位置在AB的五分之二处,即AC/AB=0.4,根据相似图形对应边成比例的初中几何知识可知,在⊿ABO中AC/AB=OD/OB,同理在⊿OBF中OD/OB=OE/OF,所以AC/AB=OD/O=OE/OF = 0.4,则C点的X坐标值为:OE=0.4*OF=0.4*10=4。

根据上图,还可知ED/FB=0.4,所以C点的Z坐标值DE=0.4*BF=0.4*(-10)=-4。

C点的Y坐标值请看下图:


EO/AO=DF/AF=CB/AC=1-0.4=0.6,则C点的Y坐标值EO=0.6*AO=0.6*10=6。

综上所述,C点的三维坐标为C(4,6,-4)。

下面我们利用Unity3D中的Vector3.Lerp 插值函数:static function Lerp (from :Vector3, to :Vector3, t : float) :Vector3来计算上面演算的插值。

我们把先前脚本中的Start()函数改写成:

void Start()

    { print(Vector3.Lerp(newVector3(0, 10, 0),newVector3(10, 0, -10), 0.4f).ToString()); }

其运行结果为:


这与我们的演算结果是一致的。

上面的演算,我们为了简便,A、B两点取得较特殊,降低了演算的复杂度。而对普通的A、B两点,如下图所示:


       我们同样可以得到三角形EGL与三角形EFK,使用同样的方法可计算出HI的长度,再加上OH的长度就是C点的X坐标值了。同样的方法可推演出Y与Z的坐标。手工计算是很复杂的,而Lerp函数可以高效地为我们返回这个插值的,我们在这里做出的演算,只是帮助我们来推测Lerp这个函数的内部实现机理而也,实际运用中,一切工作都是交Lerp函数去完成。

        Lerp函数在游戏开发过程使用较多,在Unity的帮助文档里就有为我们列举了Vector3.Lerp的两个应用的例子,一个是在1秒时间动画位置移动从start.position开始到end.position结束:

[csharp]  view plain  copy

 print?


  1. using UnityEngine;  
  2. usingSystem.Collections;  
  3. public classexample : MonoBehaviour   
  4. {  
  5.          public Transform start;  
  6.          public Transform end;  
  7.          void Update()   
  8.          {  
  9.                    transform.position =Vector3.Lerp(start.position, end.position, Time.time);  
  10.          }  
  11. }  





另一个例子:

//像弹簧一样跟随目标物体

[csharp]  view plain  copy

 print?


  1. using UnityEngine;  
  2. usingSystem.Collections;  
  3. public classexample : MonoBehaviour   
  4. {  
  5.          public Transform target;  
  6.          public float smooth = 5.0F;  
  7.          void Update()   
  8.          {  
  9.                    transform.position =Vector3.Lerp(transform.position, target.position, Time.deltaTime * smooth);  
  10.          }  
  11. }  





这个例子中的transform.position是去跟随的那个物体的空间坐标,target.position是目标物体的空间坐标,整句的结果是让跟随物体的坐标不断地变化为它们两者之间的插值,然而随着时间的推移,第三个参数的值最终会为1,所以最终跟随物体的位置会与目标物体重合的。我们以前所玩的游戏中,主人公身上依附着一只宠物如鹰,主人公移动时,鹰会跟随着飞动,主人公移动得快它就飞行跟动得快,始终不会离开主人公,使用Lerp插值函数就可实现。

下面我们来看另一个应用实例。


       这是酷跑游戏场景,囚犯沿着一条森林道路向前奔跑,后面有警车追赶,前面有路障,在游戏过程中,我们要在囚犯奔跑的固定路线上随机产生路障,而道路不是平直的,既左右弯曲,又上下起伏,由程序随机生成的路障怎样确定其空间位置呢?这时,Lerp函数就派上了用场。

        先根据道路的弯曲与起伏,在转折处设置一个空物体,此空物体的Position值即空间坐标与此处道路一致,我们把这些空物体所在的点称为道路转折点,这些点连接而成的线段所组成的多段折线贴合在路面上,是这条道路的近似路径,这些点取得越多、越准确,这条路径与道路的相似程度就越高。

现在我们用那条路径来代替那条道路,把随机产生的路障放在这条路径上也就是放在道路上了。

        假设我们想每隔100米至200米之间产生一个路障,用变量z += Random.Range(100, 200)记录下该路障的Z坐标值(因囚犯总体上是沿着Z轴往前跑)然后根据此Z坐标值判断该坐标值在前面所设置的转折点中的哪两个点之间,找到后就在这两个点之间插值,其插值的比例因数(Lerp()函数的第3个参数)可由两个转折点与这个插值点这三个点中已知的Z坐标值算出来,这样Vector3.Lerp (from : Vector3, to :Vector3, t : float)函数中的三个参数值便都是已知的了,它就可计算出这个插值点的空间坐标了,根据前面的设计,这两个转折点之间的线段是贴合在路面上的,那么此插值的坐标也就是在路面上了,根据此插值放置的路障也就不会偏离道路,且会随着道路的左转而左转,右转而右转,上坡而上坡,下坡而下坡了。


具体设计过程如下:

        导入道路模型,假设命名为forest_1。模型设计时就确定好了其长度为3000、坐标原点在其终端上了的。导入后我们将其沿Z轴正方向放置在场景中,让其Transorm.Position的X、Y值均为0。我们可以导入多段同类型的道路模型,通过控制它们的Z值来把它们拼接成长长的森林道路。

        在此道路物体上新建一个空物体作为它的子物体,命名为waypoint,再在其下建立多个为空的空物体,分别命名为waypoint_01、waypoint_02……,把它们放在道路的转折处,并通过放大、旋转场景图后细调这些孙物体的坐标值,使它们与道路路面贴合,如下图所示:



说明:图中的绿色按钮状块就是这些空物体,因它们是空物体,不能显示在场景中,是通过属性面板给它们设置了一个供编辑时显示使用的图标标示。


 


这样,我们便把弯弯曲曲的道路分成了一段一段的直路段,并记录下来了各段路段两端的特征点的坐标值。有了这些特征点,也就有了与道路相近的路线了。这是化曲为直的方法,把弯曲、起伏的道路化成了与此相近的一段一段的线段。这样的点越多,其相似程度越高。

在waypionts上创建一个脚本组件waypionts.cs:

[csharp]  view plain  copy

 print?


  1. using UnityEngine;  
  2. using System.Collections;  
  3. public class waypoints : MonoBehaviour  
  4.  {  
  5.     public Transform[] points;  
  6.     void OnDrawGizmos()  
  7.     {  
  8.         iTween.DrawPath (points);  
  9.     }  
  10. }  





public Transform[]points;该句所定义的points就是存放那些特征点的数组,因它是public,可在Unity编辑界面中为其赋值,其操作方法是先在Hierarchy视图中选中waypoints控件,然后在其Inspector视图中点击图标锁住其Inspector面板,然后在Hierarchy视图中全选waypoint_01至waypiont_11后拖到属性面板上的数组名points上即可完成赋值,如下图:

 

接下来,在这个森林道路上建立的Forestcs.cs脚本组件里添加生成路障的脚本:

[cpp]  view plain  copy

 print?


  1. <span style="background-color: rgb(255, 255, 153);">using UnityEngine;  
  2. using System.Collections;  
  3.    
  4. public class Forest : MonoBehaviour   
  5. {  
  6.    
  7.     public GameObject[] obstacles;     //路障物体数组  
  8.     public float startLength = 50;   //路障在道路上出现的开始位置  
  9.     public float minLength = 100;   //路障距上一个路障的最小距离  
  10.     public float maxLength = 200;   //路障距上一个路障的最大距离  
  11.    
  12.    
  13.     private Transform player;        //游戏主人公-奔跑者的Transform组件  
  14.     private waypoints wayPoints;    //与路面相贴合的路线上的脚本组件  
  15.    
  16.     void Awake()   
  17.     {  
  18.         player = GameObject.FindGameObjectWithTag(Tags.player).transform; //找到游戏主人公-奔跑者并获得它的Transform组件  
  19.         wayPoints = transform.Find("waypoints").GetComponent<waypoints>();  //找到与路面相贴合的路线上的脚本组件  
  20.     }  
  21.    
  22.     // Use this for initialization  
  23.     void Start()  
  24.     {  
  25.         GenerateObstacle();    //当森林道路被创建出来时,就会自动调用此Start()方法,从而调用此GenerateObstacle()方法  
  26.    
  27.     }  
  28.     // 如果主人公跑完了这段道路,则通知GenerateForest类开始运行产生新的道路,并销毁已跑完的这条道路  
  29.     void Update ()   
  30.     {  
  31.         if (player.position.z > transform.position.z+100)   
  32.         {  
  33.             Camera.main.SendMessage("GenerateForest");  
  34.             GameObject.Destroy(this.gameObject);  
  35.         }  
  36.     }  
  37.    
  38.     void GenerateObstacle()  
  39.     {  
  40.         float startZ = transform.position.z - 3000;  //当前道路在场景中的起始Z坐标  
  41.         float endZ = transform.position.z;          //当前道路在场景中的结束Z坐标  
  42.         float z = startZ + startLength;             //将要产生的路障的Z坐标  
  43.         while (true)   
  44.         {  
  45.             z += Random.Range(100, 200);            //每隔100多米的距离产生一个路障  
  46.             if (z > endZ)                           //如果将要产生路障的位置超出了这条道路则退出路障产生循环,否则产生路障  
  47.             {  
  48.                 break;  
  49.             }  
  50.             else   
  51.             {  
  52.                 Vector3 position = GetWayPosByz(z);                    //调用GetWayPosByz()方法计算路障位置坐标  
  53.                 int obsIndex = Random.Range(0, obstacles.Length);      //产生一个从路障数组里取路障的随机序数  
  54.                 GameObject.Instantiate(obstacles[obsIndex], position, Quaternion.identity);//实例化路障  
  55.             }  
  56.         }  
  57.     }  
  58.    
  59.     Vector3 GetWayPosByz(float z)   
  60.     {  
  61.         Transform[] points = wayPoints.points;       //在道路上设置的转折点的集合  
  62.         int index = 0;                               //转折点在集合中的序数号  
  63.         for (int i = 0; i < points.Length-1; i++)   
  64.         { //根据要插入路障的Z值在集合中寻找在哪两个点之间,找到后记下序数号  
  65.             if(z<=points[i].position.z && z>=points[i+1].position.z){  
  66.                 index = i;  
  67.                 break;  
  68.             }  
  69.         }  
  70.         //使用Lerp函数计算出插入路障处的空间坐标值  
  71.         return Vector3.Lerp(points[index + 1].position, points[index].position,(z - points[index + 1].position.z) / (points[index].position.z - points[index +1].position.z));  
  72.     }    
  73. }</span>  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity中mathf.Lerp的运用 的相关文章

  • 1.17 从0开始学习Unity游戏开发--场景切换

    前面的所有文章我们都在一个固定的游戏场景内进行开发 在最开始介绍场景这个概念的时候就已经提及 这个场景可以是一张地图 或者是一个对战房间等等 所以显然这个场景可以有多个 并且可以从一个场景切换到另外一个场景 那么在Unity中如何进行场景切
  • 实现一个函数,判断一个数是不是素数

    include
  • Unity-AR 简介

    Unity AR 简介 现有Unity AR Sdk ARKit 苹果推出的AR开发平台 ARCore Google 推出的增强现实 SDK ARFoundation ARFoundation是ARKit XR插件和ARCore XR插件
  • Unity3D:按键生成物件,Instantia…

    在按下按键之后 可以在画面中生成之前定义好了的物体 这里使用了Instantiate函数来生成 1 先在游戏中定一个空物件GameObject 创建空物件快捷键 ctrl shift n 2 在视图中放置 3 编写脚本 脚本 SpaceCh
  • Unity中UI组件

    一 Canvers 画布组件 Canvers下面是添加Button和Image组件 Rect Transform 1 Position 坐标位置 2 Width Height 高宽尺寸 3 Anchors 锚点 4 Pivot中心点 即UI
  • Unity打开工程时卡住的问题

    自从Unity升级了一个版本后 Unity打开工程卡住的问题越来越严重了 具体表现为 选择工程后 Unity窗口消失 但进程还在 有时候等个几分钟能出来 有时候等10分钟都不见得能出来 直观感受上看 似乎是Unity加载工程的时候某一步卡了
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • Unity3D的四种坐标系

    1 World Space 世界坐标 我们在场景中添加物体 如 Cube 他们都是以世界坐标显示在场景中的 transform position可以获得该位置坐标 2 Screen Space 屏幕坐标 以像素来定义的 以屏幕的左下角为 0
  • Unity3d + NGUI 的多分辨率适配

    移动端的多机型适配 现在要介绍的是 锁链战记 这款游戏的适配方法 这种适配方法是UI是一个基础尺寸 背景是一个基础尺寸 背景比UI多出的部分是一些没有实际作用的部分 这样的适配方式避免了在iPhone5这样的小屏幕上镶边 首先设定UIRoo
  • 【Unity步步升】监控与检测物体的各种方案,如:射线、碰撞、挂载等...

    在制作AR模型数值控制方案的时候遇到了检测的问题 学习过程受益匪浅 故今天为大家整理带来一篇监控与检测物体的参考方案集合 目录 一 射线检测 二 物体存在检测 三 碰撞检测 一 射线检测 单射线检测 首先完成搭建场景如下图1 1 我这里用到
  • 【Unity】如何让Unity程序一打开就运行命令行命令

    背景 Unity程序有时依赖于某些服务去实现一些功能 此时可能需要类似打开程序就自动运行Windows命令行命令的功能 方法 using UnityEngine using System Diagnostics using System T
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 游戏开发常用实践操作之按动任意键触发

    接下来一些笔记会对于一些大大小小的实践操作进行记录 希望对你有所帮助 在游戏中 我们经常会遇到一些按动任意键触发的操作 接下来展示核心代码 以下是对于Unity中的操作 使用的UI是NGUI 对于核心操作没有影响 你可以自己置换 void
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接

随机推荐

  • 基于滑模控制的永磁同步电机直接转矩控制学习

    导读 针对传统的DTC存在的问题进行 本期主要介绍基于滑模控制的永磁同步电机直接转矩控制 如果需要文中的仿真模型 关注微信公众号 浅谈电机控制 获取 传统DTC采用两个 Bang bang 控制器分别对转矩和磁链幅值进行控制 响应快速 对系
  • IDEA中的方法、数组和重载

    IDEA软件 常用快捷键 快捷键 功能 Ctrl Shift 选中代码注释 多行注释 再按取消注释 Ctrl Alt L 格式化代码 Alt Ins 自动生成代码 toString get set等方法 Alt Enter 导入包 自动修正
  • BSC链节点搭建 保姆级详细教程

    BSC链节点搭建 保姆级详细教程 文档最后修改日期 2023 06 24 一 服务器配置要求 官方建议配置 系统 Mac Linux CPU 16核 内存 64 GB 内存 带宽 50M以上 硬盘 大于2T固态SSD可用空间数据盘 本次搭建
  • CCPC2016长春J (hdu 5920 Ugly Problem)

    给一个数字 n 1 lt n lt 1e18 让你找一些数字加起来和为 n 数字个数不超过50个而且数字都是回文数字 每次找到大小最接近这个数的回文数即可 如6745888可以找到6745476 6960242可以找到6950595 用大数
  • 全链路压测

    核心流程 全链路压测实施的核心流程如下 骤一 确定压测目标 压测目标主要包括压测范围 策略 目的 往往与业务 技术目标息息相关 例如 压测范围 用户注册加登录 为大规模拉新做准备 压测策略 高仿真生产环境压测 提前经历真实的业务高峰 压测目
  • Vue Baidu Map组件封装:多边形组件和右键菜单

    在Vue上进行开发 地图使用了百度提供的Vue Baidu Map 当前版本为v0 21 15 官方文档地址 https dafrok github io vue baidu map zh index 开发需求 在百度地图上动态进行多边形的
  • 【JavaSe】高级特性篇(三) Java高级特性注解

    JavaSe 高级特性篇 三 Java高级特性注解 1 注解 Annotation 概述 1 1 定义 定义 注解 Annotation 也叫元数据 一种代码级别的说明 它是JDK1 5及以后版本引入的一个特性 与类 接口 枚举是在同一个层
  • Redis-五种数据结构

    1 五种数据结构图解如下 1 1 String数据结构 命令 get set del incr decrget set del incr decr 联想java map
  • Matplotlib绘制漂亮的饼状图

    python绘图系列文章目录 往期python绘图合集 python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取exc
  • 【满分】【华为OD机试真题2023 JAVA&JS】计算网络信号

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 计算网络信号 知识点广搜数组 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 网络信号经过传递会逐层衰减 且遇到阻隔物无法直接穿透 在此情况下需要计算某个位置的网
  • MISC方向MeowMeowMeow解题方法

    下载好附件后 通过好多工具都没有找到flag 突发奇想通过010工具打开MeowMeow png 发现了一堆乱码 当划到最下面的时候 发现了那些乱码有一定的规律 这个时候向上找 找到最开始出现规律的位置 会发现与题目给的flag格式CatC
  • 1001 害死人不偿命的(3n+1)猜想 (15 分)

    1001 害死人不偿命的 3n 1 猜想 15 分 卡拉兹 Callatz 猜想 对任何一个正整数 n 如果它是偶数 那么把它砍掉一半 如果它是奇数 那么把 3n 1 砍掉一半 这样一直反复砍下去 最后一定在某一步得到 n 1 卡拉兹在 1
  • 函数模板全特化与偏特化

    模板为什么要特化 因为编译器认为 对于特定的类型 如果你能对某一功能更好的实现 那么就该听你的 模板分为类模板与函数模板 特化分为全特化与偏特化 全特化就是限定死模板实现的具体类型 偏特化就是如果这个模板有多个类型 那么只限定其中的一部分
  • 7 个非常实用的 Vue.js 库

    编辑整理 杨小爱 我们在开发项目的时候 为了提升开发效率 会经常使用一些实用的开发库 而Vue js 又是前端领域中很受欢迎的框架之一 因此 就有很多开发者开发了各种实用的库 在这里 我整理了 7 个觉得好用的 Vue js 库 希望这些库
  • Acwing 795. 前缀和

    include
  • Go测试学习

    前言 textcolor Green 前言 前言 这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营 从这个专栏里面可以迅速获得Go的知识 Go测试学习 03 测试 3 1 单元测试 3 1 1 单元测试 规则 3 1 2 单元测试 例
  • Linux安装Tomcat详细教程

    一 安装前提 Tomcat依赖于Java环境 所以在运行Tomcat之前 我们需要提前配置好Java环境变量 可以参考以往教程 Linux安装Java详细教程 注 Tomcat和Java使用版本最好保持一致 如果用的JDK1 8 那么最好就
  • 三维模型3DTile格式轻量化压缩模型变形浅析

    三维模型3DTile格式轻量化压缩模型变形浅析 在对三维模型进行轻量化压缩处理的过程中 常常会出现模型变形的现象 这种变形现象多数源于模型压缩过程中信息丢失或误差累积等因素 以下将对此现象进行详细分析 首先 我们需要了解三维模型轻量化压缩的
  • 有限自动机总结

    有限自动机A用来识别字符串 它由5部分组成 1 alphabet 字符集 2 states 状态集合 3 init 初始状态 4 trans s ch 状态转移函数 5 end 可接受state 集合 A str true的意思是 A可以接
  • unity中mathf.Lerp的运用

    在unity3d中经常用线性插值函数Lerp 来在两者之间插值 两者之间可以是两个材质之间 两个向量之间 两个浮点数之间 两个颜色之间 其函数原型如下 1 Material Lerp 插值 function Lerp start Mater