分離軸定理と 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 );
内積を計算するときに変換位置を否定した後、最初の試行とまったく同じ結果が生成されます。