unity3d Vector3.Dot Cross Angle 用法记录

本文介绍了在Unity3D中如何使用Vector3.Dot和Vector3.Cross来计算两个向量之间的角度和判断方向。通过实例展示了如何使向量处于同一平面并计算平面上的夹角,以及如何根据叉乘确定目标位于左侧还是右侧。此外,还讨论了点乘在判断相对方向上的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天为一个角度问题找了很多算法用法资料。结果发现网上几乎全来自一个源头。都是一样的。真的是文章一大抄!操!

找到一篇写得比较实用,正确的:

蓝色问题是我补充的用法

1.已知两个向量dirA,dirB。
Vector3 dirA = new Vector3(-1,1,0);

Vector3 dirB = new Vector3(-1,1,1);
2.使向量处于同一个平面,这里平面为XZ

dirA = dirA - Vector3.Project(dirA,Vecotr3.up);
dirB = dirB - Vector3.Project(dirB,Vecotr3.up);
注:Vector3.Project计算向量在指定轴上的投影,向量本身减去此投影向量就为在平面上的向量
3.计算角度
float angle = Vector3.Angle(dirA,dirB);

Vector3 pv =head.forward- Vector3.Pr

<think>Vector3d 是 AutoCAD .NET API 中用于表示三维向量的类,它提供了丰富的向量运算方法。以下是一些常用的计算方法: 1. **点积 (DotProduct)**:计算两个向量的点积(标量积)。 2. **叉积 (CrossProduct)**:计算两个向量的叉积(向量积)。 3. **向量加法 (Add)**:将两个向量相加。 4. **向量减法 (Subtract)**:将一个向量减去另一个向量。 5. **向量长度 (Length)**:获取向量的长度(模)。 6. **单位化 (GetNormal)**:获取向量的单位向量。 7. **角度计算 (GetAngleTo)**:计算两个向量之间的夹角。 8. **判断平行 (IsParallelTo)**:判断两个向量是否平行。 9. **判断垂直 (IsPerpendicularTo)**:判断两个向量是否垂直。 10. **缩放 (Multiply by scalar)**:将向量乘以一个标量(缩放)。 11. **负向量 (Negate)**:获取向量的相反方向向量。 下面我将通过代码示例展示这些常用方法的使用: ```csharp using Autodesk.AutoCAD.Geometry; // 创建两个向量 Vector3d v1 = new Vector3d(1, 0, 0); Vector3d v2 = new Vector3d(0, 1, 0); // 1. 点积 double dotProduct = v1.DotProduct(v2); // 结果为0 // 2. 叉积(返回一个新的向量) Vector3d crossProduct = v1.CrossProduct(v2); // 结果为(0,0,1) // 3. 向量加法 Vector3d addResult = v1 + v2; // 或者 v1.Add(v2) // 4. 向量减法 Vector3d subtractResult = v1 - v2; // 或者 v1.Subtract(v2) // 5. 向量长度 double length = v1.Length; // 结果为1 // 6. 单位化(返回单位向量) Vector3d normalized = v1.GetNormal(); // 7. 计算两个向量之间的夹角(弧度) double angle = v1.GetAngleTo(v2); // 结果为π/2 // 8. 判断平行(使用容差) bool isParallel = v1.IsParallelTo(v2, Tolerance.Global); // 容差对象,这里使用全局容差 // 9. 判断垂直 bool isPerpendicular = v1.IsPerpendicularTo(v2, Tolerance.Global); // 10. 缩放(乘以标量) Vector3d scaled = v1 * 2.0; // 结果为(2,0,0) // 11. 负向量 Vector3d negated = v1.Negate(); // 结果为(-1,0,0) ``` ### 解释: - **点积**:两个向量的点积是一个标量,等于两个向量的长度与它们夹角的余弦的乘积。在几何上,点积可以用于判断两个向量的夹角(锐角、直角或钝角)。 - **叉积**:两个向量的叉积是一个新向量,它垂直于原来的两个向量,并且长度等于两个向量的长度与它们夹角的正弦的乘积。叉积的方向遵循右手定则。 - **向量加法和减法**:用于计算向量的合成与分解。 - **向量长度**:表示从原点到向量所指点的距离。 - **单位化**:将向量长度变为1,方向不变,常用于方向向量的处理。 - **角度计算**:返回两个向量之间的夹角(弧度)。 - **判断平行和垂直**:在CAD中经常需要判断几何关系,这些方法非常有用。 - **缩放**:改变向量的长度而不改变方向。 - **负向量**:得到与原向量方向相反、长度相同的向量。 ### 注意事项: - 使用叉积时,两个向量必须是非零向量且不平行,否则结果向量为零向量。 - 单位化时,如果原向量是零向量,则调用`GetNormal()`会抛出异常,因此需要先检查长度。 - 判断平行或垂直时,需要指定一个容差(Tolerance),因为浮点数计算存在精度问题。 §§相关问题§§: 1. 如何在AutoCAD .NET API中计算点到直线的距离? 2. 如何判断一个点是否在一条线段上(考虑端点)? 3. 在AutoCAD中如何创建自定义的向量运算(如向量投影)? 4. AutoCAD .NET API中还有哪些常用的几何类(如Point3d, Line3d等)?</think>### Vector3d 在 AutoCAD .NET API 中的常用计算方法 在 AutoCAD .NET API 中,`Vector3d` 类提供了丰富的向量运算方法,用于处理三维空间中的几何计算。以下是主要的计算方法及其代码示例: #### 1. **基本向量运算** ```csharp // 创建两个向量 Vector3d v1 = new Vector3d(1, 2, 3); Vector3d v2 = new Vector3d(4, 5, 6); // 向量加法 Vector3d sum = v1 + v2; // (5, 7, 9) // 向量减法 Vector3d diff = v1 - v2; // (-3, -3, -3) // 标量乘法 Vector3d scaled = v1 * 2.5; // (2.5, 5, 7.5) // 点积(标量积) double dotProduct = v1.DotProduct(v2); // 1*4 + 2*5 + 3*6 = 32 // 叉积(向量积) Vector3d crossProduct = v1.CrossProduct(v2); // (-3, 6, -3) ``` #### 2. **向量属性计算** ```csharp // 向量长度 double length = v1.Length; // √(1²+2²+3²) ≈ 3.74 // 向量长度平方(高效计算) double lengthSquared = v1.DotProduct(v1); // 1+4+9=14 // 单位化向量 Vector3d unitVector = v1.GetNormal(); // 长度=1的方向向量 // 判断是否为零向量 bool isZero = v1.IsZeroLength(); // 检查 (0,0,0) ``` #### 3. **几何关系判断** ```csharp // 判断平行(带容差) bool isParallel = v1.IsParallelTo(v2, Tolerance.Global); // 判断垂直 bool isPerpendicular = v1.IsPerpendicularTo(v2, Tolerance.Global); // 计算向量夹角(弧度) double angle = v1.GetAngleTo(v2); // 返回两向量夹角 ``` #### 4. **坐标转换** ```csharp // 转换为点坐标 Point3d point = new Point3d(0, 0, 0); Point3d translatedPoint = point + v1; // (1,2,3) // 转换为矩阵变换 Matrix3d transform = Matrix3d.Displacement(v1); ``` #### 5. **特殊运算** ```csharp // 投影到平面 Plane plane = new Plane(Point3d.Origin, Vector3d.ZAxis); Vector3d projected = v1.ProjectTo(plane.Normal); // 去除Z分量 // 反射向量 Vector3d reflected = v1.Mirror(Vector3d.XAxis); // 沿X轴反射 // 旋转向量(使用四元数) Quaternion rotation = Quaternion.Rotation( Math.PI / 2, Vector3d.ZAxis); // 90度绕Z轴 Vector3d rotated = v1.TransformBy(rotation); ``` ### 关键方法说明: 1. **`DotProduct()`** 计算点积,用于: - 投影长度计算 - 夹角余弦值 - 判断垂直关系(点积≈0) 2. **`CrossProduct()`** 计算叉积,用于: - 平面法向量计算 - 面积计算 - 判断平行关系(叉积≈零向量) 3. **`GetNormal()`** 单位化向量,注意事项: - 零向量会抛出异常 - 应先检查 `IsZeroLength()` - 计算方向时必备 4. **`TransformBy()`** 空间变换核心方法,支持: - 矩阵变换 - 四元数旋转 - 坐标系统转换 ### 实际应用场景 ```csharp // 计算点到直线的距离 double DistanceToLine(Point3d point, Point3d lineStart, Point3d lineEnd) { Vector3d lineVec = lineEnd - lineStart; Vector3d pointVec = point - lineStart; Vector3d cross = lineVec.CrossProduct(pointVec); return cross.Length / lineVec.Length; } // 检查点是否在直线上 bool IsPointOnLine(Point3d point, Point3d lineStart, Point3d lineEnd) { Vector3d lineVec = lineEnd - lineStart; Vector3d pointVec = point - lineStart; // 检查共线性 if (!lineVec.CrossProduct(pointVec).IsZeroLength(Tolerance.Global)) return false; // 检查范围 double dot = lineVec.DotProduct(pointVec); return dot >= 0 && dot <= lineVec.DotProduct(lineVec); } ``` ### 性能优化技巧 1. **优先使用 `DotProduct()` 替代 `Length`** 比较长度时使用平方值避免开方: ```csharp // 低效 if (v1.Length > 10) {...} // 高效 if (v1.DotProduct(v1) > 100) {...} ``` 2. **批量处理使用矩阵变换** 对多个点使用同一个变换矩阵: ```csharp Matrix3d trans = Matrix3d.Displacement(new Vector3d(10, 0, 0)); foreach (Point3d pt in points) { Point3d newPt = pt.TransformBy(trans); } ``` 3. **方向比较使用单位向量** 避免浮点精度问题: ```csharp bool IsSameDirection(Vector3d v1, Vector3d v2) { return v1.GetNormal().IsEqualTo(v2.GetNormal(), Tolerance.Global); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值