• u3d插值


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

    1.    例子
    2. public class Forest : MonoBehaviour   
    3. {  
    4.    
    5.     public GameObject[] obstacles;     //路障物体数组  
    6.     public float startLength = 50;   //路障在道路上出现的开始位置  
    7.     public float minLength = 100;   //路障距上一个路障的最小距离  
    8.     public float maxLength = 200;   //路障距上一个路障的最大距离  
    9.    
    10.    
    11.     private Transform player;        //游戏主人公-奔跑者的Transform组件  
    12.     private waypoints wayPoints;    //与路面相贴合的路线上的脚本组件  
    13.    
    14.     void Awake()   
    15.     {  
    16.         player = GameObject.FindGameObjectWithTag(Tags.player).transform; //找到游戏主人公-奔跑者并获得它的Transform组件  
    17.         wayPoints = transform.Find("waypoints").GetComponent<waypoints>();  //找到与路面相贴合的路线上的脚本组件  
    18.     }  
    19.    
    20.     // Use this for initialization  
    21.     void Start()  
    22.     {  
    23.         GenerateObstacle();    //当森林道路被创建出来时,就会自动调用此Start()方法,从而调用此GenerateObstacle()方法  
    24.    
    25.     }  
    26.     // 如果主人公跑完了这段道路,则通知GenerateForest类开始运行产生新的道路,并销毁已跑完的这条道路  
    27.     void Update ()   
    28.     {  
    29.         if (player.position.z > transform.position.z+100)   
    30.         {  
    31.             Camera.main.SendMessage("GenerateForest");  
    32.             GameObject.Destroy(this.gameObject);  
    33.         }  
    34.     }  
    35.    
    36.     void GenerateObstacle()  
    37.     {  
    38.         float startZ = transform.position.z - 3000;  //当前道路在场景中的起始Z坐标  
    39.         float endZ = transform.position.z;          //当前道路在场景中的结束Z坐标  
    40.         float z = startZ + startLength;             //将要产生的路障的Z坐标  
    41.         while (true)   
    42.         {  
    43.             z += Random.Range(100, 200);            //每隔100多米的距离产生一个路障  
    44.             if (z > endZ)                           //如果将要产生路障的位置超出了这条道路则退出路障产生循环,否则产生路障  
    45.             {  
    46.                 break;  
    47.             }  
    48.             else   
    49.             {  
    50.                 Vector3 position = GetWayPosByz(z);                    //调用GetWayPosByz()方法计算路障位置坐标  
    51.                 int obsIndex = Random.Range(0, obstacles.Length);      //产生一个从路障数组里取路障的随机序数  
    52.                 GameObject.Instantiate(obstacles[obsIndex], position, Quaternion.identity);//实例化路障  
    53.             }  
    54.         }  
    55.     }  
    56.    
    57.     Vector3 GetWayPosByz(float z)   
    58.     {  
    59.         Transform[] points = wayPoints.points;       //在道路上设置的转折点的集合  
    60.         int index = 0;                               //转折点在集合中的序数号  
    61.         for (int i = 0; i < points.Length-1; i++)   
    62.         { //根据要插入路障的Z值在集合中寻找在哪两个点之间,找到后记下序数号  
    63.             if(z<=points[i].position.z && z>=points[i+1].position.z){  
    64.                 index = i;  
    65.                 break;  
    66.             }  
    67.         }  
    68.         //使用Lerp函数计算出插入路障处的空间坐标值  
    69.         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));  
    70.     }    
    71. }
  • 相关阅读:
    【转】Git详解之六 Git工具
    【转】Git详解之五 分布式Git
    【转】Git详解之四 服务器上的Git
    【转】Git详解之三 Git分支
    【转】Git详解之二 Git基础
    【转】Git详解之一 Git起步
    【教】Windows下的Git入门
    <<万物简史>>第三章埃文斯牧师的宇宙
    上班两周
    记录一下
  • 原文地址:https://www.cnblogs.com/fengdaren/p/8805501.html
Copyright © 2020-2023  润新知