Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Выбор объекта в OpenGL


Автор: Devic 8.5.2009, 13:08
Здравствуйте, у меня возникла проблема. Я пишу игру "Чапаев"(кто не знает- своими шашками сбиваешь чужие) , сцена трёхмерная, каждая шашка - объект, нужно реализовать выбор конкретной шашки, чтобы потом выбрать для неё силу и направление. То есть, как я себе предполагаю при нажатии курсора на определенную шашку, у неё,к примеру меняется значение переменной булевого типа. У меня не получается сделать так чтобы при нажатии курсором на шашку именно у неё менялась эта переменная. Как это сделать?

Автор: Mazzi 8.5.2009, 13:33
Тебе нужно сделать так, чтобы каждая шашка(объект) понимала координаты экрана в которые она отрисовывается. После клика мыши производишь опрос шашаек по очереди, передавая им координаты клика и та(шашака) у которой координаты клика и координаты отрисовки пересекаются установит у себя булевскую переменную и (например) будет подсвечена. 

Автор: Devic 8.5.2009, 14:16
тогда вопрос следующий - как сделать чтобы шашка понимала в какие координаты экрана она отрисовывается? И при определенном угле они ведь перекрывают друг друга

Автор: Mazzi 8.5.2009, 16:22
Цитата(Devic @ 8.5.2009,  14:16)
тогда вопрос следующий - как сделать чтобы шашка понимала в какие координаты экрана она отрисовывается? И при определенном угле они ведь перекрывают друг друга

Ну тогда по другому, подсвечивать ещё до клика, читая координаты мыши. А по вопросу понимания куда отрисовывается объект, не могу сказать.  Решить этот вопрос можно, только я не знаю как.

Автор: buian 13.5.2009, 15:14
Всем привет.
Сейчас пишу прогарммку, необходимо заюзать буфер выбора от OpenGL, при двойном клике.
есть следующие функции
Код

void Render(GLenum mode)
{
PAINTSTRUCT n_paint;
int i;
string tmp;
GLdouble x,y;

    dc=BeginPaint(handle,&n_paint);

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        if(graph_create)
        {
            glColor3d(0.0,0.45,0.0);
            glEnable(GL_POINT_SMOOTH);
            glPointSize(30);
            for(i=0; i<graf->GetTopCount(); i++)
            {
                if(mode==GL_SELECT) glLoadName(i+1);
                glBegin(GL_POINTS);
                    x=graf->GetTopX(i);
                    y=graf->GetTopY(i);
                    glVertex2d(x,y);
                glEnd();
            }
            for(i=0; i<graf->GetTopCount(); i++)
            {
                    x=graf->GetTopX(i);
                    y=graf->GetTopY(i);
                    tmp=graf->GetTopName(i);
                    glColor3d(0.8,0.0,0.0);
                    glRasterPos2d(x-0.02,y-0.01);
                    glPrint(tmp);
            }
        }
    SwapBuffers(dc);
    EndPaint(handle,&n_paint);
    ReleaseDC(handle,dc);
}


Код

GLint DoSelect(GLuint x, GLuint y)
{
GLuint hits;

    glSelectBuffer(4,selBuf);
    glGetIntegerv(GL_VIEWPORT,viewport);
    glRenderMode(GL_SELECT);
    glInitNames();
    glPushName(0);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    gluPickMatrix(x,viewport[3]-y,2,2,viewport);
    Render(GL_SELECT);
    hits=glRenderMode(GL_SELECT);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
    if(hits<=0) return -1;
    return selBuf[3];
}


и в обработчике событий:

Код

        case WM_LBUTTONDBLCLK:
            hit=DoSelect(LOWORD(lParam),HIWORD(lParam));
            break;


где-то что-то не работает, hit всегда -1.
подскажите, что не так.

Автор: buian 14.5.2009, 16:37
ребят.
какой-то странный глюк, если рисую примитив GL_QUADS поименный, то все нормально.
с точками, треугольниками почему-то не определяет.

разобрался, по глупости поставил при инициализации glViewPort кооодинаты руками, при этом не на все окно. Поэтому похоже и не совпадали координаты мышки и расчеты OpenGL.

Автор: JanryMayers 31.3.2010, 03:58
Цитата

Ну тогда по другому, подсвечивать ещё до клика, читая координаты мыши. А по вопросу понимания куда отрисовывается объект, не могу сказать.  Решить этот вопрос можно, только я не знаю как. 


А кто то может подсказать?

Предположение, что для каждой фигуры, при инициализации, как объект на доске, запоминаются её координаты экрана исходя из начальных координат.

Но вопрос первый, касающийся масштаба. В ЖЛ сцене координаты точек имеют вещественный тип, к примеру 2.0f. То есть при инициализации понадобится их сохранить, а потом сравнить с координатами мыши, после нажатия, у которых значение целое и положительное. Во общем говоря как преобразовывать координаты курсора в ЖЛ координаты и наоборот?

Второй вопрос. А если у нас, к примеру не 8 фигур, а больше 1000, то не ужели придётся проверять после каждого клика координаты всех 1000 фигур?



Автор: Rickert 31.3.2010, 13:31
Модератор: Пожалуйста, один топик - один вопрос.
Правила форума: http://forum.vingrad.ru/index.php?act=boardrules

buianJanryMayers
Ещё раз устроите мусорку в темах - получите предупреждение.
Закрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)