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

1 回答 1

2

如果您想测试鼠标指针是否在矩形的范围内,我建议您首先将它们转换为屏幕空间并在那里进行测试,按照我在https://stackoverflow.com/a/中给您的总体思路14424267/524368

我还要说,是时候停止使用 OpenGL 的内置矩阵操作函数了。使用它们绝对没有任何好处!有些人认为他们会被 GPU 加速,但事实并非如此。一旦您在程序中的其他点需要这些矩阵,为此滥用 OpenGL 是不切实际的。OpenGL 毕竟不是一个数学库。在后来的版本中,整个矩阵堆栈已从 OpenGL 中删除——很好摆脱。

OpenFrameworks 带有一个功能齐全的矩阵数学库。我强烈建议你使用glLoadMatrix您可以使用(固定函数管道)或glUniformMatrix(着色器管道)向 OpenGL 提供生成的矩阵。

您可以使用它来实现我在其他答案中概述的投影功能。

要测试一个点是否位于边定义的边界内,您可以使用一个称为“半边”的概念。假设你的边缘形成一个星域循环。然后,对于循环中的每条边,您都取该点与边的叉积。如果该点在环定义的形状内,则所有叉积将指向同一方向。共面四边形(即投影到屏幕空间中的四边形)总是形成星域。

于 2013-01-20T13:36:06.773 回答