Unity3D学习笔记(五):坐标系、向量、3D数学

Unity复习

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Question : MonoBehaviour {
    int a = 100;
    Transform target;
    #region Question
    // 1、有哪些事件函数
    // Awake Start Update FixedUpdate LateUpdate OnEnable OnDisable OnDestroy OnGUI
    // OnCollisionEnter(Collision col) OnCollisionStay(Collision col) OnCollisionExit(Collision col)
    // OnTriggerEnter(Collider o) OnTriggerStay(Collider o) OnTriggerExit(Collider o)


    // 2、如何查找场景中游戏物体
    // GameObject obj = GameObject.Find("ObjName/ChildObjName")


    // 3、将自己设置为 找到的那个游戏物体的 父物体
    // obj.transform.parent = transform;


    // 4、挂载脚本的必要条件
    // 继承MonoBehaviour 、所有的代码无错误、文件名和类名一致、不能是抽象类


    // 5、物体的移动、旋转


    // 改变位置的移动
    // 1)、往世界的前方移动
    // transform.position += Vector3.forward;
    // 2)、往自身的前方移动
    // transform.position += transform.forward;


    // API移动
    // 1)、往世界的前方移动
    // transform.Translate(Vector3.forward, Space.World);
    // 2)、往自身的前方移动
    // transform.Translate(transform.forward, Space.World);
    // transform.Translate(Vector3.forward, Space.Self);


    // 使物体旋转  (自身)
    // 改变欧拉角的形式 来旋转
    // 世界的Y轴转
    // transform.eulerAngles += Vector3.up;
    // 自身的Y轴转
    // transform.eulerAngles += transform.up;


    // API
    // 世界的Y轴转
    // transform.Rotate(Vector3.up, Space.World)
    // 自身的Y轴转
    // transform.Rotate(transform.up, Space.World)
    // transform.Rotate(Vector3.up)


    // 使物体旋转  (绕其他物体)
    // GameObjet obj; (被绕的游戏物体)
    // 绕Y轴转(世界的)
    // transform.RotateAround(obj.transform.position, Vector3.up, 1);
    // 绕Y轴转(被绕的游戏物体)
    // transform.RotateAround(obj.transform.position, obj.transform.up, 1);


    // 6、如何生成、销毁游戏物体?


    // 生成(需要有预制体)  BulletPrefab
    // public GameObject bulletPrefab;    // 引用资源中的预制体
    // Transform spawnTrans;   // 生成的位置及方位
    // Instantiate(bulletPrefab, spawnTrans.position  /*位置 Vector3*/, Quaternion.identity /*spawnTrans.rotation*/ /*方位 Quaternion*/)


    // 销毁
    // 不要循环调用
    // 销毁当前的脚本组件
    // 销毁的时机: 在 Update 之后,渲染之前
    // Destroy(this);
    // 销毁当前的游戏物体
    // Destroy(gameObject);
    // 5秒以后销毁 当前脚本组件
    // Destroy(this, 5); 


    // 7、物体之间发生碰撞的必要条件
    // 1)、双方都必须有碰撞器 2)、至少有一个非休眠的刚体 3)、如果一方是运动学刚体,另一个必须是非运动学刚体
    // 触发的事件函数  双方的
    // OnCollisionEnter(Collision col) OnCollisionStay(Collision col) OnCollisionExit(Collision col)
    // 如果勾选了 IsTrigger 会?    在所有的 Collider上
    // 会变成触发器,不会再有碰撞效果了


    // 什么情况下会触发 触发器
    // 1)双方都有碰撞器,至少有一方勾选了IsTrigger 2)、至少有一个有刚体
    // 触发的事件函数  双方的
    // OnTriggerEnter(Collider o) OnTriggerStay(Collider o) OnTriggerExit(Collider o)
    #endregion
    // Use this for initialization
    void Start () {
        Destroy(this);
        a = 200;
                   
       }
       
       // Update is called once per frame
       void Update () {
              
       }
}

发生碰撞(触发)的必要条件

 
3D数学
3D数学:利用数学的方式解决计算机几何的问题。
坐标系:
一维坐标系(线性坐标系):线性变化
二维坐标系(笛卡尔2D坐标系):笛卡尔发明的
坐标点的分量,代表坐标点距离轴的距离(相当于轴的偏移量)
三维坐标系
标量:只有大小
矢量:大小和方向,坐标系(向量),物理学(力)
 
向量:
概念:有大小有方向的矢量放在坐标系中就可以称之为向量。
特点:没有位置的概念,放在哪都是这个向量(仅表示方向和大小,可以平行移动)。
 
