текст в перспективной проэкции в OpenGL
От: Ossto  
Дата: 05.01.04 12:53
Оценка:
Вопрос такой:
как его вывести так чтобы он был всегда в окне?

Собственно вопрос можно расширыть... как делаются все худы(показатели) в 3д играх (в перспективной проекции)?
Re: текст в перспективной проэкции в OpenGL
От: mksa Россия  
Дата: 05.01.04 13:27
Оценка:
Здравствуйте, Ossto, Вы писали:

O>Вопрос такой:

O>как его вывести так чтобы он был всегда в окне?

O>Собственно вопрос можно расширыть... как делаются все худы(показатели) в 3д играх (в перспективной проекции)?


Ага... Я сам долго мучился с этй же фигней
Я решил эту проблему так (типа кроссхайр-худ):

        ... 
        сначала рисую сцену
        ....

        // теперь кроссхайр - рисовать так, чтобы не проваливался за стены =)))
        // Crosshair  
        glPushMatrix();
        glDisable(GL_DEPTH_TEST); //!!!!! Эта та самая фигня!!! Отключаем тест глубины.

        glLoadIdentity();
        glTranslated(0.0f,0.0f,-55.0f);   
        
        glColor3f(0.0f,1.0f,0.0f);

        glBegin(GL_LINES);
            glColor3f(0.0f,1.0f,0.0f);
            glVertex2f(0.0f,1.0f);
            glColor3f(0.0f,0.0f,0.0f);
            glVertex2f(0.0f,0.1f);

            glVertex2f(0.0f,-0.1f);
            glColor3f(0.0f,1.0f,0.0f);
            glVertex2f(0.0f,-1);

            glVertex2f(1.0f,0.0f);
            glColor3f(0.0f,0.0f,0.0f);
            glVertex2f(0.1f,0.0f);

            glVertex2f(-0.1f,0.0f);
            glColor3f(0.0f,1.0f,0.0f);
            glVertex2f(-1.0f,0.0f);
        glEnd();

        glEnable(GL_DEPTH_TEST);   // Включаем тест глубины
Re[2]: текст в перспективной проэкции в OpenGL
От: mksa Россия  
Дата: 05.01.04 13:31
Оценка:
M>Ага... Я сам долго мучился с этй же фигней
M>Я решил эту проблему так (типа кроссхайр-худ):

M>
M>        ... 
M>        сначала рисую сцену
M>        ....

M>        // теперь кроссхайр - рисовать так, чтобы не проваливался за стены =)))
M>        // Crosshair  
M>        glPushMatrix();
M>        glDisable(GL_DEPTH_TEST); //!!!!! Эта та самая фигня!!! Отключаем тест глубины.

M>        glLoadIdentity();
M>        glTranslated(0.0f,0.0f,-55.0f);   
        
M>        glColor3f(0.0f,1.0f,0.0f);

M>        glBegin(GL_LINES);
M>            glColor3f(0.0f,1.0f,0.0f);
M>            glVertex2f(0.0f,1.0f);
M>            glColor3f(0.0f,0.0f,0.0f);
M>            glVertex2f(0.0f,0.1f);

M>            glVertex2f(0.0f,-0.1f);
M>            glColor3f(0.0f,1.0f,0.0f);
M>            glVertex2f(0.0f,-1);

M>            glVertex2f(1.0f,0.0f);
M>            glColor3f(0.0f,0.0f,0.0f);
M>            glVertex2f(0.1f,0.0f);

M>            glVertex2f(-0.1f,0.0f);
M>            glColor3f(0.0f,1.0f,0.0f);
M>            glVertex2f(-1.0f,0.0f);
M>        glEnd();

M>        glEnable(GL_DEPTH_TEST);   // Включаем тест глубины


M>


glPopMatrix();


Re[2]: текст в перспективной проэкции в OpenGL
От: Ossto  
Дата: 05.01.04 14:33
Оценка:
Здравствуйте, mksa, Вы писали:

M>Ага... Я сам долго мучился с этй же фигней

M>Я решил эту проблему так (типа кроссхайр-худ):

M>
M> код ...
M>



А вот именно со шрифтом у меня не получилось... ежели делать его через
font = CreateFont(  -24,        // Высота фонта ( НОВОЕ )
        0,        // Ширина фонта
        0,        // Угол отношения
        0,        // Угол Наклона
        FW_BOLD,      // Ширина шрифта
        FALSE,        // Курсив
        FALSE,        // Подчеркивание
        FALSE,        // Перечеркивание
        DEFAULT_CHARSET,      // Идентификатор набора символов
        OUT_TT_PRECIS,      // Точность вывода
        CLIP_DEFAULT_PRECIS,    // Точность отсечения
        ANTIALIASED_QUALITY,    // Качество вывода
        FF_SWISS|DEFAULT_PITCH,  // Семейство и Шаг
        "MS San Serif");      // Имя шрифта
  SelectObject(hDC, font);        // Выбрать шрифт, созданный нами ( НОВОЕ )

  wglUseFontBitmaps(hDC, 32, 96, base);


то такая феня не проходит... не видно его и усе тут.... то есть вообще нигде не видно....
а вот объекты сделанные таким макаром отлично лежат и не дергаются
Re: текст в перспективной проэкции в OpenGL
От: Zuka Россия  
Дата: 06.01.04 04:26
Оценка:
Здравствуйте, Ossto, Вы писали:

O>Вопрос такой:

O>как его вывести так чтобы он был всегда в окне?

O>Собственно вопрос можно расширыть... как делаются все худы(показатели) в 3д играх (в перспективной проекции)?


    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glDisable(GL_LIGHTING);    
    glDisable(GL_TEXTURE_2D);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(-10,10,-10,10);
    glLoadIdentity();    
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    
    //Рисуем что-нибудь в 2D

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(67.5, 4/3, 1.0, 1000.0);

    glMatrixMode(GL_MODELVIEW);    
    glLoadIdentity();    
    //Преобразования камеры
    //Сразу оговорюсь: Моя камера не шутерная, а для стратегий/РПГ
    glTranslatef(0,0,-distance);    
    glRotatef(height_angle,1,0,0);
    glRotatef(azimuth_angle,0,1,0);
    glTranslatef(camx,0,camy);
    
    //Рисуем в 3D
... << RSDN@Home 1.0 beta 4 >>
Re[2]: текст в перспективной проэкции в OpenGL
От: Ossto  
Дата: 06.01.04 06:11
Оценка:
Здравствуйте, Zuka, Вы писали:

Z>
    
Z>    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Z>    glDisable(GL_LIGHTING);    
Z>    glDisable(GL_TEXTURE_2D);
Z>    glMatrixMode(GL_PROJECTION);
Z>    gluOrtho2D(-10,10,-10,10);
Z>    glLoadIdentity();    
Z>    glMatrixMode(GL_MODELVIEW);
Z>    glLoadIdentity();
    
Z>    //Рисуем что-нибудь в 2D

Z>    glMatrixMode(GL_PROJECTION);
Z>    glLoadIdentity();
Z>    gluPerspective(67.5, 4/3, 1.0, 1000.0);

Z>    glMatrixMode(GL_MODELVIEW);    
Z>    glLoadIdentity();    
Z>    //Преобразования камеры
Z>    //Сразу оговорюсь: Моя камера не шутерная, а для стратегий/РПГ
Z>    glTranslatef(0,0,-distance);    
Z>    glRotatef(height_angle,1,0,0);
Z>    glRotatef(azimuth_angle,0,1,0);
Z>    glTranslatef(camx,0,camy);
    
Z>    //Рисуем в 3D    
    
Z>

Попробую...
Можно подробнее остановиться на том как Вы обрабатываете мышь для камеры?
Re[3]: текст в перспективной проэкции в OpenGL
От: Zuka Россия  
Дата: 06.01.04 07:40
Оценка:
case WM_MOUSEWHEEL :
        {
            short zDelta = GET_WHEEL_DELTA_WPARAM(wParam);
            distance += zDelta / WHEEL_DELTA;
        }
        break;
    case WM_RBUTTONDOWN:
    case WM_MBUTTONDOWN:
        {
            oldXPos = GET_X_LPARAM(lParam); 
            oldYPos = GET_Y_LPARAM(lParam); 
            ShowCursor(false);
        }
        break;
    case WM_RBUTTONUP:
    case WM_MBUTTONUP:
        {
            oldXPos = GET_X_LPARAM(lParam); 
            oldYPos = GET_Y_LPARAM(lParam); 
            ShowCursor(true);
        }
        break;
    case WM_MOUSEMOVE:
        {
            if (wParam == 0)
                break;
            POINT p;
            GetCursorPos(&p);
            int xPos = p.x;//GET_X_LPARAM(lParam); 
            int yPos = p.y;//GET_Y_LPARAM(lParam); 
            if (wParam & MK_LBUTTON)
                break;
            if (wParam & MK_RBUTTON)
            {
                height_angle += (oldYPos - yPos) / 5.0f;
                azimuth_angle += (oldXPos - xPos) / 5.0f;
                
            }
            else
                if (wParam & MK_MBUTTON)
                {
                    float dx = -(oldXPos - xPos) / 10.0f;
                    float dy = +(oldYPos - yPos) / 10.0f;
                    camx += +dx * cosf(xangle*pid180) + dy * sinf(xangle*pid180);
                    camy += dx * sinf(xangle*pid180) - dy * cosf(xangle*pid180);
                }
            if ((yPos<400) || (yPos > 500))
                {                
                    yPos = 400;
                    SetCursorPos(xPos, yPos);                    
                    oldYPos = yPos;
                }
            if ((xPos < 400)|| (xPos>500))
            {
                xPos = 400;
                SetCursorPos(xPos, yPos);                    
                oldXPos = xPos;
            }
            oldXPos = xPos;
            oldYPos = yPos;
            
        }
        break;
... << RSDN@Home 1.0 beta 4 >>
Re[3]: текст в перспективной проэкции в OpenGL
От: mksa Россия  
Дата: 06.01.04 08:24
Оценка:
Здравствуйте, Ossto, Вы писали:

O>А вот именно со шрифтом у меня не получилось... ежели делать его через

O>
O>font = CreateFont(  -24,        // Высота фонта ( НОВОЕ )
O>        0,        // Ширина фонта
O>        0,        // Угол отношения
O>        0,        // Угол Наклона
O>        FW_BOLD,      // Ширина шрифта
O>        FALSE,        // Курсив
O>        FALSE,        // Подчеркивание
O>        FALSE,        // Перечеркивание
O>        DEFAULT_CHARSET,      // Идентификатор набора символов
O>        OUT_TT_PRECIS,      // Точность вывода
O>        CLIP_DEFAULT_PRECIS,    // Точность отсечения
O>        ANTIALIASED_QUALITY,    // Качество вывода
O>        FF_SWISS|DEFAULT_PITCH,  // Семейство и Шаг
O>        "MS San Serif");      // Имя шрифта
O>  SelectObject(hDC, font);        // Выбрать шрифт, созданный нами ( НОВОЕ )

O>  wglUseFontBitmaps(hDC, 32, 96, base);
O>


O>то такая феня не проходит... не видно его и усе тут.... то есть вообще нигде не видно....

O>а вот объекты сделанные таким макаром отлично лежат и не дергаются


    // Call first before printing
    GLvoid PrintBegin()
    {
        //--------------------------------------------------------------//
        //- START ORTHOGRAPHIC MODE ------------------------------------//
        //--------------------------------------------------------------//
        glDisable(GL_DEPTH_TEST);
        glMatrixMode(GL_PROJECTION);                    //Select the projection matrix
        glPushMatrix();                                    //Store the projection matrix
        glLoadIdentity();                                //Reset the projection matrix
        glOrtho(0,m_ClientRect.right,0,m_ClientRect.bottom,-1,1);    //Set up an ortho screen
        glMatrixMode(GL_MODELVIEW);                        //Select the modelview matrix
    }
    // Call after printing
    GLvoid PrintEnd()
    {
        glMatrixMode(GL_PROJECTION);                    //Select the projection matrix
        glPopMatrix();                                    //Restore the old projection matrix
        glMatrixMode(GL_MODELVIEW);                        //Select the modelview matrix
        glEnable(GL_DEPTH_TEST);
        //--------------------------------------------------------------//
        //- END ORTHOGRAPHIC MODE --------------------------------------//
        //--------------------------------------------------------------//
    }
    // Print text on OpenGL screen
    GLvoid Print(GLint x, GLint y, const char *fmt, ...)                    // Custom GL "Print" Routine
    {
        char        text[256];                                // Holds Our String
        va_list        ap;                                        // Pointer To List Of Arguments

        if (fmt == NULL)                                    // If There's No Text
            return;                                            // Do Nothing

        va_start(ap, fmt);                                    // Parses The String For Variables
            vsprintf(text, fmt, ap);                        // And Converts Symbols To Actual Numbers
        va_end(ap);                                            // Results Are Stored In Text

        glPushMatrix();                                        // Store The Modelview Matrix

        glLoadIdentity();                                    // Reset The Modelview Matrix
              glRasterPos2d(x, y);
        glListBase(m_base - 32);                            // Sets The Base Character to 32
        glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);    // Draws The Display List Text
        glPopMatrix();                                        // Restore The Old Projection Matrix
        
    }
    
    
    
    GLvoid BuildFont(GLvoid)                                // Build Our Bitmap Font
    {
        HFONT    font;                                        // Windows Font ID
        HFONT    oldfont;                                    // Used For Good House Keeping

        m_base = glGenLists(223);                            // Storage For 96 Characters

            font = CreateFont(    0,                            // Height Of Font
                                0,                                // Width Of Font
                                0,                                // Angle Of Escapement
                                0,                                // Orientation Angle
                                FW_NORMAL,                        // Font Weight
                                FALSE,                            // Italic
                                FALSE,                            // Underline
                                FALSE,                            // Strikeout
                                ANSI_CHARSET,                    // Character Set Identifier
                                OUT_TT_PRECIS,                    // Output Precision
                                CLIP_DEFAULT_PRECIS,            // Clipping Precision
                                ANTIALIASED_QUALITY,            // Output Quality
                                FF_DONTCARE|DEFAULT_PITCH,        // Family And Pitch
                                "Arial cyr");                        // Font Name

            oldfont = (HFONT)SelectObject(m_hDC, font);         
            wglUseFontBitmaps(m_hDC, 32, 223, m_base);         
            SelectObject(m_hDC, oldfont);                        // Selects The Font We Want
            DeleteObject(font);                                // Delete The Font
    }


    GLvoid KillFont(GLvoid)                                    // Delete The Font List
    {
        glDeleteLists(m_base, 223);                            // Delete All 96 Characters
    }


что — то типа этого...
Сначала
PrintBegin();
Print(x,y, "FPS = %d", m_fps);
Print(x,y, "Time = %d", m_time);
PrintEnd();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.