Преобразование экрана к мировой координате в OpenGLES легкая задача?

все подпредставления внутри прокрутки должны иметь ограничения, затрагивающие все края вида прокрутки, как объясняется в документации, высота и ширина вида прокрутки вычисляется автоматически по показателям подпредставлений, это означает, что вы необходимо иметь ограничения Trailing и Leading для ширины и ограничения Top и Bottom для высоты.

5
задан RexOnRoids 6 July 2009 в 01:59
поделиться

5 ответов

Предлагаются два решения. Оба они должны достичь конечной цели, хотя и разными способами: вместо того, чтобы ответить «какая мировая координата находится под мышью?», Они отвечают на вопрос «какой объект отображается под мышью?».

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

Другой - использовать выбор OpenGL. Здесь есть неплохой учебник . Основная идея состоит в том, чтобы перевести OpenGL в режим выбора, ограничить область просмотра небольшим (возможно, 3x3 или 5x5) окном вокруг интересующей точки, а затем визуализировать сцену (или ее упрощенную версию) с использованием «имен» OpenGL (целочисленных идентификаторов) для идентификации компонентов, составляющих каждое лицо. В конце этого процесса OpenGL может предоставить вам список имен, которые были отображены в области просмотра выбора. Сопоставление этих идентификаторов с исходными объектами позволит вам определить, какой объект находится под курсором мыши.

1
ответ дан 18 December 2019 в 14:50
поделиться

Представьте себе линию, идущую от глаза зрителя
через точку касания экрана в пространство вашей 3D-модели.

Если эта линия пересекает любую из граней куба, значит, пользователь коснулся куба.

2
ответ дан 18 December 2019 в 14:50
поделиться

Google для opengl screen to world (например, на GameDev.net есть ветка, где кто-то хочет сделать именно то, что вы ищете ). Существует функция gluUnProject , которая делает именно это, но она недоступна на iPhone, поэтому вам придется ее портировать (см. этот источник из проекта Mesa). Или, может быть, где-то уже есть какой-нибудь общедоступный источник?

0
ответ дан 18 December 2019 в 14:50
поделиться

Вам нужны матрицы проекции opengl и просмотра модели. Умножьте их, чтобы получить матрицу проекции вида модели. Инвертируйте эту матрицу, чтобы получить матрицу, которая преобразует координаты пространства клипа в мировые координаты. Преобразуйте точку касания так, чтобы она соответствовала координатам клипа: центр экрана должен быть нулевым, а края должны быть + 1 / -1 для X и Y соответственно.

создайте две точки, одну в (0,0, 0) и один в (touch_x, touch_y, -1) и преобразовать их с помощью обратной матрицы проекции вида модели.

Выполните обратное деление перспективы.

Вы должны получить две точки, описывающие линию из центра камеру на «дальнее расстояние» (дальнюю плоскость).

Делайте пикировку на основе упрощенных ограничивающих рамок ваших моделей. Вы должны быть в состоянии найти множество алгоритмов пересечения лучей и прямоугольников в сети.

Другое решение - перекрасить каждую из моделей немного другим цветом в закадровый буфер и считывать цвет в точке касания оттуда, сообщая вам

Вот источник курсора, который я написал для небольшого проекта, использующего физику пули:

float x=((float)mpos.x/screensize.x)*2.0f -1.0f;
    float y=((float)mpos.y/screensize.y)*-2.0f +1.0f;
    p2=renderer->camera.unProject(vec4(x,y,1.0f,1));
    p2/=p2.w;
    vec4 pos=activecam.GetView().col_t;
    p1=pos+(((vec3)p2 - (vec3)pos) / 2048.0f * 0.1f);
    p1.w=1.0f;

    btCollisionWorld::ClosestRayResultCallback rayCallback(btVector3(p1.x,p1.y,p1.z),btVector3(p2.x,p2.y,p2.z));
    game.dynamicsWorld->rayTest(btVector3(p1.x,p1.y,p1.z),btVector3(p2.x,p2.y,p2.z), rayCallback);
    if (rayCallback.hasHit())
    {
        btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject);
        if(body==game.worldBody)
        {
            renderer->setHighlight(0);
        }
        else if (body)
        {
            Entity* ent=(Entity*)body->getUserPointer();

            if(ent)
            {
                renderer->setHighlight(dynamic_cast<ModelEntity*>(ent));
                //cerr<<"hit ";
                //cerr<<ent->getName()<<endl;
            }
        }
    }
3
ответ дан 18 December 2019 в 14:50
поделиться

Теперь вы можете найти gluUnProject в http://code.google.com/p/iphone-glu/ . Я не связан с проектом iphone-glu и сам еще не пробовал, просто хотел поделиться ссылкой.

Как бы вы использовали такую ​​функцию? В этом PDF-документе упоминается следующее:

Процедура библиотеки утилит gluUnProject () выполняет эту обратную трансформацию. Учитывая трехмерные координаты окна для местоположения и все преобразования, которые повлияли на них, gluUnProject () возвращает мировые координаты, откуда оно возникло.

int gluUnProject(GLdouble winx, GLdouble winy, GLdouble winz, 
const GLdouble modelMatrix[16], const GLdouble projMatrix[16], 
const GLint viewport[4], GLdouble *objx, GLdouble *objy, GLdouble *objz);

