Vector 规范化向量如何与游戏编程配合

Vector 规范化向量如何与游戏编程配合,vector,unity3d,normalize,Vector,Unity3d,Normalize,不幸的是,我上了一所不关心学生上大学准备的高中,但我正在学习一些游戏编程,以及我所学的所有编程,但我正在学习游戏AI课程,我们正在学习FSM和AI运动,我遇到了“正常化”,研究它,这有点道理,但是我如何在游戏编程中使用它呢?也许我只是不太理解这个概念(从未真正上过代数课,虽然我每天都在其他编程中使用高级数学,但我边学边学),但我不明白为什么我需要这么做 矢量表示长度和方向。有时使用“单位向量”(长度为1)进行乘法很方便,因为很容易控制结果的长度 把一磅的重量乘以五,你得到了什么?五磅重 把单位向

不幸的是,我上了一所不关心学生上大学准备的高中,但我正在学习一些游戏编程,以及我所学的所有编程,但我正在学习游戏AI课程,我们正在学习FSM和AI运动,我遇到了“正常化”,研究它,这有点道理,但是我如何在游戏编程中使用它呢?也许我只是不太理解这个概念(从未真正上过代数课,虽然我每天都在其他编程中使用高级数学,但我边学边学),但我不明白为什么我需要这么做

矢量表示长度和方向。有时使用“单位向量”(长度为1)进行乘法很方便,因为很容易控制结果的长度

把一磅的重量乘以五,你得到了什么?五磅重

把单位向量乘以5,你得到了什么?指向该方向五个单位的向量

作为一个实际的例子,让我们假设我正在为一个简单的游戏编写一个摄像系统:两辆车在一条直线上相互比赛。摄像机应该在观察对手方向的同时,围绕玩家的汽车旋转

既然你给这个问题加了标签,我将提供用Unity3D编译的C#代码。不过,基本概念对于任何用途都是相同的

假设我们得到两点:

Vector3 playerPos, enemyPos;
我们可能会发现一些有用的操作:

//find separation between two points
Vector3 playerToEnemy = enemyPos - playerPos;

//find distance between them
float distance = playerToEnemy.magnitude;

//find direction of separation
Vector3 enemyDirection = playerToEnemy.normalized;
最后,我们定位摄像机:

Vector3 camPos = playerPos;    //start at player's position
camPos -= enemyDirection * 10f; //move ten units away from enemy
camPos += Vector3.up * 5f;      //move five units up

Transform tr = Camera.main.transform;    
tr.position = camPos;
tr.LookAt(enemyPos);
您可能会注意到,我使用了Unity3D的一个内置单位向量(包括
Vector3.up
Vector3.right
Vector3.forward
)。Unity中的每个变换对象也具有局部空间等价物


另一个用途:使用矢量点积,您可以检查两个规格化矢量是否指向相似的方向,因为点积的输出范围为-1(相反方向)到0(垂直方向)到1(平行方向)。

矢量表示长度和方向。有时使用“单位向量”(长度为1)进行乘法很方便,因为很容易控制结果的长度

把一磅的重量乘以五,你得到了什么?五磅重

把单位向量乘以5,你得到了什么?指向该方向五个单位的向量

作为一个实际的例子,让我们假设我正在为一个简单的游戏编写一个摄像系统:两辆车在一条直线上相互比赛。摄像机应该在观察对手方向的同时,围绕玩家的汽车旋转

既然你给这个问题加了标签,我将提供用Unity3D编译的C#代码。不过,基本概念对于任何用途都是相同的

假设我们得到两点:

Vector3 playerPos, enemyPos;
我们可能会发现一些有用的操作:

//find separation between two points
Vector3 playerToEnemy = enemyPos - playerPos;

//find distance between them
float distance = playerToEnemy.magnitude;

//find direction of separation
Vector3 enemyDirection = playerToEnemy.normalized;
最后,我们定位摄像机:

Vector3 camPos = playerPos;    //start at player's position
camPos -= enemyDirection * 10f; //move ten units away from enemy
camPos += Vector3.up * 5f;      //move five units up

Transform tr = Camera.main.transform;    
tr.position = camPos;
tr.LookAt(enemyPos);
您可能会注意到,我使用了Unity3D的一个内置单位向量(包括
Vector3.up
Vector3.right
Vector3.forward
)。Unity中的每个变换对象也具有局部空间等价物


另一个用途:使用矢量点积,您可以检查两个标准化矢量是否指向相似的方向,因为点积的输出范围为-1(相反方向)到0(垂直方向)到1(平行方向)。

我希望数学能像编程一样简单,但谢谢你,这个例子绝对更有意义。我希望数学能像编程一样简单,但谢谢你,这个例子绝对更有意义。