проблема с gluLook при выборе - PullRequest
0 голосов
/ 26 мая 2011

Hello
Это моя функция, которая будет обнаруживать попадание.

private int[] GetSelected(int x, int y)
{
    const int max = 512;
    var Hit_Buffer = new int[max];
    var viewport = new int[4];

    Gl.glSelectBuffer(max, Hit_Buffer);
    Gl.glRenderMode(Gl.GL_SELECT);

    Gl.glMatrixMode(Gl.GL_PROJECTION);
    Gl.glPushMatrix();
    Gl.glLoadIdentity();

    Glu.gluLookAt(Distance * Math.Cos(beta) * Math.Cos(alpha)
        , Distance * Math.Cos(beta) * Math.Sin(alpha)
        , Distance * Math.Sin(beta)
        , 0, 0, 0
        , -Math.Sin(beta) * Math.Cos(alpha)
        , -Math.Sin(beta) * Math.Sin(alpha)
        , Math.Cos(beta));

    Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
    Glu.gluPickMatrix(x, viewport[3] - y, 1, 1, viewport);

    Glu.gluPerspective(fovY, ogl1.Width / (double)(ogl1.Height != 0 ? ogl1.Height : 1), 0.1, 100.0);
    Gl.glMatrixMode(Gl.GL_MODELVIEW);

    Gl.glInitNames();
    // render scene: a TRIANGLE
    Gl.glPushName(1);
    Gl.glBegin(Gl.GL_TRIANGLES);
    Gl.glVertex3d(0, 0, 0);
    Gl.glVertex3d(0, 1, 0);
    Gl.glVertex3d(1, 0, 0);
    Gl.glEnd();
    Gl.glPopName();
    //

    Gl.glMatrixMode(Gl.GL_PROJECTION);
    Gl.glPopMatrix();
    Gl.glMatrixMode(Gl.GL_MODELVIEW);
    Gl.glFlush();

    var hits = Gl.glRenderMode(Gl.GL_RENDER);
    Array.Resize(ref Hit_Buffer, hits);

    return Hit_Buffer;
}

Я рисую треугольник в плоскости xy.
В gluLookAt, бета - это угол камеры от плоскости xy, а альфа - этоугол наклона камеры около z.
Но это работает, только если бета мала (-15 <бета <15 градусов)! <br>Что здесь не так?

Ответы [ 3 ]

0 голосов
/ 27 мая 2011

Вы специально вызывали gluLookAt перед gluPickMatrix.Хотите применить переводы к своей матрице выбора?Если нет, можете ли вы переместить gluPickMatrix сразу после glLoadIdentity и попытаться решить вашу проблему?

0 голосов
/ 27 мая 2011

Привет еще раз
Я наконец-то нашел свой ответ сам!(погуглив)поэтому я напишу основные части здесь

    // Define select buffer
    const int max = 512;
    var Hit_buffer = new int[max];
    Gl.glSelectBuffer(max, Hit_buffer);

    var viewport = new int[4];
    Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);

    Gl.glRenderMode(Gl.GL_SELECT);

    Gl.glLoadIdentity();
    Gl.glMatrixMode(Gl.GL_PROJECTION);
    Gl.glPushMatrix();
    Gl.glLoadIdentity();

    Glu.gluPickMatrix(x, viewport[3] - y, 3, 3, viewport);

    Glu.gluPerspective(fovY, Width / (double)(Height != 0 ? Height : 1), 0.1, 1000.0);
    Gl.glMatrixMode(Gl.GL_MODELVIEW);

    Gl.glInitNames();

    // set camera (gluLookAt, ...) & draw scene

    Gl.glMatrixMode(Gl.GL_PROJECTION);
    Gl.glPopMatrix();
    Gl.glMatrixMode(Gl.GL_MODELVIEW);
    Gl.glFlush();

    var hits = Gl.glRenderMode(Gl.GL_RENDER);

    // process hits
0 голосов
/ 26 мая 2011

В OpenGL Y вверх

Для первых 3-х параметров я бы лучше сказал:

      Distance * Math.Cos(beta) * Math.Cos(alpha)
    , Distance * Math.Sin(beta)
    , Distance * Math.Cos(beta) * Math.Sin(alpha)

А для 3-х последних попробуйте с (0,1,0) первый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...