游戏中的数学之3D基础
目录
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;
上一篇: 3D数学基础:图形与游戏开发(第6章3D向量类)笔记
下一篇: three.js笔记