欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

游戏中的数学之3D基础

程序员文章站 2022-03-26 14:41:37
...

目录

 

1.方向向量

2.矩阵旋转

3.欧拉角

4.Quaternion

5.互相转换


1.方向向量

1: forward, up, right为单位方向向量,世界坐标系下的

2: 单位向量 * 标量 = 得到的是这个标量在这个单位向量的x, y, z的分解;

3:编程实现一个物体向前方以每秒10米的速度移动;

4: 世界坐标转局部坐标,局部坐标转世界坐标;

5.平移物体 使用Translate;

6.缩放物体  localScale, lossyScale(只读),(+, -)平移 (*, /)缩放  (==, != ) 比较

7.lerp 与Slerp 参考:游戏中的数学之各种插值

8.Angle, Distance, Min, Max,

2.矩阵旋转

优点:      

1: 旋转轴可以是任意向量;

缺点:       旋转其实只需要知道一个向量+一个角度,一共4个值的   信息,但矩阵法却使用了16个元素

3.欧拉角

0: 表示物体旋转, 绕哪个轴旋转多少度。

1:优点:     (1)很容易理解,形象直观;     (2)顺序不同会造成不同的结果, unity规定ZXY顺序;

2: 缺点:    (1)会造成万向节锁(Gimbal Lock)的现象

        //按z轴旋转45度 1
        transform.Rotate(new Vector3(0, 0, 45));
        //按z轴旋转45度 2
        transform.Rotate(new Vector3(0,0,1),45);

 

4.Quaternion

1:四元数是一种表示旋转的方式;

2:优点:    

(1)可以避免万向节锁现象;    

(2)只需要一个4维的四元数就可以执行绕任意过原点的向量的旋转,方便快捷,在某些实现下比旋转矩阵效率更高    

        //1.头顶方向 worldUp (绕哪个轴进行旋转)
        //目标点,头顶方向
        transform.LookAt(new Vector3(0,5,5),new Vector3(0,1,0) );
        transform.LookAt(new Vector3(0, 5, 5),  Vector3.up);

        //返回四元素 一般使用lookat //根据自己的上方向盯着前方
        var rot= Quaternion.LookRotation(transform.position);
        transform.rotation = rot;

        //获得俩个四元素的角度(夹角)(进行旋转进行插值)
        // Quaternion.Angle();

        //从开始向量到目标向量的旋转
        var fromQ= Quaternion.FromToRotation(new Vector3(0,0,1),new Vector3(1,0,1));

 

(3)可以提供平滑插值;

3.缺点:     比欧拉旋转稍微复杂了一点点,因为多了一个维度;

4.详细参考:http://www.cnblogs.com/yiyezhai/p/3176725.html

 

   void Update()
    {
        float d = 360 * Time.deltaTime;
        //把每个小变换组城一个大的比变换,是用乘法(和矩阵是类似的)
        this.transform.rotation = transform.rotation * Quaternion.Euler(new Vector3(0, d, 0));

        //
        var center = Vector3.zero;

        //以圆心 绕y旋转 45
        transform.RotateAround(center, new Vector3(0,1,0),45); ;
    }

5.互相转换

1:transform存放一个代表旋转的四元数rotation;

2:四元数转换成对应的欧拉角 eulerAngles;

3: 欧拉角,转成四元数Quaternion.Euler();

4:  Rotate(欧拉角度);

        //  Euler to Quaternion
        var q = Quaternion.Euler(new Vector3(0,45,0));

        //Euler to Quaternion
        var e= transform.rotation.eulerAngles;