我对碰撞角度有一些疑问。我正在尝试为游戏编写物理代码,我不想使用任何第三方库,实际上我想自己编写每一件事。我知道如何检测两个球体之间的碰撞,但我无法弄清楚,如何找到两个球体之间的碰撞/排斥角度。我试过逆转物体的方向,但没有运气。如果你把我链接到一个教学物理编程的有趣的.pdf文件,那将是非常好的。
答案 0 :(得分:0)
有很多方法可以解决碰撞问题
<强>冲击强>
为了模拟一个冲动,你可以直接根据每个物体的速度,使用反射定律,你可以使用“正常的影响”“反映”每个速度
所以:v1 = v1 - 2 x(v1.n2)x n2
和v2 = v2 - 2 x(v2.n1)x n1
球体s1和s2的v1和v2速度
n1和n2在碰撞点处正常
<强>罚金强>
在这里,我们有两个物体相互穿透,我们模拟它们不再穿透的事实,所以你使用弹簧力创造一个与穿透力成正比的力
我没有谈论所有的方式,但这是我知道的两个最简单的方法
答案 1 :(得分:0)
可以找到2D或3D坐标空间中两个对象之间的角度 A * B = | A || B |cosɵ A和B都是矢量,ɵ是两个矢量之间的角度。 以下类可用于解决游戏中的基本矢量计算
class 3Dvector
{
private:
float x, y, z;
public:
// purpose: Our constructor
// input: ex- our vector's i component
// why- our vector's j component
// zee- our vector's k component
// output: no explicit output
3Dvector(float ex = 0, float why = 0, float zee = 0)
{
x = ex; y = why; z = zee;
}
// purpose: Our destructor
// input: none
// output: none
~3Dvector() { }
// purpose: calculate the magnitude of our invoking vector
// input: no explicit input
// output: the magnitude of our invoking object
float getMagnitude()
{
return sqrtf(x * x + y * y + z * z);
}
// purpose: multiply our vector by a scalar value
// input: num - the scalar value being multiplied
// output: our newly created vector
3Dvector operator*(float num) const
{
return 3Dvector(x * num, y * num, z * num);
}
// purpose: multiply our vector by a scalar value
// input: num - the scalar value being multiplied
// vec - the vector we are multiplying to
// output: our newly created vector
friend 3Dvector operator*(float num, const 3Dvector &vec)
{
return 3Dvector(vec.x * num, vec.y * num, vec.z * num);
}
// purpose: Adding two vectors
// input: vec - the vector being added to our invoking object
// output: our newly created sum of the two vectors
3Dvector operator+(const 3Dvector &vec) const
{
return 3Dvector(x + vec.x, y + vec.y, z + vec.z);
}
// purpose: Subtracting two vectors
// input: vec - the vector being subtracted from our invoking object
// output: our newly created difference of the two vectors
3Dvector operator-(const 3Dvector &vec) const
{
return 3Dvector(x - vec.x, y - vec.y, z - vec.z);
}
// purpose: Normalize our invoking vector *this changes our vector*
// input: no explicit input
// output: none
void normalize3Dvector(void)
{
float mag = sqrtf(x * x + y * y + z * z);
x /= mag; y /= mag; z /= mag
}
// purpose: Dot Product two vectors
// input: vec - the vector being dotted with our invoking object
// output: the dot product of the two vectors
float dot3Dvector(const 3Dvector &vec) const
{
return x * vec.x + y * vec.y + z * vec.z;
}
// purpose: Cross product two vectors
// input: vec- the vector being crossed with our invoking object
// output: our newly created resultant vector
3Dvector cross3Dvector(const 3Dvector &vec) const
{
return 3Dvector( y * vec.z – z * vec.y,
z * vec.x – x * vec.z,
x * vec.y – y * vec.x);
}
};
答案 2 :(得分:0)
我不应该回答我自己的问题,但我想我找到了我需要的东西。它也可以帮助其他人。我只是在指点维基百科的物理部分,我得到了这个。
答案 3 :(得分:0)
笛卡尔系统中的角度可以通过以下方式找到:
反正切((雅镱)/(XA-XB))
因为这是一个纠结的三角形,你知道这些角度(高度和宽度的差异)。这将对切线进行计算。因此,arctan将计算具有此切线的角度。
我希望我能提供帮助。