在3d开发中,计算一些点的坐标是非常常见的,其中用到最多的就是向量计算,向量的加减和点乘叉乘,在计算点位置方面非常有用,由于我是新手,特此写下这篇关于自由向量和固定向量的博文
在向量中,当向量的大小和方向是一样时,我们可以说,两个向量相等,也就是只要两个向量这两个值相等,就认为一样,但是在相等向量之后,还分为自由向量和固定向量,自由向量是说可以在坐标系里面随便移动,而固定向量则固定了位置,下面实例说明两者的差别。
如图,在xoy坐标系中已知道有三个点坐标: A, B, C,我想求C点到AB向量的投影点c‘,我认为直接使用AB点乘oC就可以求出C点在AB上的投影Ac’,但是计算出来的是oc",并非Ac‘点。
为什么呢?不是说大小和方向一样,两个向量就相等嘛,那我用oC 点乘 oB’(oB’ == AB),不就是C点到AB的投影嘛?
这就说到自由向量了,其实在计算Ac‘时,AB不能作为自由向量使用,正确的求解方法是:
- 用AC点乘AB求得Ac'
- 再用oA加Ac'得到oc‘
发现在oA加Ac'时,Ac'又可以当自由向量了。
为什么我们不能把,AB当作自由向量用呢?因为我们要求的是沿A点到c‘点的距离标量,然后再乘以AB的单位向量, 即计算从A点开始沿AB方向的向量,这个就规定了必须是从A点开始,如果将AB等价成oB’,那就是沿o点开始的AB方向的向量了。
**常见自由向量和固定向量
- **法线(normal)**通常是自由向量,因为它只关心方向。
- 切线(tangent)或速度向量也是自由的。
- **射线(Ray)**则同时有 origin(绑定点)和 direction(自由向量)。你可以交换 direction,却绝不能交换 origin。
何时要区分?
- 当向量用于描述“点”或“起点”时 → 它是绑定向量,位置不同就不等同。
- 当向量用于描述“位移”或“方向”时 → 它是自由向量,大小与方向相同即可替换。
在 Three.js 里的实践
- 用 Vector3 表示几何顶点/点的位置 → 这时它不是“移动到哪里”的自由向量,不能随意平移或交换。
- 用 direction、normal、velocity、offset 等变量 → 它们通常是“自由向量”,可以在场景任意位置应用。
总结:只要你的向量不仅仅承载大小和方向,还承载“从哪儿到哪儿”这个信息(比如点的位置、力的作用点、射线起点) ,它就不再是完全可替换的自由向量,而是一个“绑定向量”。这时候,即便大小和方向相同,也不能把一个向量随意替换成另一个。
以下为chatgpt解释: