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
    评论
Unity中,Shader是用来定义物体表面的着色和渲染效果的一种程序。在Unity5.2及以上的版本中,Unity提供了四种Shader模板供我们选择。其中,Standard Surface Shader会产生一个包含了标准光照模型的表面着色器模板;Unity Shader会产生一个不包含光照(但包含雾效)的基本顶点/片元着色器;Image Effect Shader为我们实现各种屏幕后处理效果提供一个基本模板;Computer Shader则产生一种特殊的Shader文件,用于进行一些与常规渲染流水线无关的计算。一个单独的Unity Shader不能单独发挥作用,必须要和材质结合起来使用。 每一个Unity Shader文件可以包含多个SubShader语义块,但最少要有一个。当Unity需要加载一个Unity Shader时,会扫描所有的SubShader语义块,然后选择第一个能够在目标平台上运行的SubShader。如果都不支持的话,Unity会使用Fallback语义指定的Unity Shader。这是因为不同的显具有不同的能力,一些旧的显仅能支持一定数目的操作指令,而一些更高级的显可以支持更多的指令数。因此,我们希望在旧的显上使用计算复杂度较低的着色器,而在高级的显上使用计算复杂度较高的着色器,以提供更出色的画面效果。 SubShader的标签是一个键值对,它的键和值都是字符串类型。这些键值对是SubShader和渲染引擎之间的沟通桥梁,用来告诉Unity的渲染引擎应该以怎样的方式和何时渲染这个对象。具体情况可以查看相关的表格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值