声场 | 3D数学总结1

坐标系

(注:基础知识快速过)

  • 笛卡尔坐标系
  • 左手坐标系:拇指x,食指y,无名指z
  • 右手坐标系:拇指x,食指y,无名指z
    左手坐标系 & 右手坐标系
  • 世界坐标系:地球上的“绝对坐标系”
  • 物体坐标系:物体自己的坐标系
  • 摄像机坐标系:摄像机自己的物体坐标系
  • 惯性坐标系:惯性坐标系的原点与物体坐标系的原点重合,但是惯性坐标系的各个轴平行于世界坐标系的轴
  • 嵌套坐标系:父子关系
    坐标变换:

向量的基础知识:

(注:基础知识快速过)

  • 向量的维度
  • 向量的形式
  • 与空间中点的关系
  • 零向量
  • 模长
  • 标量乘法、加法、减法、
  • 距离公式

重要的计算

  • 标准化向量
    1.v_{norm} = \cfrac{v}{||v||}
    2.模长为1

  • 点乘

  1. 对应相乘再相加:a \cdot b = \sum_{i=1}^n a_i b_i
  2. 描述了两个向量的相似程度
  3. 点乘等于向量大小与向量夹角cos数的积:a \cdot b =||a||*||b||cos\theta
  4. 对公式a \cdot b =||a||*||b||cos\theta稍作变形,便可求夹角。
    其公式为:\theta = arccos(\frac{a \cdot b}{||a||*||b||})
    如果向量a,b均为单位向量,则有:\theta = arccos(a \cdot b)
  5. 点乘等于0说明两向量垂直
  • 投影
    推导过程:
    由图易知V_{||}平行于n.所以,V_{||} = n\frac{||V_{||}||}{||n||} \tag*{1}
    在此三角形中,易知cos\theta = \frac{||V_{||}||}{||V||}.
    所以,||V_{||}|| = cos\theta ||V|| \tag*{2}.
    由公式1,2,可得:
    V_{||} = n\frac{||V_{||}||}{||n||}
    = n\frac{ ||V|| cos\theta}{||n||}
    = n\frac{cos\theta ||V||*||n||}{||n||^2}
    = n\frac{V \cdot n}{||n||^2}

注意:
V = V_{||} + V_{\perp}
V_{\perp} = V - V_{||}

  • 叉乘
  1. 怎么算?matlab一行代码搞定:
cross(a,b)
  1. 叉乘得到的向量垂直于原来的两个向量
  2. 叉乘的长度等于向量的大小与向量夹角sin值的积
    a \times b = ||a|| *||b||*sin\theta
  3. 在2D平面中,叉乘的模||a \times b||等于以a,b为两边的平行四边形的面积。
  4. 若叉乘为0,则两向量平行。

3D中一个向量绕任意轴旋转

  • 假设
  1. 假设旋转轴通过原点,不考虑平移。(这一条假设很重要,之前在这里卡了很久。可以感性的理解为一个基向量绕着一个单位向量旋转)
  2. 向量n是单位向量
  • 推导过程
    一个从原点开始的向量V,绕一个任意的向量n旋转。
    绕任意轴旋转的向量

将向量V投影到n轴上,有:
V = V_{||} + V_{\perp}
由于V_{||}Vn上的投影,易知:
V_{||}= n\frac{V \cdot n}{||n||^2} = n ( V \cdot n) \tag{1}
(看上面投影那里,注意n是单位向量)
很明显可得:
V_{\perp} = V - V_{||} \tag{2}
毕竟V = V_{\perp} + V_{||}
对于垂直于V_{\perp}、V_{||}的向量W,可由叉乘求得:
W = n \times V_{\perp}
= n \times (V - V_{||})
= n \times V - n \times V_{||}
= n \times V - 0
W = n \times V \tag{3}

V_{\perp}按逆时针旋转一定角度,得到V_{\perp}^\prime
可得V_{\perp}^\prime = V_{\perp}cos\theta + Wsin\theta \tag{4}

联立(1)(2)(3)(4):(这里写的很详细了,注意对照着上面的四条公式看)
V_{\perp}^\prime = V_{\perp}cos\theta + Wsin\theta = (V - n ( V \cdot n))cos\theta + (n \times V)sin\theta
由于V^\prime = V_{\perp} ^\prime+ V_{||}
可得V^\prime = (V - n ( V \cdot n))cos\theta + (n \times V)sin\theta+ n ( V \cdot n)
得到了V^\prime关于V、n、\theta的关系公式之后,令三维空间的其中一个基向量P = [1,0,0]取代V,也就是P = V
有:P^\prime = (P - (P \cdot n)n)cos\theta + (n \times P)sin\theta + (P \cdot n)n

使用matlab实现其算法如下:

clc;
clear;
roundAxis = [1,5,3];%绕轴
n = roundAxis./norm(roundAxis);%转为单位向量

v = [1,1,1];
p = [1 0 0];
q = [0 1 0];
r = [0 0 1];
roundAxis = [0 0 0;roundAxis];
plot3(roundAxis(:,1),roundAxis(:,2),roundAxis(:,3),"--");%绘制绕轴
hold on
plot3(v(:,1),v(:,2),v(:,3),"ro");%起始点


for angle = 0:10:360
    %推导出来的旋转矩阵
    F = @(p)( (p - (sum(p.*n)*n))*cosd(angle) + cross(n,p)*sind(angle) + sum(p.*n)*n  );
    pHat = F(p);%相当于分别对基向量进行变换
    qHat = F(q);
    rHat = F(r);
    R = [pHat;qHat;rHat];
    posTemp = v*R;
    plot3(posTemp(1),posTemp(2),posTemp(3),"g.");
    hold on
end

其结果如下:


运行结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 3D数学基础 简要归纳 计算机图形学第一准则:看上去是对的就是对的,简单记为近似原则 OpenGL是基于3D的,屏...
    Style_月月阅读 3,813评论 0 2
  • 2D笛卡尔坐标系原则 1、每个2D迪卡尔坐标系都有一个特殊的点,称作原点(0,0); 2、笛卡尔坐标轴是无限延伸的...
    AlanGe阅读 4,369评论 0 0
  • 1.0 坐标与坐标系 1.1 坐标及坐标系的概念 在3D世界中,为了确定不同顶点所在的位置,需要使用坐标表示,二坐...
    莫忘初心_倒霉熊阅读 5,408评论 0 2
  • 3D数学和图像图形的关系 对于学习OpenGL 有一个误区,就是大家认为如果不能精通那些3D图形数学知识,会让我们...
    MonKey_Money阅读 3,895评论 0 1
  • 向量的定义: 既有大小又有方向的量称之为向量,与之相对应的是标量,标量是只有大小没有方向的量。 一个向量的一般在头...
    侠者大屁屁阅读 10,318评论 0 1

友情链接更多精彩内容