碰撞角度检测

时间:2015-03-04 09:45:39

标签: physics game-physics

我对碰撞角度有一些疑问。我正在尝试为游戏编写物理代码,我不想使用任何第三方库,实际上我想自己编写每一件事。我知道如何检测两个球体之间的碰撞,但我无法弄清楚,如何找到两个球体之间的碰撞/排斥角度。我试过逆转物体的方向,但没有运气。如果你把我链接到一个教学物理编程的有趣的.pdf文件,那将是非常好的。

4 个答案:

答案 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)

我不应该回答我自己的问题,但我想我找到了我需要的东西。它也可以帮助其他人。我只是在指点维基百科的物理部分,我得到了这个。

This link solves my question

答案 3 :(得分:0)

笛卡尔系统中的角度可以通过以下方式找到:

反正切((雅镱)/(XA-XB))

因为这是一个纠结的三角形,你知道这些角度(高度和宽度的差异)。这将对切线进行计算。因此,arctan将计算具有此切线的角度。

我希望我能提供帮助。