Unity Shader数学基础——笛卡尔坐标,点,矢量

笛卡尔坐标系

在游戏制作中我们使用数学绝大部分都是为了计算位置,距离和角度等变量。这些计算大部分都是在笛卡尔坐标系下进行的。

二维笛卡尔坐标系

一个二维笛卡尔坐标系包含两个部分的信息:

  1. 一个特殊的位置,即原点,他是整个坐标系的中心。
  2. 两条通过原点的相互垂直的矢量,即X轴和Y轴这些坐标轴也被成为该坐标的基矢量。

 

三维笛卡尔坐标系

在三维笛卡尔坐标系中,我们需要定义3个坐标轴和一个原点。这三个轴也被称为该坐标的基矢量。通常情况下,这三个坐标轴之间是相互垂直的而且长度为1,这样的矢量也被称为标准正交基,但是这并不是必须的。在一些坐标系中坐标轴之间是相互垂直的但是长度不为1,这样的矢量被称为正交基。

三维笛卡尔坐标系的坐标轴方向不是固定的,导致两种不同的坐标系,左手坐标系和右手坐标系。

判断向前的方向,向右伸直右手,此时右手的方向就是X轴的正方向,头顶方向就是Y轴的正方向,这时如果你的正方向是Z轴正方向就是一个左手坐标系;如果你的正方向是Z轴的负方向就是右手坐标系。

除了坐标轴的朝向不同为,左手坐标系和右手坐标系对于正向旋转的定义也不同,即左手法则和右手法则。

点和矢量

点,是N维空间中的一个位置,他没有大小,宽度概念。

矢量,矢量是指N维空间中的一种包含了模和方向的有向线段。

  1. 矢量的模指的是矢量的长度,一个矢量的长度可以是任意的非负数。
  2. 矢量的方向是这个矢量在空间中的指向。V=(X,Y)来表示二维矢量,用V=(X,Y,Z)来表示三维矢量,V=(X,Y,Z,W)来表示四维向量。

矢量的运算

矢量和标量的乘法/除法

矢量的加法和减法

一个矢量不可以和一个标量相加减。

矢量的模

矢量是有模和方向的。矢量的模是一个标量,可以理解成矢量在空间中的长度。

单位矢量

单位矢量是指那些模为1的矢量。单位矢量也被称为被归一的矢量。对于任何非零的矢量,把他转化成单位矢量的过程就是归一化。

矢量的点积

点积的名称来源于这个运算符号:a·b。中间的圆点符号是不可以省略的。

 

点积的几何意义很重要,因为点积几乎应用到了图形学的各个方面。其中一个几何意义就是投影。

也就是说点积的符号可以让我们知道两个矢量的反向关系。

点积具有一些很重要的性质。

性质一:点积可以结合标量乘法。

对点积中其中一个矢量进行缩放的结果,就相当于对最后的点积结果缩放。

性质二:点积可以结合矢量加法和减法,和性质一类似。

性质三:一个矢量和本身进行点积的结果,是该矢量的模的平方。

矢量的叉积

矢量的叉积结果是一个矢量,而非标量。

注意叉积不满足交换规律axb≠bxa。

叉积最常见的一个应用就是计算垂直于一个平面的矢量。另外还可以判断三角面片的朝向。

点积和叉积在unity中的演示

 public Transform initial;
    public Transform target;
    void Start()
    {
        var initialForward = initial.forward;
        var initialTargetVector = target.position - initial.position;
        var dot = Vector3.Dot(initialForward, initialTargetVector);
        if (dot > 0)
        {
            Debug.Log("target在cube的后面");
        }
        else if (dot < 0)
        {
            Debug.Log("target在cube的前面");
        }
        else
        {
            Debug.Log("target和cube平行");
        }

        var cross = Vector3.Cross(initialForward, initialTargetVector);
        if (cross.y > 0)
        {
            Debug.Log("target在cube的右面");
        }
        else if (cross.y < 0)
        {
            Debug.Log("target在cube的左面");
        }
        else
        {
            Debug.Log("target在cube的前面或者后面");
        }
    }

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值