3

Qtを使ってゲームを作ろうとしています。グラフィックビューにいくつかの障害物 (QPixmapItem) があります。私はボールを持っています。私が望むのは、ボールが障害物から跳ね返ることです。新しい移動方向を計算できるように、障害物の表面の法線を検出するにはどうすればよいですか? 例えば:

------------------------------
    / \          |
   /   \         | 
  /     \        v
 /       \       ^
/         \      |
4

1 に答える 1

1

あなたのコメントに基づいて、あなたは確かに問題に正しく取り組んでいます。ただし、解決策を得るために必要なのは、QPainterPath 要素を反復処理し、実際にボールの方向線と交差する要素を特定することです (これに QLineF を使用するのはかなり簡単な作業です)。また、パスを単純化すると、ベジェ曲線が直線に減り、計算が簡単になります(ベジェ計算を自分で処理する必要があるか、まったく処理する必要がないため、これはあなたに任せます)。複数の交点が存在する可能性があるため、次に、どの交点がボールの中心に最も近いかを判断する必要があります。最も近いポイントを特定したら、その要素を QLineF で使用して法線ベクトルを見つけ、バウンス方向の計算を完了することができます。

QPainterPath を反復処理し、その要素を処理する方法を示す基本的なスレッド化されていないコードを次に示します。

QPainterPath path = item->shape();

path = path.simplified(); //optional if you do not want to handle curveTo elements yourself

QPainterPath::Element element;
QPainterPath::Element P1;
QPainterPath::Element P2;
QPainterPath::Element P3;
QPainterPath::Element P4;

for(int i = 0; i < path.elementCount()-1; ++i)
{
    element = path.elementAt(i);
    if(element.isMoveTo())
    {
        //Do something
    }
    else if(element.isLineTo())
    {
        //Do something with element.x and element.y
    }
    else if(element.isCurveTo())
    {
        P1 = path.elementAt(i-1); // start point
        P2 = path.elementAt(i);   // control point
        P3 = path.elementAt(i+1); // control point
        P4 = path.elementAt(i+2); // end point

        //Do something with cubic bezier points
    }
}
于 2013-11-20T08:54:00.300 に答える