У меня есть простой прямоугольник в моей программе, по которому я должен был провести тестирование попадания. Я использую 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
функция, точки не меняются. Следовательно, у меня нет соответствующих четырех вершин для теста попадания, чтобы определить, находится ли мышь внутри.
Как получить положение точек на экране, которое можно проверить по положению мыши для теста на удар?
Если вы хотите проверить, находится ли указатель мыши в пределах прямоугольника, я предлагаю вам сначала преобразовать их в пространство экрана и выполнить тест там, следуя общей идее, которую я дал вам в https://stackoverflow.com/a/14424267/524368
Я бы также сказал, что пора перестать использовать встроенные в OpenGL функции манипулирования матрицей. Их использование абсолютно бесполезно! Некоторые люди думают, что они будут ускоряться GPU, но это не так. Как только вам понадобятся эти матрицы в других точках вашей программы, просто нецелесообразно злоупотреблять OpenGL для этого. OpenGL — это не математическая библиотека. И в более поздних версиях весь стек матриц был удален из OpenGL — хороший случай.
OpenFrameworks поставляется с полнофункциональной матрицей математической библиотеки. Я настоятельно рекомендую вам использовать тот. Вы можете кормить OpenGL сгенерированных матриц с glLoadMatrix
(конвейер с фиксированной функцией) или glUniformMatrix
(шейдерный конвейер).
Вы можете использовать его для реализации функции проекции, как я изложил в этом другом ответе.
Чтобы проверить, лежит ли точка в границах, определенных ребрами, вы можете использовать концепцию, называемую «пол ребра». Скажите, что ваши края образуют звездный домен петля. Затем для каждого ребра в цикле вы берете перекрестное произведение точки с ребром. Если точка находится в пределах формы, определенной петлей, все перекрестные произведения будут указывать в одном направлении. Копланарные четырехугольники (то есть четырехугольники, спроецированные в пространство экрана) всегда образуют звездную область.
Других решений пока нет …