两个坐标系相加无意义
两个坐标系相减:A(3,1) - B(2,0) = c(3-2,1-0) = c(1,1)
坐标大写,向量小写
数学计算:各分量分别相减
几何意义:得到的是一个新的向量,这个向量由B点指向A点,大小是A点和B点之间的距离。
向量方向:从减数指向被减数
 
坐标和向量相加:A(1,1) + b(1,1) = C(2,2)
数学计算:各分量分别相加
几何意义:得到的是一个新的坐标位置,由A坐标点,沿着b向量的方向,移动b向量的长度的距离,得到的新坐标。
A坐标,沿着b向量的方向,移动b向量的长度,得到C坐标
 
向量和向量相加有意义
向量和向量相加:a(1,1) + b(2,1) = c(3,2)
数学计算:各分量分别相加
几何意义:得到的是一个新的向量,让ab向量首尾相连,得到c向量,从a向量的起点指向b向量的终点。
向量相加,平形四边形的对角线
坐标:transform,position
向量:new Vector3(0,0,1)或Vector3.forward
 
向量和向量相减:a(1,1) - b(1,-1) = c(0,2)
数学计算:各分量分别相减
几何意义:得到的是一个新的向量,让ab向量起点重合,得到c向量,从减数向量的终点指向被减数向量的终点。
已知入射光线l,和法向量n,求反射光线r。r = l + 2n
 
向量和标量相乘:a(1,1) * 2 = c(2,2)
数学计算:标量分别乘以各分量
几何意义:得到的是一个新的向量,让原向量在原有方向的基础上,让原向量进行了标量倍数的缩放。
 
勾股定理:直角三角形中,斜边的平方等于两条直角边的平方和。
向量的各分量有什么几何意义:描述这个向量在各个轴向上的投影的长度
向量的模(模长):向量的长度,向量的各分量的平方和再开方
零向量(0,0,0):长度为0,方向任意(模长为零,没有方向)
单位向量:模长为1的向量叫单位向量。
用单位向量表示方向,用标量表示速度,用标量的缩放可以控制速度。
 
向量的标准化:把一个非单位向量变成一个单位向量
让这个向量的各分量分别除以模长(根号2=1.414 根号3=1.732 根号5=2.236)
不是单位向量的向量让各分量分别除以这个向量的模长,就变成了原有方向不变的单位向量。
我们把不是单位向量的向量变成单位向量的过程叫向量的标准化。
向量的标准化后的模长为1
复杂写法

简单写法,用normalized函数

 
作业1:Normalized和normalized区别
共同点:实现规范化,让一个向量保持相同的方向,但它的长度为1.0,如果这个向量太小而不能被规范化,一个零向量将会被返回。
不同点:
Vector3.normalized的特点是改变当前向量,也就是当前向量长度是1
Vector3.Normalized的特点是当前向量是不改变的并且返回一个新的规范化的向量;
magnitude:取标准化后的模长
 
负向量:让一个向量* -1,得到一个新的向量,新的向量和原向量互为负向量(成对出现)。
 
向量和向量的乘法:
点乘(内积)
叉乘(外积)
transform.Translate(Vector3 dir , Space space):同理适用于transform.Rotate()
1、当第一个参数是Vector3.forward的时候,第二个参数如果不填或者填self,结果是沿着自身的前方移动;如果填world,结果是沿着世界的前方移动
2、当第一个参数是Transform算出来的时候,第二个参数必须填world,否则就乱了
这样写会转两次方向
 
作业2:做一个第一人称视角漫游,加个摄像机
 
Unity场景切换
同步加载(当前场景会卡主)和异步加载(加载新的场景,不阻塞当前场景的运行)
新建两个场景
1、把需要切换的场景全部添加到Build Setting
2、添加命名空间using UnityEngine.SceneManagement;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;   // 场景管理
public class MenuControl : MonoBehaviour {
    public float w = 100;
    public float h = 50;
       // Use this for initialization
       void Start () {
              
       }
       
       // Update is called once per frame
       void Update () {
              
       }
    void OnGUI()
    {
        //  w h    Sceen.Width Sceen.Height       x =  (Screen.width - w)/2    y = (Screen.height - h)/2
        float x = (Screen.width - w) / 2;
        float y = (Screen.height - h) / 2;
        if (GUI.Button(new Rect(x, y, w, h), "开 始 游 戏"))
        {
            // 切换到 游戏场景    同步加载(当前场景会卡主)   异步加载(不会阻塞当前场景的运行)
            SceneManager.LoadScene("GameScene");//可以添加Build Setting里的字符串
        }
        if(GUI.Button(new Rect(x, y + 2 * h, w, h), "退 出 游 戏"))
        {
            Application.Quit();  // 退出游戏 发布以后才有作用 编辑器状态无效
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/ciaowoo/p/10362800.html