点乘和叉乘在游戏中的应用

点乘

点乘,又称“点积”或“内积”。

公式:各分量乘积和

[x1,y1,z1] • [x2,y2,z2] = x1x2 + y1y2 + z1z2

几何意义:a•b = |a||b|cos<a,b>

两个向量的单位向量相乘后,再乘以两者夹角的余弦值。运算结果是标量

API:float dot = Vector3.Dot(a, b);

当向量a和向量b归一化后

当向量a和向量b归一化后,|a||b|值为1,点乘a•b = cos<a,b>

运算结果就是当x取值范围为[-π,π]的余弦函数图像。

 点乘的值:同向为1(夹角为0),反向为-1(夹角为180),垂直为0(夹角为90)。点乘只能求出0到180度的角度。

点乘用法

float dotResult = Vector3.Dot(t1.position.normalized, t2.position.normalized);    // 如果没有归一化,还需要除以两个向量的模长,再求角度
angle = Mathf.Acos(dotResult) * Mathf.Rad2Deg;

1、得到2个向量的夹角:范围[0, 180]  ,可以做游戏怪物的视角是否有查看到玩家,可以用来计算敌人是否在角色的攻击范围之内,如前方左右60度内。夹角不区分左右

2、判断目标在自己的前后方位。点乘的结果大于0为前方,小于0为后方。看余弦函数可以知道,已知y,求x,是无法区分x的正负的。

叉乘

又称“叉积”或“外积”。

公式:[x1,y1,z1] x [x2,y2,z2] = [y1*z2 - z1*y2, z1*x2 - x1*z2,  x1*y2 - y1*x2]

几何意义:结果为两个向量所组成的面的垂直向量,模长为两向量模长乘积再乘夹角的正弦值。

API:Vector v = Vector3.Cross(a,b);

与点积不同,它的运算结果是一个向量而不是一个标量。

 可以用左手法则确定叉乘结果的方向。

叉乘用法:

Vector3 crossValue = Vector3.Cross(t1.position.normalized, t2.position.normalized);
float crossAngle = Mathf.Asin(crossValue.magnitude) * Mathf.Rad2Deg;

可用于创建垂直于平面的向量。判断两条向量相对位置。夹角不区分前后,但分左右。左乘和右乘会影响结果的正负。

1、得到2个向量的夹角:范围[0,90]。

2、判断目标在自己的左右方位。叉乘的结果向量crossValue.y大于0,则为右方。小于0为左方。(手法则)

3、求物体表面法线用于求物体光照相关问题

4、将炮管的正方向向量  与  敌人位置减去炮管位置的向量 进行叉积,得到一个向量,炮管绕此向量旋转,可以使炮管旋转至对准敌人,实现指向敌人的作用。

点乘和叉乘组合求0到360度角

float dot = Vector3.Dot(t1.position.normalized, t2.position.normalized);
angle = Mathf.Acos(dot) * Mathf.Rad2Deg;

Vector3 cross = Vector3.Cross(t1.position, t2.position);
if (cross.y < 0)
{
    angle = 360 - angle;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值