碰撞检测 – 光滑的墙壁滑动,没有反弹效果

我正在研究提供点OBB碰撞检测的基本碰撞检测系统。 我在我的环境中有大约200个立方体,我依次检查(现在)每个立方体,看它是否相互碰撞。 如果是这样,我返回碰撞面的正常,保存旧的玩家位置,并做一些三角函数返回一个新的玩家位置为我的墙滑动。

编辑
我将定义我的墙的滑动的意思:如果一个球员在一个垂直的斜坡行走,并且向左或向右轻微的水平旋转并且在墙上向前走,那么球员应该不断向左/右滑动一点走向墙壁,直到他离开墙壁。 因此,沿着墙壁滑动。

一切工作正常,并与多个对象,但我仍然有一个问题,我似乎无法弄清楚: 光滑的墙壁滑动 。 在我目前的实施中,沿着墙壁滑动使得我的球员像一个疯子一样反弹(特别是在引力和向前移动的情况下)。

我有一个速度/方向vector,一个来自相撞飞机的法线vector和一个新老玩家的位置。 首先我否定法向量,并通过从我的方向向量(这是沿墙滑动的向量)减去反向法线来获得我的新速度向量,并将此向量添加到我的新玩家位置,并重新计算方向向量我有多个碰撞)。

我知道我错过了一些步骤,但我似乎无法弄清楚。

这是我的碰撞检测代码(每帧运行):

Vector direction; Vector newPos(camera.GetOriginX(), camera.GetOriginY(), camera.GetOriginZ()); direction = newPos - oldPos; // Direction vector // Check for collision with new position for(int i = 0; i < NUM_OBJECTS; i++) { Vector normal = objects[i].CheckCollision(newPos.x, newPos.y, newPos.z, direction.x, direction.y, direction.z); if(normal != Vector::NullVector()) { // Get inverse normal (direction STRAIGHT INTO wall) Vector invNormal = normal.Negative(); Vector wallDir = direction - invNormal; // We know INTO wall, and DIRECTION to wall. Substract these and you got slide WALL direction newPos = oldPos + wallDir; direction = newPos - oldPos; } } 

任何帮助将不胜感激!


FIX我最终得到了一些东西,并运行它们应该感谢Krazy,我会发布更新后的代码清单,以防其他人遇到这个问题!

 for(int i = 0; i < NUM_OBJECTS; i++) { Vector normal = objects[i].CheckCollision(newPos.x, newPos.y, newPos.z, direction.x, direction.y, direction.z); if(normal != Vector::NullVector()) { Vector invNormal = normal.Negative(); invNormal = invNormal * (direction * normal).Length(); // Change normal to direction's length and normal's axis Vector wallDir = direction - invNormal; newPos = oldPos + wallDir; direction = newPos - oldPos; } } 

我认为在进行减法之前,你需要将invNormal乘以方向的长度。

 Vector invNormal = normal.Negative(); invNormal *= direction.length Vector wallDir = direction - invNormal; 

你想在墙的正常方向上失去所有的速度。 为此,将当前的方向投影到墙上,以获得速度/方向的墙壁部分。

 projected = normal * dot(direction, normal); direction = direction - projected 

最后一行可能必须将符号翻转,取决于法线方向(在墙内或墙外)。