Сопоставьте координаты указанного окна (winx, winy, winz) с координатами объекта, используя преобразования, определяемые матрицей вида модели (modelMatrix), матрицей проекции (projMatrix) и окном просмотра (viewport). Полученные координаты объекта возвращаются в форматах objx, objy и objz. Функция возвращает GL_TRUE , указывающее на успех, или GL_FALSE , указывающее на сбой (например, необратимую матрицу). Эта операция не пытается закрепить координаты в области просмотра или исключить значения глубины, которые выходят за пределы glDepthRange () .

Попытки обратить процесс преобразования в обратном направлении связаны с трудностями. Двумерное местоположение экрана могло происходить из любого места на всей строке в трехмерном пространстве. Чтобы устранить неоднозначность результата, gluUnProject () требует, чтобы была указана координата глубины окна (winz) и чтобы winz был указан в терминах glDepthRange (). Для значений по умолчанию glDepthRange () winz на 0. 0 будет запрашивать мировые координаты преобразованной точки в ближней плоскости отсечения, тогда как winz со значением 1.0 запросит точку в дальней плоскости отсечения.

Пример 3-8 (снова см. PDF ) демонстрирует функцию gluUnProject (), считывая положение мыши и определяя трехмерные точки в ближней и дальней плоскостях отсечения, из которых она была преобразована. Вычисленные мировые координаты выводятся на стандартный вывод, но само отображаемое окно просто черное.

Что касается производительности, Я быстро нашел это через Google в качестве примера того, что вы, возможно, не захотите делать. используя gluUnProject со ссылкой на , что может привести к лучшей альтернативе . Я понятия не имею, насколько это применимо к iPhone, поскольку я все еще новичок в OpenGL ES. Спроси меня снова через месяц. ; -)

0 будет запрашивать точку в дальней плоскости отсечения.

Пример 3-8 (снова см. PDF ) демонстрирует функцию gluUnProject (), считывая положение мыши и определяя трехмерные точки на ближайшей и далекие плоскости отсечения, из которых он был преобразован. Вычисленные мировые координаты выводятся на стандартный вывод, но само отображаемое окно просто черное.

Что касается производительности, Я быстро нашел это через Google в качестве примера того, что вы, возможно, не захотите делать. используя gluUnProject со ссылкой на , что может привести к лучшей альтернативе . Я понятия не имею, насколько это применимо к iPhone, поскольку я все еще новичок в OpenGL ES. Спроси меня снова через месяц. ; -)

0 будет запрашивать точку в дальней плоскости отсечения.

Пример 3-8 (снова см. PDF ) демонстрирует функцию gluUnProject (), считывая положение мыши и определяя трехмерные точки на ближайшей и далекие плоскости отсечения, из которых он был преобразован. Вычисленные мировые координаты выводятся на стандартный вывод, но само отображаемое окно просто черное.

Что касается производительности, Я быстро нашел это через Google в качестве примера того, что вы, возможно, не захотите делать. используя gluUnProject со ссылкой на , что может привести к лучшей альтернативе . Я понятия не имею, насколько это применимо к iPhone, поскольку я все еще новичок в OpenGL ES. Спроси меня снова через месяц. ; -)

см. PDF ) демонстрирует функцию gluUnProject (), считывая положение мыши и определяя трехмерные точки в ближней и дальней плоскостях отсечения, из которых она была преобразована. Вычисленные мировые координаты выводятся на стандартный вывод, но само отображаемое окно просто черное.

Что касается производительности, Я быстро нашел это через Google в качестве примера того, что вы, возможно, не захотите делать. используя gluUnProject со ссылкой на , что может привести к лучшей альтернативе . Я понятия не имею, насколько это применимо к iPhone, поскольку я все еще новичок в OpenGL ES. Спроси меня снова через месяц. ; -)

см. PDF ) демонстрирует функцию gluUnProject () путем считывания положения мыши и определения трехмерных точек в ближней и дальней плоскостях отсечения, из которых она была преобразована. Вычисленные мировые координаты выводятся на стандартный вывод, но само отображаемое окно просто черное.

Что касается производительности, Я быстро нашел это через Google в качестве примера того, что вы, возможно, не захотите делать. используя gluUnProject со ссылкой на , что может привести к лучшей альтернативе . Я понятия не имею, насколько это применимо к iPhone, поскольку я все еще новичок в OpenGL ES. Спроси меня снова через месяц. ; -)

но само отображаемое окно просто черное.

Что касается производительности, Я быстро нашел это через Google в качестве примера того, что вы, возможно, не захотите делать с помощью gluUnProject, со ссылкой на что могло бы привести к лучшей альтернативе . Я понятия не имею, насколько это применимо к iPhone, поскольку я все еще новичок в OpenGL ES. Спроси меня снова через месяц. ; -)

но само отображаемое окно просто черное.

Что касается производительности, Я быстро нашел это через Google в качестве примера того, что вы, возможно, не захотите делать с помощью gluUnProject, со ссылкой на что могло бы привести к лучшей альтернативе . Я понятия не имею, насколько это применимо к iPhone, поскольку я все еще новичок в OpenGL ES. Спроси меня снова через месяц. ; -)

7
ответ дан 18 December 2019 в 14:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: