在四个旋转顶点之间进行测试

时间:2013-01-20 12:56:10

标签: c++ algorithm opengl 3d openframeworks

我的程序中有一个简单的矩形,我必须在其中进行测试。我使用的是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功能中的旋转被更改,这些点不会改变。因此,我没有适当的四个顶点用于命中测试以确定鼠标是否在里面。 如何获取屏幕中点的位置,可以根据命中测试的鼠标位置进行检查?

1 个答案:

答案 0 :(得分:2)

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

我也说,现在是时候停止使用OpenGL的内置矩阵操作函数了。 使用它们绝对没有任何好处!有些人认为它们是GPU加速的,但事实并非如此。只要您在程序中的其他位置需要这些矩阵,就可以滥用OpenGL。毕竟,OpenGL不是一个数学库。在后来的版本中,整个矩阵堆栈已从OpenGL中删除 - 很好的解决。

OpenFrameworks comes with a fully featured matrix math library。我强烈建议你使用那个。您可以使用glLoadMatrix(固定功能管道)或glUniformMatrix(着色器管道)向OpenGL提供生成的矩阵。

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

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