Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2012, 12:44   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию ПЕРЕКЛЮЧЕНИЕ ПРОЕКЦИИ OpenGL

Можно-ли переключатся с перспективной в ортогональную и наоборот
что-то вроде этого
Код:
bool perspective = true;
while (1) //
{
    //.........
    if (perspective == true)
    {
        // должна включится перспективная проекция
        //........
    }
    else
    {
        // иначе ортогональная
        //........
    }
    // тут рисуется изображение
}
SAMOUCHKA вне форума Ответить с цитированием
Старый 26.03.2012, 13:04   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну можно, при необходимости переключить настраиваете нужную проекцию и перерисовываете все.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.03.2012, 13:14   #3
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

еще ворпос как в программе изменять угол перспективной проекции
SAMOUCHKA вне форума Ответить с цитированием
Старый 24.04.2012, 23:15   #4
sIllent
Пользователь
 
Аватар для sIllent
 
Регистрация: 11.04.2012
Сообщений: 23
По умолчанию

У меня тот же вопрос, как сделать переключение проекций
Код:

#include <GL/glut.h>
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <math.h>
#include <tchar.h>



static GLfloat xRot = 0.0f, zoom=1.0f;
static GLfloat yRot = 0.0f;
bool persp=false;


// функция рисования сцены
void RenderScene(void)
    {
    // очищаем окно
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
    glPushMatrix();

    glRotatef(xRot, 1.0f, 0.0f, 0.0f);
    glRotatef(yRot, 0.0f, 1.0f, 0.0f);
	glScalef(zoom, zoom, zoom); 
	glEnable(GL_CLIP_PLANE0);//зазрешаем отсеченин
	GLdouble equation[4] = {-1.6, 1.6, -1.6, 176};
	glClipPlane(GL_CLIP_PLANE0, equation);

	glEnable(GL_CLIP_PLANE1);
	GLdouble equ[4] = {1.6,- 1.6, 1.6, 176};
	glClipPlane(GL_CLIP_PLANE1, equ);

    // рисуем шесть квадратов


    glPopMatrix();

    // 
    glutSwapBuffers();
    }

// This function does any needed initialization on the rendering
// context. 
void SetupRC()
    {
    // Black background
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f );

    glEnable(GL_DEPTH_TEST);	
    glEnable(GL_DITHER);
    glShadeModel(GL_SMOOTH);
    }

/////////////////////////////////////////////////

void SpecialKeys(int key, int x, int y)
    {
    if(key == GLUT_KEY_UP)
        xRot-= 5.0f;

    if(key == GLUT_KEY_DOWN)
        xRot += 5.0f;

    if(key == GLUT_KEY_LEFT)
        yRot -= 5.0f;

    if(key == GLUT_KEY_RIGHT)
        yRot += 5.0f;

	if(key==GLUT_KEY_PAGE_UP)
		zoom*=1.1f;

	if(key==GLUT_KEY_PAGE_DOWN)
		zoom/=1.1f;

    if(key > 356.0f)
        xRot = 0.0f;

    if(key < -1.0f)
        xRot = 355.0f;

	if(key > 356.0f)
        zoom = 0.0f;

    if(key < -1.0f)
        zoom = 355.0f;

    if(key > 356.0f)
        yRot = 0.0f;

    if(key < -1.0f)
        yRot = 355.0f;
	if(key==GLUT_KEY_F2)
		persp=true;
	if(key==GLUT_KEY_F3)
		persp=false;
	// восстановление 
	if(key == GLUT_KEY_F1){
		xRot=0.0f; 
		yRot=0.0f;
		zoom=1.0f;
	}


    // Refresh the Window
    glutPostRedisplay();
    }

void mouseclick( int button, int state, int x, int y ) {
    //
    // Если кнопку нажали( не отпустили )
    //
    if ( state == GLUT_DOWN ) 
        //
        // Смотрим, что это за кнопка
        //
        switch ( button ) {
            //
            // Левая кнопка. Тогда добавляем точку.
            //
            case GLUT_LEFT_BUTTON:
				zoom*=1.1f;
               
                break;
            //
            // Средняя кнопка. Циклически меняем цвет К -> З -> C.
            //
            //case GLUT_MIDDLE_BUTTON:
            //   
            //    break;
            //
            // Правая кнопка. Сброс.
            //
            case GLUT_RIGHT_BUTTON:
               zoom/=1.1f;
                break;
        }
	glutPostRedisplay();
}

void ChangeSize_ort(int w, int h)//ортогональная проекция
    {
 

		    GLfloat nRange = 100.0f;

    // Prevent a divide by zero
    if(h == 0)
        h = 1;

    // Set Viewport to window dimensions
    glViewport(0, 0, w, h);


    // Reset coordinate system
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // Establish clipping volume (left, right, bottom, top, near, far)
    if (w <= h) 
        glOrtho (-nRange, nRange, nRange*h/w, -nRange*h/w, -nRange*2.0f, nRange*2.0f);
    else 
        glOrtho (-nRange*w/h, nRange*w/h, nRange, -nRange, -nRange*2.0f, nRange*2.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }

void ChangeSize_par(int w, int h)// параллельная проекция
    {
    GLfloat fAspect;

    // предотвращение деления на ноль
    if(h == 0)
        h = 1;

    // 
    glViewport(0, 0, w, h);

    // Reset coordinate system
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    fAspect = (GLfloat)w / (GLfloat)h;
    gluPerspective(35.0f, fAspect, 1.0f, 1000.0f);
     
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -400.0f);
}

int main(int argc, char* argv[])
	{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize(800,600);
    glutCreateWindow("RGB Cube");
	glutReshapeFunc(ChangeSize_ort);
	glutMouseFunc(mouseclick);
	glutSpecialFunc(SpecialKeys);
	
	glutDisplayFunc(RenderScene);
	SetupRC();
	glutMainLoop();

	return 0;
	}
Можно как нибудь сделать переключение проекций при нажатии клавиш.
Сейчас у меня в мэйне только один раз вызывается функция с выбранной проекций и сцена отрисовывается только один раз в выбранной проекции.
sIllent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переключение активности RebOOter Общие вопросы Delphi 3 07.06.2011 18:08
Переключение картинок Olegavto JavaScript, Ajax 1 14.02.2011 11:27
Непонятки с DirectX (матрица поворота, камера, матрица проекции) ROD Общие вопросы C/C++ 2 17.09.2010 17:00
как избавиться от мерцания в OpenGL при перспективной проекции (двойная буферизация включена) anyx Свободное общение 0 01.02.2010 10:00
Функция определения размера проекции файла. nazavrik Общие вопросы C/C++ 0 17.10.2009 19:08