Проверка попадания между четырьмя вращающимися вершинами

У меня есть простой прямоугольник в моей программе, по которому я должен был провести тестирование попадания. Я использую 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

Решение

Если вы хотите проверить, находится ли указатель мыши в пределах прямоугольника, я предлагаю вам сначала преобразовать их в пространство экрана и выполнить тест там, следуя общей идее, которую я дал вам в https://stackoverflow.com/a/14424267/524368

Я бы также сказал, что пора перестать использовать встроенные в OpenGL функции манипулирования матрицей. Их использование абсолютно бесполезно! Некоторые люди думают, что они будут ускоряться GPU, но это не так. Как только вам понадобятся эти матрицы в других точках вашей программы, просто нецелесообразно злоупотреблять OpenGL для этого. OpenGL — это не математическая библиотека. И в более поздних версиях весь стек матриц был удален из OpenGL — хороший случай.

OpenFrameworks поставляется с полнофункциональной матрицей математической библиотеки. Я настоятельно рекомендую вам использовать тот. Вы можете кормить OpenGL сгенерированных матриц с glLoadMatrix (конвейер с фиксированной функцией) или glUniformMatrix (шейдерный конвейер).

Вы можете использовать его для реализации функции проекции, как я изложил в этом другом ответе.

Чтобы проверить, лежит ли точка в границах, определенных ребрами, вы можете использовать концепцию, называемую «пол ребра». Скажите, что ваши края образуют звездный домен петля. Затем для каждого ребра в цикле вы берете перекрестное произведение точки с ребром. Если точка находится в пределах формы, определенной петлей, все перекрестные произведения будут указывать в одном направлении. Копланарные четырехугольники (то есть четырехугольники, спроецированные в пространство экрана) всегда образуют звездную область.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]