3

分離軸定理と SFML の衝突の実装に取り​​組んでいますが、頂点配列で問題が発生しています。オブジェクトは変換されます (頂点配列を含むクラスは sf::Transformable を継承します) が、頂点座標は変換 (つまり回転) を受け取らないため、オブジェクトが元の向きにない場合、衝突は機能しません。このようなものを使用して、頂点配列のSAT衝突を計算する前に、新しい頂点配列を作成してみました

    length = sqrt( shape1.getShape()[i].position.x*shape1.getShape()[i].position.x + shape1.getShape()[i].position.y*shape1.getShape()[i].position.y );
    newshape1[i].position.x = length*cos( shape1.getRotation()*(PI/180) );
    newshape1[i].position.y = length*sin( shape1.getRotation()*(PI/180) );

テストされている 2 つの形状に対して。ただし、これは機能していないようです。私の関数は、衝突が発生していないにもかかわらず、衝突が発生したことを返します。数学にエラーがあるかどうかはわかりませんが、オブジェクトに適用される SFML 変換がなければ、完全に機能します。それで、私がやるべきことは他にありますか、または変換(ほとんど回転だけ)を適用して VertexArray 情報を収集する別の方法はありますか?

編集: ここでいくつかの情報を見つけました: http://sfml-dev.org/documentation/2.0/classsf_1_1Transform.php#details しかし、これを VertexArrays に適用する方法を理解するのに苦労しています。クラス内で何かをしgetTransform()、その組み合わせをクラスの VertexArray に渡す必要があるようです。

編集: 上記の情報を使用して、SAT 計算の前に VertexArray の各頂点に対して代わりにこのメソッドを使用してみました:

    newshape1[i].position = shape1.getTransform().transformPoint( shape1.getShape()[i].position );

内積を計算するときに変換位置を否定した後、最初の試行とまったく同じ結果が生成されます。

4

1 に答える 1

2

これは 3 年近く前の質問だと思いますが、この問題に約 1 週間頭がおかしくなり、ついに解決することができました。これが私のために働いたものです:

sf::Vector2f vertexPosition = getTransform().transformPoint( m_vertices[n].position );

...私にとって何がうまくいったか、あなたが試みたことを見ても、あなたのアプローチがなぜうまくいかなかったのか正直わかりません。私が見る唯一の違いは、(1) この関数をカスタム シェイプ内から呼び出していることです。これは何の違いもありません。(2) GetShape() を使用していますが、これは関数であると推測しています。ローカルの頂点位置を返すように書きましたか?

いずれにせよ、これが将来この問題で立ち往生する可能性のある人に役立つことを願っています. 上で書いたスニペットは、任意のカスタム シェイプの頂点の絶対座標を、変換 (平行移動、スケール、および回転) が適用された状態で返します。

于 2016-05-24T23:35:04.717 に答える