三维向量必知必会

三维向量必知必会

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) ab=(axbx,ayby,azbz)
应用:计算两点间的方向向量。

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) kv=(kvx,kvy,kvz)
应用:缩放向量(如调整速度大小)。

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 ab=axbx+ayby+azbz
几何意义

  • 计算 夹角余弦cos⁡θ=a⋅b∥a∥∥b∥\cos \theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|}cosθ=a∥∥bab
  • 应用:光照计算(判断表面明暗)、碰撞检测。

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=(aybzazby,azbxaxbz,axbyaybx)
几何意义

  • 生成 垂直于 (\mathbf{a}) 和 (\mathbf{b}) 的新向量
  • 应用:计算法向量(用于渲染)、扭矩计算。

3.6 向量归一化(Normalization)

v^=v∥v∥ \hat{\mathbf{v}} = \frac{\mathbf{v}}{\|\mathbf{v}\|} v^=vv
应用:获取单位方向向量(如摄像机朝向)。


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图形编程、游戏开发、机器人控制 等领域的关键第一步! 🚀


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ScilogyHunter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值