8.3D数学-Vector3向量-向量叉乘
8.1 知识点
主要学习内容
计算公式
Cross静态方法 计算两个向量的叉乘
Vector3.Cross静态方法用于计算两个向量的叉乘,并返回叉积的结果向量。
- 参数:两个向量a和b。
- 返回值:叉积的结果向量,垂直于a和b所在的平面。
Vector3 result = Vector3.Cross(A.position, B.position);
print(result);
几何意义
数学中的叉乘方向使用右手法则。
Unity当中使用左手法则,因为Unity使用的是左手坐标系
// 假设向量 A和B 都在 XZ平面上
// 向量A 叉乘 向量 B 会得到垂直于向量A和向量B所在的平面的向量,又称法向量
// y大于0 证明 B在A右侧
// y小于0 证明 B在A左侧
Vector3 C1 = Vector3.Cross(A.position, B.position);
if (C1.y > 0)
{
print("B在A的右侧");
}
else
{
print("B在A的左侧");
}
Vector3 C2 = Vector3.Cross(B.position, A.position);
if (C2.y > 0)
{
print("A在B的右侧");
}
else
{
print("A在B的左侧");
}
总结
8.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson08_3D数学_Vector3向量_向量叉乘 : MonoBehaviour
{
public Transform A;
public Transform B;
void Start()
{
#region 知识点一 叉乘计算
//Cross静态方法 计算两个向量的叉乘
//两个向量的叉积。
print(Vector3.Cross(A.position, B.position));
#endregion
}
void Update()
{
#region 知识点二 叉乘几何意义
//假设向量 A和B 都在 XZ平面上
//向量A 叉乘 向量 B 会得到垂直于向量A和向量B所在的平面的向量 又叫法向量
//y大于0 证明 B在A右侧
//y小于0 证明 B在A左侧
Vector3 C1 = Vector3.Cross(A.position, B.position);
if (C1.y > 0)
{
print("B在A的右侧");
}
else
{
print("B在A的左侧");
}
Vector3 C2 = Vector3.Cross(B.position, A.position);
if (C2.y > 0)
{
print("A在B的右侧");
}
else
{
print("A在B的左侧");
}
#endregion
}
}
8.3 练习题
判断一个物体B位置再另一个物体A的位置的左上,左下 ,右上,右下哪个方位
计算 A位置向量和AB方向差向量的点乘和叉乘结果
dotResult = Vector3.Dot(A.forward, B.position - A.position);
crossResult = Vector3.Cross(A.forward, B.position - A.position);
根据点乘和叉乘的值判断方位
if (dotResult >= 0)
{
// 右侧
if (crossResult.y >= 0)
{
print("右前");
}
// 左侧
else
{
print("左前");
}
}
else
{
// 右侧
if (crossResult.y >= 0)
{
print("右后");
}
// 左侧
else
{
print("左后");
}
}
当一个物体B在物体A左前方20度角或右前方30度范围内,并且离A只有5米距离时,在控制台打印“发现入侵者”
计算叉乘用于判断左边还是右边
crossResult = Vector3.Cross(A.forward, B.position - A.position);
判断距离后再判断左右和角度
// 判断距离
if (Vector3.Distance(A.position, B.position) <= 5)
{
// 判断角度和左右逻辑
if (crossResult.y >= 0 && Vector3.Angle(A.forward, B.position - A.position) <= 30 ||
crossResult.y < 0 && Vector3.Angle(A.forward, B.position - A.position) <= 20)
{
print("发现入侵者");
}
}
8.4 练习题代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson08_练习题 : MonoBehaviour
{
//拖拽得到AB位置变量
public Transform A;
public Transform B;
//点乘接过和叉乘结果变量
private float dotResult;
private Vector3 crossResult;
void Update()
{
#region 练习题一
//判断一个物体B位置再另一个物体A的位置的左上,左下 ,右上,右下哪个方位
//计算 A位置向量和AB方向差向量 点乘和叉乘结果
dotResult = Vector3.Dot(A.forward, B.position - A.position);
crossResult = Vector3.Cross(A.forward, B.position - A.position);
//根据点乘和叉乘的值判断前后左右
if (dotResult >= 0)
{
//右侧
if (crossResult.y >= 0)
{
print("右前");
}
//左侧
else
{
print("左前");
}
}
else
{
//右侧
if (crossResult.y >= 0)
{
print("右后");
}
//左侧
else
{
print("左后");
}
}
#endregion
#region 练习题二
//当一个物体B在物体A左前方20度角或右前方30度范围内,并且离A只有5米距离时,在控制台打印“发现入侵者”
//计算叉乘 用于判断左边还是右边
crossResult = Vector3.Cross(A.forward, B.position - A.position);
//判断距离
if (Vector3.Distance(A.position, B.position) <= 5)
{
//判断角度和左右逻辑
if (crossResult.y >= 0 && Vector3.Angle(A.forward, B.position - A.position) <= 30 ||
crossResult.y < 0 && Vector3.Angle(A.forward, B.position - A.position) <= 20)
{
print("发现入侵者");
}
}
#endregion
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com