精华内容
下载资源
问答
  • 2022-04-12 22:56:28

    游戏开发要掌握的数学物理知识

    在这里插入图片描述

      游戏开发其实对数学和物理知识的要求比普通的开发来说还是比较高的,很多地方都需要用到数学和物理知识。如果想要进入到一线游戏开发大厂,那么就必须对数学知识和算法有足够的了解。甚至我们在做游戏的核心业务逻辑开发时,比如人物角色的移动、敌机与子弹的碰撞等,也需要用到相关的数学和物理知识。如果这些基础知识不过关或者不熟练,那么在开发过程中就会很吃力。我们来列举一些游戏开发中经常用到的数学和物理知识吧。

    一、向量与三角函数

      日常游戏开发中经常用到的数学知识就包括三角函数、反三角函数、向量、向量分解等。比如玩家控制角色沿着某个方向行走,就需要计算如何给角色施加正确的速度大小与方向,这些就需要上面的数学基础知识。

    • 现在已知方向向量,然后根据方向向量进行向量分解,把大小分解到对应的方向上。

      dx = cos(a)
      dy = sin(a)
      
    • 根据向量,利用反三角函数算出角度,获得角色移动的朝向。

      atan2(y, x)
      

    二、常用的几何函数与求解

    • 例1:圆周运动

        编写代码来实现一个物体绕某个点做圆周运动,这个其实就是一个典型的数学问题。现在已知圆心位置和半径,如何实现物体的圆周运动呢?

      • 圆的方程:

        (x-x0)^2 + (y-y0)^2 = R^2
        

        其中x0和y0为圆心坐标, R为半径。

      • 圆的参数方程:

        x = x0 + R * cos(a)
        y = y0 + R * sin(a)
        

        其中a为角度。如下图所示:

        image.png

        掌握这两个公式以后,写代码自然就没有什么问题了。在物体的update函数中,不断的改变a的角度,带入公式算出物体的x和y坐标,然后设置为物体的新坐标就可以啦。

      update(dt) {
          this.angle += this.angleSpeed * dt; // angleSpeed为角速度,angle为角度
          this.x = this.x0 + cos(this.angle) * this.radius; // x0为圆心x坐标,x为物体的x坐标
          this.y = this.y0 + sin(this.angle) * this.radius; // y0为圆心y坐标,y为物体的y坐标
      }
      
    • 例2:绘制抛物线的辅助轨迹

        有时我们在编写设计类游戏的时候,需要绘制辅助轨迹,例如愤怒的小鸟的弹射轨迹、炮弹的发射轨迹、篮球的运动轨迹等都是插线,这时就需要我们有抛物线的相关数学知识。看如下公式:

      y = ax^2 + bx + c
      

      抛物线公式还有另一个形式:

      y = a(x - x0)^2 + h
      

      上面的公式能够看出轨迹的最高点或者最低点的坐标

      看如下图:

        image.png

    • 例3:扇形

        以玩家为中心在身后的指定扇形范围内, 随机位置生成对应的物体。如图:

        image.png

        现已知圆心位置、扇形左边边界的角度、扇形右边边界的角度以及最大的半径R,要在扇形范围内随机生成一个物体。按如下步骤实现:

      • 第1步: 在[lhs, rhs]范围内随机生成一个角度, 例如上图中红色的线。

        a = lhs + (rhs - lhs) * random()
        
      • 第2步: 在[0, R]内随机生成一个半径r。

        r = R * random()
        
      • 第3步: 带入例1的圆的参数方程,可以求得生成的位置。

        x = x0 + r * cos(a)
        y = y0 + r * sin(a)
        
    • 例4:直线方程与反射

        台球游戏的时候,需要绘制辅助线。先看如下图:

      image.png

        在理想情况下,当白球击中目标球之后,目标球会沿着两个球的中心的连线方向运动。而白球与目标球运行方向之间的夹角理应为90度,此为分离角。知道这两点之后,就可以绘制出辅助线。另外,当球体碰撞到边界后,应该以镜面反射的方式运行,也可以由此绘制出辅助线。当然,实际中的台球运动可没这么简单,此处不过多讨论。

    三、贝塞尔曲线编辑路径

      贝塞尔曲线(Bezier curve),是应用于二维图形应用程序的数学曲线。常用的三次贝塞尔曲线包括起点、终点和两个控制点。

      image.png

      使用多段贝塞尔曲线可以勾画出任意形状的平滑曲线。所以在地图路径编辑的时候,贝塞尔曲线是非常好的路径编辑工具。使用路径编辑工具编辑好每段路径以后,再把路径点生成出来,这样就可以实现地图上的任意路径的曲线形状了。大部分曲线路径编辑都是通过贝塞尔曲线来实现的。在捕鱼游戏中,也能使用贝塞尔曲线来模拟鱼的平滑运动。

      image.png

      在Cocos Creator 3.x引擎中,就封装了贝塞尔曲线的使用。可以在引擎的motion-path-helper.ts中找到Bezier类,可以计算出一段曲线的长度,也可以计算出特定时间的曲线上的点。可以通过此Bezier类来实现自己的Curve类。

    四、模拟常见的物理运动

      常见的物理运动有匀速直线运动、匀变速直线运动以及这些运动的组合。这些常见的物理运动,在游戏开发中需要能够熟练的实现出来。例如一个物体,移动的时候,要慢慢的停下,就需要知道速度和加速度的相关知识。比如抽奖,数字滚动后最终要慢慢的停下来,也需要运用速度和加速度的知识。

    update(dt) {
        this.position += this.speed * dt + 0.5 * this.accelSpeed * this.accelSpeed * dt;
        this.speed += dt * this.accelSpeed;
    }
    

    五、3D游戏开发中常用的高等数学

      3D游戏开发中的向量、矩阵、四元数、法线、点乘、叉积,应该来说是最常用的数学工具了。

    • 3D向量(Vec3)和2D向量(Vec2)差不多,只是多了一个维度,算法基本上都是一样的。

    • 矩阵(Matrix)其实就是数学工具,用来处理坐标变换的。3D里面常用的矩阵有三种:平移、旋转、缩放。每个变换都可以是一个独立的矩阵,然后把这三种变换叠加在一起之后得到一个新的矩阵。例如,把模型A放大2倍后(缩放矩阵),然后放在世界的某个位置(平移矩阵),最后朝向东北方向(旋转矩阵),这样就把美术的模型变换到了世界中。这三种矩阵既可以分开,也可以合并成一个新矩阵,到时候每个模型点乘这个矩阵,就把坐标转换到了世界坐标。

      Cocos Creator中的矩阵类为Mat4,使用也非常简单。

    • 四元数(Quaternion)也是一个用来表示旋转的很好的数学工具,以及它的原理这些。

      Cocos Creator中的四元数类为Quat。

    • 欧拉角(Euler Angles)也可以用来表示旋转

      Cocos Creator中的欧拉角也是用的Vec3。

    总结

      不管是使用Cocos Creator引擎开发,还是使用Unity3D引擎开发游戏,掌握基本的数学知识还是必要的。
    at。

    • 欧拉角(Euler Angles)也可以用来表示旋转

      Cocos Creator中的欧拉角也是用的Vec3。

    总结

      不管是使用Cocos Creator引擎开发,还是使用Unity3D引擎开发游戏,掌握基本的数学知识还是必要的。

    更多相关内容
  • 游戏开发数学基础

    2019-01-28 10:30:09
    游戏开发数学基础!!
  • 《3D数学基础:图形与游戏开发》专业培训机构指定教学参考书,多家游戏开发企业共同推荐,游戏业界权威,探索游戏开发背后的核心秘密。《3D数学基础:图形与游戏开发》主要介绍了基本的3D数学概念,这对电脑游戏开发人员和...
  • 微信小程序开发数字
  • 《3D数学基础:图形与游戏开发》主要介绍了基本的3D数学概念,这对电脑游戏开发人员和编程人员来说尤为重要。作者详尽地讨论了数学理论,并在必要时提供几何说明,帮助读者形成直观的3D感。书还提供了将理论应用于实践...
  • 3D数学基础:图形与游戏开发 中英双版本加源代码,找了好几个版本,这个版本有源代码,分享给大家一同学习
  • 主要为大家详细介绍了Android数字华容道小游戏开发的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 游戏开发中的基本数学与物理

    千次阅读 2022-01-13 23:18:40
    日常生活,我们形容一个角,常常使用的是角度、而在数学中需要使用弧度的概念,这在游戏开发中也经常需要转换。(我在Unity和UE的开发当中,都有遇到过这样的需求)。弧度是以原点为中心的单位半径圆为基准的一种...

    本章中会记录数学中的角度与弧度的变换,勾股定理,矢量加减、矢量数乘、矢量分解,矢量点乘等。
    物理中的距离、速度、加速度、力之间的关系与应用。
    来源为:游戏人工智能编程案例精粹(修订版)第一章

    一、数学

    1.1 角度与弧度的变换

    日常生活中,我们形容一个角,常常使用的是角度、而在数学中需要使用弧度的概念,这在游戏开发中也经常需要转换。(我在Unity和UE的开发当中,都有遇到过这样的需求)。弧度是以原点为中心的单位半径圆为基准的一种度量单位。
    在这里插入图片描述
    由于圆的周长为2PI,所以每个圆都有2PI弧度(Radians)。PI为圆周率,3.1415926。

    360角度=2PI弧度 (1-1)

    如果角度换弧度的公式为:

    1角度=(2PI/360)弧度
    1弧度=(360/2PI)角度 (1-2)

    1.2 勾股定理

    由于勾股定理只能用于直角三角形,这里只讨论直角三角形。
    直角三角形有一个角为PI/2弧度(90角度),即直角的三角形。
    勾股定理一个直角三角形直角所对应的斜边的平方等于其他两个边的平方和
    在这里插入图片描述

    c2=a2+b2 (1-3)

    这意味着知道一个直角三角形的任意两个边的任意两个边的长度,就能找到第三边。
    通过勾股定理,我们可以计算两个物体之间的距离。不过需要记得少用开方,因为开方计算很慢,可以直接使用平方即可。比如 a2+b2<距离2

    来个实例:
    比如有一个枪手(10,4)的射击范围是10米,目标敌人的位置为(2,3),请问枪手可以在不移动的情况下 射杀目标敌人吗?
    在这里插入图片描述
    红点为射手,蓝点为目标敌人。
    距离2=(10-2)2+(4-3)2=65<100(102)

    1.3 三角函数

    在这里插入图片描述

    sin(θ)=对边/斜边
    cos(θ)=邻边/斜边
    tan(θ)=对边/邻边(1-4)

    三角函数在游戏开发中的应用就是计算角度。可以使用反三角函数来计算两个矢量之间的夹角。

    1.4 矢量

    1.4.1 矢量加减
    如果我们的位置在坐标系的(0,0)处,有一张藏宝图告诉我们,需要通过矢量A(-2,1)和 B(3,0)去找到宝藏,但是我们懒得按照它规定的路线去,就想直接去目的地。这个时候就需要用到矢量的加法了。
    在这里插入图片描述
    A+B=(-2,1)+(3,0)=(1,1)

    待我们计算出来之后,就可以直接通过目标向量去往目标点了。

    1.4.2 计算矢量的大小
    矢量的大小(模)是它的长度。
    一个矢量的大小,我们可以通过勾股定理来计算。

    模=(x2+y21/2(1-5)

    这个公式可以帮我们计算两个角色之间的距离,示例的话,就是1.2中的例子。

    1.4.3 矢量归一化
    归一化就是用矢量的每一个分量去除以矢量的模。

    N=(v/|v|)

    举例,归一化矢量(4,5),其模为6.403,所以归一化后的向量为(4/6.403,5/6.403)=(0.62,0.78)。

    1.4.4 矢量点乘

    有两个二维矢量 u,v,两者点乘的两个公式如下:
    (1) u·v=uxvx+uyvy =x分量相乘加上 y分量相乘
    (2) u·v=|u||v|cos(θ)=两个向量的模相乘,再乘以余弦角度
    如此,我们便能得到

    cos(θ)=u·v/(|u||v|)(1-6)

    所以如果我们将两个向量归一化后,他们的模,如|u|为1时,

    cos(θ)=uxvx+uyvy(1-7)

    如此再通过一个反余弦函数 acos(uxvx+uyvy) 就能得到角度θ了。

    矢量点乘不仅能帮我们得到两个向量间的夹角,还能帮我知道一个怪物是否在主角的背后。
    即主角的向前矢量与怪物到主角的矢量点乘之后,如果为正值,则怪物在主角的正面,如果为负值,则在背后。

    还是用前面那个问题来举例:
    比如有一个枪手在(10,4),朝向为Y轴,目标敌人的位置为(2,3),请问枪手需要转向多少度才能面向目标?
    在这里插入图片描述
    红点为枪手,蓝点为目标。枪手的初始向前矢量为(0,1),枪手朝向目标的矢量为(8,1)。
    枪手朝向目标的归一化 矢量为(0.99,0.12)。

    cos(θ)=(0x0.99)+(1x0.12)=0.12
    θ=acos(0.12)=1.45弧度=83.10角度

    1.4.5 求旋转向量
    如果已知一个向量与其要旋转的角度,如何计算旋转后的向量呢?

    如此:便设已知向量为A,旋转角度为θ,未知向量为B

    B=(Xa * cos(θ)-Ya*sin(θ),Xa * sin(-θ)+Yacos(-θ))(1-8)

    具体推导过程请查看二维向量的旋转

    二、物理

    2.1 距离计算公式

    ∆x=(v*∆t) ,其中v为速度,∆x为单位时间内行驶的距离,∆t为单位时间 (2-1)

    可以用于计算游戏当中单位时间内物体的移动距离,比如:x的位置+=前进向量*刷新帧时间。

    2.2、速度的计算公式

    v=(∆x/∆t) ,其中v为速度,∆x为单位时间内行驶的距离,∆t为单位时间 (2-2)

    2.3、加速度的计算公式

    a=(∆v/∆t),其中a为加速度,∆v为单位时间内的速度,∆t为单位时间。(2-3)

    如果加速度恒定的话,

    v=at+u,其中a为加速度,v为速度,t为时间,u为初始速度。(2-4)

    举例:一辆车的起始速度为1m/s,之后以2m/s加速,请问3秒后小车的速度?
    v=2*3+1=7m/s

    速度与时间图(y轴为速度,x轴为时间)如下:

    在这里插入图片描述
    速度与时间图,有一个有趣的特点就是:在两个时间点之间的图的下方面积等于物体在这段时间中行进的距离。
    在这里插入图片描述

    因此:

    A的面积 = ∆t * u
    B的面积 = ∆t * (v-u) /2

    距离:

    ∆x=∆t * u+∆t * (v-u) /2 (2-5)

    将v-u=∆v=a∆t带入上述距离公式(2-5),可得一个距离与时间与加速度的关系式

    ∆x=∆t * u+a *∆ t 2 *(1/2) (2-6)

    如果在将∆t=(v-u)/a带入公式(2-6),可得一个距离与速度、加速度的公式。

    v2=u2+2a * ∆x (2-7)

    2.4 力

    如果一个物体是静态的或者是保持匀速直线运动,所有作用在它身上的力的和一定为零。如果这些力的和不为零,那么物体将会沿着合力的方向加速而去。

    力的计算公式

    F=am,其中F为力的大小,a为加速度,m为物体的质量。(2-8)

    记住:这个公式可以用于计算,多个力施加到一个物体时,物体的移动。比如:游戏人工智能编程案例精粹 第三章中的Flocking算法。

    展开全文
  • 游戏开发中的向量数学

    千次阅读 2020-12-09 17:54:20
    游戏开发中的向量数学介绍坐标系(2D)向量运算会员访问添加向量标量乘法实际应用运动指向目标单位向量正常化反射点积面对叉积计算法线指向目标 介绍 本教程是线性代数的简短实用介绍,因为它适用于游戏开发。线性...

    介绍

    本教程是线性代数的简短实用介绍,因为它适用于游戏开发。线性代数是向量及其用途的研究。向量在2D和3D开发中都有许多应用,并且Godot广泛使用它们。对矢量数学有深入的了解对于成为一名强大的游戏开发者至关重要。

    注意

    本教程不是关于线性代数的正式教科书。我们只会研究如何将其应用于游戏开发。要更广泛地了解数学,请参见https://www.khanacademy.org/math/linear-algebra

    坐标系(2D)

    在2D空间中,使用水平轴(x)和垂直轴(y)定义坐标。2D空间中的特定位置被写为一对值,例如。(4, 3)

    ../../_images/vector_axis1.png

    注意

    如果您是计算机图形学的新手,那么正y轴是指向下而不是指向上,这似乎很奇怪,就像您在数学课上学到的那样。但是,这在大多数计算机图形应用程序中很常见。

    二维平面中的任何位置都可以通过一对数字来标识。 但是,我们也可以将位置(4,3)视为与(0,0)点或原点的偏移量。 绘制一个从原点指向该点的箭头:

    ../../_images/vector_xy1.png

    这是一个向量。 向量代表许多有用的信息。 除了告诉我们该点位于(4,3)之外,我们还可以将其视为角度θ和长度(或大小)m。 在这种情况下,箭头是位置矢量-它表示相对于原点的空间位置。

    关于矢量要考虑的非常重要的一点是,它们仅代表相对方向和大小。没有向量位置的概念。以下两个向量是相同的:

    ../../_images/vector_xy2.png

    两个向量都代表一个点,该点向右4个单位,在某个起点下方3个单位。在平面上绘制矢量的位置无关紧要,它始终表示相对方向和大小。

    向量运算

    您可以使用任何一种方法(x和y坐标或角度和大小)来引用矢量,但是为了方便起见,程序员通常使用坐标符号。例如,在Godot中,原点是屏幕的左上角,因此,要使用一个名为Node2D400像素,向下300像素的2D节点,请使用以下代码:

    var node2D = (Node2D) GetNode("Node2D");
    node2D.Position = new Vector2(400, 300);
    

    Godot同时支持Vector2和 Vector3的2D和3D使用。本文讨论的相同数学规则适用于两种类型。

    会员访问

    可以直接通过名称访问向量的各个组成部分。

    // create a vector with coordinates (2, 5)
    var a = new Vector2(2, 5);
    // create a vector and assign x and y manually
    var b = new Vector2();
    b.x = 3;
    b.y = 1;
    

    添加向量

    当相加或相减两个向量时,将添加相应的分量:

    var c = a + b;  // (2, 5) + (3, 1) = (5, 6)
    

    我们还可以通过在第一个向量的末尾添加第二个向量来直观地看到这一点:

    ../../_images/vector_add1.png

    注意,加a + b的结果与b + a相同。

    标量乘法

    注意

    向量代表方向和大小。仅代表幅度的值称为标量。

    一个向量可以乘以一个标量:

    var c = a * 2;  // (2, 5) * 2 = (4, 10)
    var d = b / 3;  // (3, 6) / 3 = (1, 2)
    

    ../../_images/vector_mult1.png

    注意

    标量乘以向量不会改变其方向,只会改变其大小。这就是缩放向量的方式。

    实际应用

    让我们看一下向量加法和减法的两种常见用法。

    运动

    向量可以表示具有大小和方向的任何数量。典型示例是:位置,速度,加速度和力。在此图像中,步骤1的太空飞船的位置矢量为(1,3),速度矢量为(2,1)。速度矢量表示船每步移动多远。我们可以通过将速度添加到当前位置来找到步骤2的位置。

    ../../_images/vector_movement1.png

    提示

    速度测量单位时间的位置变化。通过将速度添加到先前位置来找到新位置。

    指向目标

    在这种情况下,您有一个坦克,希望将其炮塔指向机器人。从机器人的位置减去水箱的位置即可得出从水箱指向机器人的向量。

    ../../_images/vector_subtract2.png

    提示

    要找到一个向量指向A来B使用。B - A

    单位向量

    大小为的向量1称为单位向量。它们有时也称为方向向量或法线。当需要跟踪方向时,单位矢量会很有用。

    正常化

    归一化向量意味着将其长度减小到,1同时保留其方向。这是通过将其每个组成部分除以其大小来完成的。因为这是这样一个共同的操作, Vector2并Vector3提供一种用于归一化的方法:

    a = a.Normalized();
    

    警告

    由于规范化涉及除以向量的长度,因此无法规范化length的向量0。尝试这样做将导致错误。

    反射

    单位向量的一种常见用法是指示法线。法线向量是垂直于表面对齐并定义其方向的单位向量。它们通常用于照明,碰撞以及涉及曲面的其他操作。

    例如,假设我们有一个要从墙或其他物体上反弹的运动球:

    ../../_images/vector_reflect1.png

    表面法线的值为(0,-1),因为它是水平面。 当球碰撞时,我们采取其剩余的运动(当其击中表面时剩余的量)并使用法线反射它。 在Godot中,Vector2类具有bounce()方法来处理此问题。 这是上面使用KinematicBody2D的图的GDScript示例:

    // KinematicCollision2D contains information about the collision
    KinematicCollision2D collision = MoveAndCollide(_velocity * delta);
    if (collision != null)
    {
        var reflect = collision.Remainder.Bounce(collision.Normal);
        _velocity = _velocity.Bounce(collision.Normal);
        MoveAndCollide(reflect);
    }
    

    点积

    该点积是矢量数学最重要的概念之一,但经常被误解。点积是对两个向量返回标量的运算。与既包含幅度又包含方向的向量不同,标量值仅包含幅度。

    点积的公式有两种常见形式:

    ../../_images/vector_dot1.png

    ../../_images/vector_dot2.png

    但是,在大多数情况下,最容易使用内置方法。请注意,两个向量的顺序无关紧要:

    float c = a.Dot(b);
    float d = b.Dot(a); // These are equivalent.
    

    与单位向量一起使用时,点积最有用,这会使第一个公式简化为just cosθ。这意味着我们可以使用点积来告诉我们有关两个向量之间的角度的一些信息:

    ../../_images/vector_dot3.png

    使用单位矢量时,结果将始终在-1(180°)和1(0°)之间。

    面对

    我们可以利用这一事实来检测一个对象是否面向另一个对象。在下图中,玩家P试图避开僵尸A和B。假设僵尸的视野为180°,他们可以看到玩家吗?

    ../../_images/vector_face2.png

    绿色箭头fA和fB是代表僵尸面向方向的单位矢量,蓝色半圆形代表其视野。 对于僵尸A,我们使用P-A找到指向玩家的方向向量AP并将其标准化,但是Godot有一个辅助方法来执行此操作,称为direction_to。 如果此向量和面对的向量之间的角度小于90°,则僵尸可以看到玩家。

    在代码中,它看起来像这样:

    var AP = A.DirectionTo(P);
    if (AP.Dot(fA) > 0)
    {
        GD.Print("A sees P!");
    }
    

    叉积

    像点积一样,叉积是对两个向量的运算。但是,叉积的结果是一个向量,向量的方向垂直于两者。其大小取决于它们的相对角度。如果两个向量平行,则其叉积的结果将为空向量。

    ../../_images/vector_cross1.png
    ../../_images/vector_cross2.png

    叉积计算如下:

    var c = new Vector3();
    c.x = (a.y * b.z) - (a.z * b.y);
    c.y = (a.z * b.x) - (a.x * b.z);
    c.z = (a.x * b.y) - (a.y * b.x);
    

    使用Godot,您可以使用内置方法:

    var c = a.Cross(b);
    

    注意

    在交叉产品中,订单至关重要。a.cross(b)与给出的结果不同b.cross(a)。所得的矢量指向相反的方向。

    计算法线

    叉积的一种常见用法是在3D空间中找到平面或曲面的表面法线。如果我们有三角形,ABC则可以使用矢量减法找到两个边AB和AC。使用叉积, 产生一个垂直于两个方向的向量:表面法线。AB x AC

    这是一个计算三角形法线的函数:

    Vector3 GetTriangleNormal(Vector3 a, Vector3 b, Vector3 c)
    {
        // find the surface normal given 3 vertices
        var side1 = b - a;
        var side2 = c - a;
        var normal = side1.Cross(side2);
        return normal;
    }
    

    指向目标

    在上面的点积部分,我们看到了如何将其用于查找两个向量之间的角度。但是,在3D中,这还不够。我们还需要知道要旋转的轴。通过计算当前朝向和目标方向的叉积可以发现。所得的垂直向量是旋转轴。

    更多信息
    有关在Godot中使用向量数学的更多信息,请参见我后续的文章:

    进阶向量数学
    矩阵与变换

    展开全文
  • 游戏开发中应用的数学和物理入门教程-游戏开发中应用的数学和物理入门教程-游戏开发中应用的数学和物理入门教程-游戏开发中应用的数学和物理入门教程-游戏开发中应用的数学和物理入门教程-游戏开发中应用的数学和...
  • 资源名称:3D数学基础:图形与游戏开发资源截图: 资源太大,传百度网盘了,链接在附件,有需要的同学自取。
  • Unity和C#-游戏开发-数学游戏+源代码工程
  • 3D数学基础:图形与游戏开发。清华大学出版社初版。图形与游戏开发入门的帮手。
  • 资源名称:3D数学基础图形与游戏开发资源截图: 资源太大,传百度网盘了,链接在附件,有需要的同学自取。
  • 游戏中数学与物理学 游戏中数学与物理学 第2版_PDF电子书下载 高清 带索引书签目录_(美)JohnPatrickFlynt 著
  • 游戏开发者必须看的3D数学相关知识,为你日后在这个行业里真的成为高手的必备书籍
  • 视频学习,跟直观详细。适合想学习计算机图形方面的知识,想在游戏开发方面有提高的开发者。
  • 3D数学基础:图形与游戏开发书籍pdf与源码 3D数学基础:图形与游戏开发书籍pdf与源码
  • 数独游戏是一种源自18世纪末的瑞士的游戏,后在美国发展、并在日本得以发扬光大的数学智力拼图游戏。在每一个小九宫格,分别填上1至9的数字,让整个大九宫格每一列、每一行的数字都不重复。 数独的玩法逻辑简单,...
  • 资源名称:3D游戏与计算机图形学数学方法英文 源代码 内容简介:本书介绍了开发专业级三维图形引擎所需的数学方法,书介绍的关于游戏开发方面的许多知识同样适用于三维计算机图形学相关的应用。本书首先...
  • 游戏开发中数学和物理算法;游戏开发中数学和物理算法
  • [3D数学基础:图形与游戏开发][中文版+英文版+随书源码](3D.Math.Primer.for.Graphics.and.Game.Development).(美)Fletcher.Dunn 本人在阅读过程发现书中一处错误,为避免误导更多的同学,有兴趣的可参见我的空间...
  • 一个采用Javascript写的网页小游戏,猜数字游戏代码,挺简单的,相信有不少朋友对这个游戏感兴趣,开发智力,玩法说明:请先想好一个数字(0到63之间的数),然后开始,按照提示作相应问答,系统就能猜出那个数,按...
  • 《3D数学基础:图形与游戏开发》一书的英文原版电子档,高清,绝对不是扫描版,配有详细的书签,可用来与中文版互查使用,最后配上中文版的目录以供大家参考下载 第1章 简介 1.1 什么是3D数学 1.2 为什么选择本书 ...
  • 游戏和图形学的3D数学入门教程 3D数学基础:图形与游戏开发 中文版资料,非常值得阅读!
  • 第四天 游戏开发数学基础

    千次阅读 2022-04-18 13:03:10
    第四天 游戏开发数学基础

    一、数学对游戏的重要性

     

    二、坐标系

    1、世界坐标系

    2、左手坐标系与右手坐标系

    Tip:

    3、局部坐标系

     

     代码:

      

    4、屏幕坐标系

    三、向量

    Tip:

    1、向量加法

    减法:方向-减数指向被减数。

    2、向量减法

    3、向量乘数

    4、向量的点积

     

    5、向量的叉积

    6、Vector3的结构体

    7、位置与向量的关联

    8、向量坐标系的转换

     

     

    四、矩阵简介

     1、常用矩阵介绍

    (1)平移矩阵

    (2)旋转矩阵

    (3)缩放矩阵

     

    2、齐次坐标

    五、四元数

    1、万向节锁定

     Tip:

    2、四元数的概念

    3、Quaternion结构体

    4、理解和运用四元数

    5、四元数的插值

    6、朝向与向量

     

    六、实例:第一人称视角的角色控制器

    1、搭建简单场景

     

     

    2、创建主角物体

     

     

    可以通过旋转查看视觉效果:

     

     

    3、编写控制脚本——移动部分

    using UnityEngine;
    
    public class ChaMove : MonoBehaviour
    {
        public float speed = 5f;
    
        private Rigidbody body;
    
        bool jump;
    
        void Start()
        {
            body = transform.GetComponent<Rigidbody>();
            jump = true;
        }
    
        void Update()
        {
            Move();
            //弹跳
            if (Input.GetKeyDown(KeyCode.Space))
            {
                JumpFunc();
            }
        }
    
        void Move()
        {
            float x = Input.GetAxis("Horizontal");
            float z = Input.GetAxis("Vertical");
            //反向永远平行地面,主角不能上天
            //获得角色前方向量,将Y轴分量设为0
            Vector3 fwd = transform.forward;
            Vector3 f = new Vector3(fwd.x, 0, fwd.z).normalized;
    
            //角色的右方向向量与右方向移动直接对应,与抬头无关,可直接使用
            Vector3 r = transform.right;
    
            //用f和r做向量的基,组合成移动向量
            Vector3 move = f * z + r * x;
    
            //直接改变玩家位置
            transform.position += move * speed * Time.deltaTime;
        }
    
    
        public void JumpFunc()
        {
            Ray ray = new Ray(transform.position, Vector3.down);
    
            RaycastHit hit;
    
            Vector3 dow = transform.TransformDirection(Vector3.down);
    
            if (Physics.Raycast(transform.position, dow,out hit, 2))
            {
                if (hit.collider.gameObject.CompareTag("ground"))
                {
                    if (jump == true) { body.AddForce(Vector3.up * 300); }
                }
                else
                {
                    jump = false;
                }         
            }
        }
    }
    

    4、编写控制脚本——旋转部分

         float mx = Input.GetAxis("Mouse X");
            float my = -Input.GetAxis("Mouse Y");
    
            Quaternion qx = Quaternion.Euler(0, mx, 0);
            Quaternion qy = Quaternion.Euler(my, 0, 0);
    
            transform.rotation = qx * transform.rotation;
            transform.rotation = qy * transform.rotation;

     

    //angle是俯仰角
            float angle = transform.eulerAngles.x;
            //使用欧拉角时,经常出现-1°和359°混乱等情况,下面对这种情况加以处理
            if (angle > 180) { angle -= 360; }
            if (angle < -180) { angle += 360; }
    
            //限制抬头、低头角度
            if (angle > 80)
            {
                transform.eulerAngles = new Vector3(80, transform.eulerAngles.y, 0);
            }
            if (angle < -80)
            {
                transform.eulerAngles = new Vector3(-80, transform.eulerAngles.y, 0);
            }

     

    transform.eulerAngles = new Vector3(-80, transform.eulerAngles.y, 0);

     

    5、隐藏并锁定鼠标指针

        void Start()
        {
            //隐藏鼠标指针
            Cursor.visible = false;
            //锁定鼠标指针到屏幕中央
            Cursor.lockState = CursorLockMode.Locked;
        }

    6、整理和完善

    FPSCharacter脚本的完整代码如下:

    using UnityEngine;
    
    public class FPSCharacter : MonoBehaviour
    {
        public float speed = 5f;
    
        void Start()
        {
            //隐藏鼠标指针
            Cursor.visible = false;
            //锁定鼠标指针到屏幕中央
            Cursor.lockState = CursorLockMode.Locked;
        }
        void Upedate()
        {
            Move();
            MouseLook();
        }
        void Move()
        {
            float x = Input.GetAxis("Horizontal");
            float z = Input.GetAxis("Vertical");
            //反向永远平行地面,主角不能上天
            //获得角色前方向量,将Y轴分量设为0
            Vector3 fwd = transform.forward;
            Vector3 f = new Vector3(fwd.x, 0, fwd.z).normalized;
    
            //角色的右方向向量与右方向移动直接对应,与抬头无关,可直接使用
            Vector3 r = transform.right;
    
            //用f和r做向量的基,组合成移动向量
            Vector3 move = f * z + r * x;
    
            //直接改变玩家位置
            transform.position += move * speed * Time.deltaTime;
        }
    
        void MouseLook()
        {
            float mx = Input.GetAxis("Mouse X");
            float my = -Input.GetAxis("Mouse Y");
    
            Quaternion qx = Quaternion.Euler(0, mx, 0);
            Quaternion qy = Quaternion.Euler(my, 0, 0);
    
            transform.rotation = qx * transform.rotation;
            transform.rotation = qy * transform.rotation;
    
            //angle是俯仰角
            float angle = transform.eulerAngles.x;
            //使用欧拉角时,经常出现-1°和359°混乱等情况,下面对这种情况加以处理
            if (angle > 180) { angle -= 360; }
            if (angle < -180) { angle += 360; }
    
            //限制抬头、低头角度
            if(angle>80)
            {
                transform.eulerAngles = new Vector3(80, transform.eulerAngles.y, 0);
            }
            if (angle < -80)
            {
                transform.eulerAngles = new Vector3(-80, transform.eulerAngles.y, 0);
            }
        }
    }
    

     

    展开全文
  • D数学基础:图形与游戏开发专业培训机构指定教学参考书,多家游戏开发企业共同推荐,游戏业界,探索游戏开发背后的核心秘密。《3D数学基础:图形与游戏开发》主要介绍了基本的3D数学概念,这对电脑游戏开发人员和...
  • 经典图形学数学基础课程《3D数学基础:图形与游戏开发+英文版和源码.7z》。包括英文版,高清带目录的中文版及源码!物超所值!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 162,474
精华内容 64,989
关键字:

游戏开发中的数学

友情链接: gtoadt.rar