计算机图形学中向量点乘和叉乘的用途_图形学笔记(一):基础知识

5da1277d1363aea39d11dd9b8db1ce5b.png

从这便文章开始整理学习到的计算机图像学相关知识,原则是只写我没在网上找到清楚解释的内容,如果有很好的文章介绍相关内容,我会直接把链接贴上。

首先弄清 Computer Graphics和 Computer Vision的关系和区别

大致上讲,CG是图像和视频合成的工具和机制,而CV通常用于分析和提取视频和图像的语义内容,这两个领域的技术没有明显的界限,但是目的稍有不同。

d970dd006071d501454d14747cb563f8.png

线性代数基础

  • 向量积 Vector Cross product
    关于Cross product维基百科解释的非常详细。
    需要特别注意的是两个向量
    uv在三维空间的叉乘的几何意义
  • 数量积 Vector Dot Product
    关于Dot Product 的相关知识。

线性代数变换

  • 仿射组合 The affine combination
    首先先了解一下什么是仿射变换.
    如何通俗地讲解「仿射变换」这个概念? - 马同学的回答 - 知乎
    而仿射函数实际上就是表示这一变换过程的函数,一般形式是
    ,
    是一个
    矩阵,
    是一个
    向量,
    是一个
    向量。

    仿射组合的概念更加抽象,可以通过下面这个例子了解一下两个二维向量的仿射组合:
    仿射组合为什么代表一条线? - 电猫哥electricat的回答 - 知乎
    这个例子证明了两个二维向量的仿射组合可以代表一条直线,可以发现仿射组合其实是对于给定向量
    与一组权重
    的线性变换,而且必须满足
    ,即
    。推广到
    个向量定义如下:

    (未完,这部分以后会补张图...)
  • 重心坐标 Barycentric Coordinates
    上面介绍的内容其实隐含了一个前提:坐标系类型已确定。在数学中,坐标系的类型很多,例如齐次坐标系(homogeneous coordinates or projective coordinates),和笛卡尔坐标系(Cartesian coordinate system),在不同的坐标系下,对事物的描述方法和变换自然是不同的。各个坐标的关系可以参考下面的文章:
    从带号面积到坐标系的建立 - PeaucellieRay的文章 - 知乎
    这里主要介绍一下重心坐标系,找到一片讲的比较清楚的文章。
    重心坐标(Barycentric coordinates) - 杨超的文章 - 知乎
    通过上文其实我们可以发觉重心坐标的表示方法就是点
    的仿射组合,而
    就是组合权重。 值得注意的是,上文的三角形其实是放在一个仿射空间(affine space)里的。维基百科这样描述仿射空间:

    仿射空间是没有起点只有方向大小的向量所构成的向量空间。
    我的理解是仿射空间就是没有原点的线性空间,这里就不展开讨论了。
    回到重心坐标的话题上来,通过结合仿射组合,有下面的定义:

151312eb7675530164b3331be4e7b22a.png


通过多个点确定一个坐标确实感觉很费劲,但是如上个链接里的文章所说,这个坐标系大有可为,在计算机图形学中需要使用一个非常重要的技术——线性插值,就用到重心坐标,这个以后的文章一改也会提到。

  • 凸包 Convex Hulls
    凸包的几何意义是给定空间一堆离散的点,计算能够包含这些点的一个凸多边形,如下图可以用凸包讲general mesh的点精简成convex mesh,在碰撞检测中省去了大量内存。

09dd8f1c0d3ba725bf5b162bf97dd8fb.png


凸包的表示方法如下,可以发现可以利用仿射组合保证凸性(Convexity),原因暂不讨论。

  • 仿射映射 Affine mappings
计算机图形学点乘(Dot Product)和叉乘(Cross Product)是非常基本但也非常重要的数学运算,在构建、渲染三维场景以及处理空间向量时有着广泛的应用。 ### 点乘 (Dot Product) #### 定义及性质: 点乘是两个向量通过其对应分量相乘再求和得到的结果。如果向量A = (a_x, a_y, a_z) 和向量B = (b_x, b_y, b_z),则它们的点乘 A·B 可以表示为 a_x * b_x + a_y * b_y + a_z * b_z。 **性质包括**: - 结合律:(A·B)·C = A·(B·C) - 分配律:A·(B+C) = A·B + A·C #### 应用: - **计算角度**: 点乘的结果可以用于计算两个向量之间的夹角。具体公式是 cos(θ) = (A·B) / (|A||B|),其 θ 是向量A和向量B之间的夹角。 - **投影操作**: 使用点乘可以找到一个向量在另一个向量方向上的投影长度。 - **光线与平面或物体表面法线的角度判断**:在光照效果计算,通常需要计算光线与法线之间的角度,以决定阴影、反射等效果。 ### 叉乘 (Cross Product) #### 定义及性质: 叉乘是两个向量通过特定规则产生的第三个向量,该向量垂直于原来的两个向量,并且其方向由右手定则确定。设向量A = (a_x, a_y, a_z) 和向量B = (b_x, b_y, b_z),它们的叉乘结果为: \[ C = A \times B = (c_x, c_y, c_z) \] \[ c_x = a_yb_z - a_zb_y \] \[ c_y = a_zb_x - a_xb_z \] \[ c_z = a_xb_y - a_yb_x \] **性质包括**: - 结果是一个向量 - 不满足结合律和分配律 #### 应用: - **计算面积**: 两个向量叉乘结果的模长等于这两个向量构成的平行四边形的面积。 - **获取法向量**: 在三维建模叉乘常用于从两个边缘矢量计算一个多面体的表面法向量。 - **计算旋转方向**: 物体绕一定轴线旋转时,叉乘帮助确定新的位置相对于原始位置的方向变化。 - **检测碰撞**: 在物理引擎叉乘可用于检测是否发生侧面接触或确定碰撞面的法向量。 ### 相关问题: 1. **如何在计算机图形学应用点乘叉乘来计算两个平面的相对位置关系?** 2. **在光线追踪算法,如何利用点乘叉乘进行精确的光照计算和阴影判定?** 3. **解释一下在游戏开发如何使用叉乘生成物体的旋转轴并控制旋转动作?** 这种对点乘叉乘的理解对于深入学习计算机图形学以及实际应用至关重要,它们不仅用于基础几何操作,还在高级动画、物理模拟和渲染技术发挥着关键作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值