三维向量必知必会
1. 引言
三维向量(3D Vector)是计算机图形学、物理仿真、游戏开发和机器人学中的基础数学工具。它不仅能表示空间中的 位置 和 方向,还能用于计算 光照、碰撞检测、运动轨迹 等关键问题。本文将详细介绍三维向量的 数学定义、基本运算、实际应用,并提供完整的 C语言计算库 及 应用示例。
2. 三维向量的概念与定义
2.1 什么是三维向量?
三维向量是 具有大小和方向的量,在三维空间中表示为:
v=(vx,vy,vz)
\mathbf{v} = (v_x, v_y, v_z)
v=(vx,vy,vz)
其中:
- vx,vy,vzv_x, v_y, v_zvx,vy,vz 分别表示向量在 X、Y、Z轴 上的分量;
- 向量可以表示 位置、速度、加速度、力 等物理量。
2.2 向量的几何意义
- 方向:从原点 (0,0,0)(0, 0, 0)(0,0,0) 指向点(vx,vy,vz)(v_x, v_y, v_z)(vx,vy,vz) 的箭头;
- 长度(模):计算方式为 ∥v∥=vx2+vy2+vz2\|\mathbf{v}\| = \sqrt{v_x^2 + v_y^2 + v_z^2}∥v∥=vx2+vy2+vz2。
3. 三维向量的基本运算
3.1 向量加法
a+b=(ax+bx,ay+by,az+bz)
\mathbf{a} + \mathbf{b} = (a_x + b_x, a_y + b_y, a_z + b_z)
a+b=(ax+bx,ay+by,az+bz)
应用:合成位移、速度叠加。
3.2 向量减法
a−b=(ax−bx,ay−by,az−bz)
\mathbf{a} - \mathbf{b} = (a_x - b_x, a_y - b_y, a_z - b_z)
a−b=(ax−bx,ay−by,az−bz)
应用:计算两点间的方向向量。
3.3 标量乘法(数乘)
k⋅v=(k⋅vx,k⋅vy,k⋅vz)
k \cdot \mathbf{v} = (k \cdot v_x, k \cdot v_y, k \cdot v_z)
k⋅v=(k⋅vx,k⋅vy,k⋅vz)
应用:缩放向量(如调整速度大小)。
3.4 点积(Dot Product)
a⋅b=axbx+ayby+azbz
\mathbf{a} \cdot \mathbf{b} = a_x b_x + a_y b_y + a_z b_z
a⋅b=axbx+ayby+azbz
几何意义:
- 计算 夹角余弦:cosθ=a⋅b∥a∥∥b∥\cos \theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|}cosθ=∥a∥∥b∥a⋅b;
- 应用:光照计算(判断表面明暗)、碰撞检测。
3.5 叉积(Cross Product)
a×b=∣ijkaxayazbxbybz∣=(aybz−azby,azbx−axbz,axby−aybx)
\mathbf{a} \times \mathbf{b} =
\begin{vmatrix}
\mathbf{i} & \mathbf{j} & \mathbf{k} \\
a_x & a_y & a_z \\
b_x & b_y & b_z \\
\end{vmatrix}
= (a_y b_z - a_z b_y, a_z b_x - a_x b_z, a_x b_y - a_y b_x)
a×b=iaxbxjaybykazbz=(aybz−azby,azbx−axbz,axby−aybx)
几何意义:
- 生成 垂直于 (\mathbf{a}) 和 (\mathbf{b}) 的新向量;
- 应用:计算法向量(用于渲染)、扭矩计算。
3.6 向量归一化(Normalization)
v^=v∥v∥
\hat{\mathbf{v}} = \frac{\mathbf{v}}{\|\mathbf{v}\|}
v^=∥v∥v
应用:获取单位方向向量(如摄像机朝向)。
4. 三维向量的实际应用
4.1 计算机图形学
- 光照模型:通过点积计算光线与表面夹角;
- 相机视角:用向量表示视线方向;
- 顶点变换:矩阵乘法实现3D物体旋转/缩放。
4.2 游戏开发
- 角色移动:速度向量控制位移;
- 碰撞检测:叉积计算表面法线;
- 弹道计算:抛物线运动模拟。
4.3 物理仿真
- 牛顿力学:力、加速度、速度均为向量;
- 刚体动力学:扭矩由叉积计算。
4.4 机器人学
- 运动规划:向量表示机械臂末端位置;
- SLAM(同步定位与建图):点云数据处理。
5. C语言实现三维向量计算库
5.1 数据结构定义
#include <stdio.h>
#include <math.h>
typedef struct {
float x, y, z;
} Vector3;
5.2 基本运算实现
// 向量加法
Vector3 vec3_add(Vector3 a, Vector3 b) {
return (Vector3){a.x + b.x, a.y + b.y, a.z + b.z};
}
// 向量减法
Vector3 vec3_sub(Vector3 a, Vector3 b) {
return (Vector3){a.x - b.x, a.y - b.y, a.z - b.z};
}
// 标量乘法
Vector3 vec3_scale(Vector3 v, float k) {
return (Vector3){v.x * k, v.y * k, v.z * k};
}
// 点积
float vec3_dot(Vector3 a, Vector3 b) {
return a.x * b.x + a.y * b.y + a.z * b.z;
}
// 叉积
Vector3 vec3_cross(Vector3 a, Vector3 b) {
return (Vector3){
a.y * b.z - a.z * b.y,
a.z * b.x - a.x * b.z,
a.x * b.y - a.y * b.x
};
}
// 向量模长
float vec3_magnitude(Vector3 v) {
return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
}
// 向量归一化
Vector3 vec3_normalize(Vector3 v) {
float mag = vec3_magnitude(v);
return (Vector3){v.x / mag, v.y / mag, v.z / mag};
}
5.3 应用示例:计算两点距离和方向
int main() {
Vector3 pointA = {1.0f, 2.0f, 3.0f};
Vector3 pointB = {4.0f, 6.0f, 8.0f};
// 计算A到B的向量
Vector3 ab = vec3_sub(pointB, pointA);
printf("方向向量: (%.2f, %.2f, %.2f)\n", ab.x, ab.y, ab.z);
// 计算距离(模长)
float distance = vec3_magnitude(ab);
printf("距离: %.2f\n", distance);
// 归一化方向
Vector3 dir = vec3_normalize(ab);
printf("单位方向: (%.2f, %.2f, %.2f)\n", dir.x, dir.y, dir.z);
return 0;
}
输出:
方向向量: (3.00, 4.00, 5.00)
距离: 7.07
单位方向: (0.42, 0.57, 0.71)
6. 总结
- 三维向量 是描述空间位置和方向的核心工具;
- 基本运算(加法、点积、叉积、归一化)支撑了图形学、物理仿真等领域的计算;
- C语言实现 提供了高效的底层计算能力,适合嵌入式系统或高性能场景。
掌握三维向量运算,是进入 3D图形编程、游戏开发、机器人控制 等领域的关键第一步! 🚀
378

被折叠的 条评论
为什么被折叠?



