0

私のプログラムには、ヒット テストを行う必要のある単純な四角形があります。私は openFrameworks を使用していますが、ここでの問題は OpenGL のトピックにも関連していると思います。

public class Shape : public class ofNode {
  Shape() {
    container.setFromCenter(getPosition(), 200,100);
    setPosition(ofVec3f(365, 50, 0)); //set the position of the node
    lookAt(ofVec3f(0,0,0));
  }

  virtual void draw() {
    ofRect(container); //the 200/100 rectangle will be drawn as per the container position and dimensions
  }
  ofVec3f getTopLeft() const {
    return getTopLeft() * ofNode::getGlobalTransformMatrix();
  }

  ofVec3f getTopRight() const {}    //similar - getTopRight from container and multiply
  ofVec3f getBottomLeft() const {}  //similar
  ofVec3f getBottomRight() const {} //similar

  bool hitTest(int tx, int ty) {
    // return true if mouse pointer is inside four vertices - hit test logic working fine
  }

  private:
    ofRectagle container;
};

ここでの問題は、プログラム内で形状を回転および変換していることです。

void draw() {
  ofPushMatrix();
  ofTranslate(600,300,0);
  ofRotateY(rotate);
  shape->draw();

  ofCircle(shape->getTopLeft(), 10); //circle is drawn at the rectangle top left vertex on the screen but the coordinates while rotating and drawing do not change (as seen on cout)
  ofCircle(shape->getTopRight(), 10); //similar
  ofCircle(shape->getBottomLeft(), 10); //similar
  ofCircle(shape->getBottomRight(), 10); //similar
  ofPopmatrix();
}

上記の関数のように回転が変更された場合draw、ポイントは変更されません。したがって、ヒット テストでマウスが内部にあるかどうかを判断するための適切な 4 つの頂点がありません。ヒット テストのマウス位置に対してチェックできる画面内のポイントの位置を取得するにはどうすればよいですか?

4

1 に答える 1

2

マウス ポインターが四角形の範囲内にあるかどうかをテストする場合は、最初にそれらを画面空間に変換し、そこでテストを行うことをお勧めします。 14424267/524368

また、OpenGL の組み込み行列操作関数の使用をやめる時期が来ているとも言います。それらを使用するメリットはまったくありません。GPU でアクセラレートされると考える人もいますが、そうではありません。プログラムの他のポイントでこれらの行列が必要になるとすぐに、これに OpenGL を悪用するのは現実的ではありません。結局、OpenGL は数学ライブラリではありません。そして、それ以降のバージョンでは、マトリックス スタック全体が OpenGL から削除されました。

OpenFrameworks には、完全な機能を備えた行列数学ライブラリが付属していますそれを使用することを強くお勧めします。glLoadMatrix(固定関数パイプライン) またはglUniformMatrix(シェーダー パイプライン)を使用して、生成されたマトリックスを OpenGL に供給することができます。

他の回答で概説したように、それを使用して射影関数を実装できます。

ポイントがエッジによって定義された境界内にあるかどうかをテストするには、「ハーフエッジ」と呼ばれる概念を使用できます。エッジがスター ドメインループを形成しているとします。次に、ループ内の各エッジについて、点とエッジの外積をとります。ポイントがループによって定義された形状内にある場合、すべての外積は同じ方向を指します。同一平面上にある四角形 (つまり、スクリーン スペースに投影された四角形) は、常にスター ドメインを形成します。

于 2013-01-20T13:36:06.773 に答える