vector normalize

2015-08-28 刘太华 更多博文 » 博客 » GitHub »

computer graphics vector normalize vector point

原文链接 https://liutaihua.github.io/2015/08/28/vector-normalize.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


向量的归一化

从起始点A到目标点B的路径上的碰撞检测

常见的一个应用场景:游戏技能里有玩家冲一个地方闪现到另外一个指定点,中间不能有阻挡物, 否则就停在阻挡物那里。

在几何空间中, A每次移动一个单位长度dir,逐步靠近B,就是A每次增加一个unit vector
归一化:即将一个向量, 使它的模(length)等于1,并且方向不变, normalize后的向量dir, 就是一个单位向量了
用做在空间中,向量往前增加一个单位长度, 即 += dir

A, B是两个向量点,实现步骤是:

1, 计算A到B的距离, 就是向量运算中 C = A - B, distance = C.length() 也就是C的模。 2, 计算新产生的向量C的单位向量,也就是向量归一化,得到单位向量dir = normalized(C) {{% highlight c++ %}} def nromalized(vec): length = vec.length() vec.x = vec.x / length vec.y = vec.y / length return vec {{% endhighlight %}} 3, 取A点往前增加2个半径长度的点pos, 作为初始点: {{% highlight c++ %}} pos = A + dir*(A.radius() + B.radius()) {{% endhighlight %}}

4, 以A到B的距离的一半作为最大循环次数: {{% highlight c++ %}} loop_count = (A-B).length() {{% endhighlight %}} 5, 以pos点作为圆心,A的半径作为圆半径的圆内, 检测圆内是否有碰撞,如果有碰撞则跳出循环, 每个循环后给pos增加一个单位向量(也就是normalized后得到的dir): {{% highlight c++ %}} while loop_count >= 0: if CollisionWorld.TestCircle(pos, A.radius()): break pos += dir {{% endhighlight %}} 6, 假如中间有碰撞, 则pos为最终发生了碰撞的某个点.

得恶补一下线性代数了,参照文档 zhihu vector normalizing