我的程序中有一个简单的矩形,我必须在其中进行测试。我使用的是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
功能中的旋转被更改,这些点不会改变。因此,我没有适当的四个顶点用于命中测试以确定鼠标是否在里面。
如何获取屏幕中点的位置,可以根据命中测试的鼠标位置进行检查?
答案 0 :(得分:2)
如果你想测试鼠标指针是否在矩形的范围内,我建议你首先将它们转换为屏幕空间并按照我在https://stackoverflow.com/a/14424267/524368给你的一般想法进行测试3} p>
我也说,现在是时候停止使用OpenGL的内置矩阵操作函数了。 使用它们绝对没有任何好处!有些人认为它们是GPU加速的,但事实并非如此。只要您在程序中的其他位置需要这些矩阵,就可以滥用OpenGL。毕竟,OpenGL不是一个数学库。在后来的版本中,整个矩阵堆栈已从OpenGL中删除 - 很好的解决。
OpenFrameworks comes with a fully featured matrix math library。我强烈建议你使用那个。您可以使用glLoadMatrix
(固定功能管道)或glUniformMatrix
(着色器管道)向OpenGL提供生成的矩阵。
您可以使用它来实现我在其他答案中概述的投影功能。
要测试点是否位于边界定义的边界内,可以使用称为“半边”的概念。说你的边形成star domain循环。然后,对于循环中的每个边,您将获取该点与边的交叉积。如果该点在由循环定义的形状内,则所有叉积将指向相同的方向。共面四边形(即投影到屏幕空间的四边形)总是形成一个星域。