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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2017, 23:27   #1
Poltish
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 35
Радость Проблема с началом осей координат.

Здравствуйте, уважаемые форумчане!
Появилась тривиальная, как мне казалось, задача:
Отобразить средствами glut (к сожалению именно и только его, другое использовать не разрешили) некоторые фигуры. В частности - квадраты. Затем "назначить" клавишу, по нажатию на которую сей квадрат будет крутиться вокруг своей оси. Затем научиться этот квадрат увеличивать в масштабах и на десерт научиться накладывать на него текстуры.

Погуглив, много погуглив, я понял, как отображать фигуры, как биндить на различные действия клавиши. Получилось средствами glaux отобразить на моём квадрате изображение размером 512 на 512.

Но задача стоит таким образом, что фигур должно быть много. Иначе говоря - кликаешь на форму приложения, и в центре твоего клика - центр фигуры. Появляется квадрат. Кликаешь ещё раз чуть в другом месте - ещё один. Для одной фигуры (первого квадрата) я реализовал это так: все фигуры я задаю как бы в точке 0;0 - в нижнем левом углу. Затем в функции отрисовки применяю функцию glTranslatef, перенося начало координат в центр квадрата. Параметрами функции служит, как раз, координаты, в которые я кликнул.

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

Проблема такая:

Первая фигуры - отлично, всё работает. Появляется по клику в том месте, куда я нажал. Даже вращается и увеличивается. Вторая же фигуры - появляется как бы относительно первой. Т.е. начало координат я перенёс, и вторая фигуры уже относительно этого нового начала.
Я подумал, что правильным будет перед отрисовкой очередной фигуры перенести её начало координат в нужное мне место, после чего перенести его назад, в точку 0;0. Но это не сработало.
Выглядит это таким образом:

1.PNG

Это "хорошая" фигура, центр её там - куда я кликнул. Теперь кликаю пикселях в 100 от неё вправо:
2.PNG

Фигура нарисовалась в точке 0;0, а затем перенеслась не относительно нижнего левого угла, а относительно первого квадрата.

Код сохранения (стоит на обработчике мыши):
Код:
/* новая точка по левому клику */
	if (button == GLUT_LEFT_BUTTON) {

		vector<type_point> buffer;
		Points.push_back(buffer); //вектор для хранения координат. В структуре type_point 2 координаты - по x и по y
		
		/*инициализация цветового буффера для первого слоя*/

		/*определяем центр фигуры*/
		centerX.push_back(x); // глобальные вектора
		centerY.push_back(512- y); //512 - размер создаваемого окна

		current++;


		int leftTopX = 0 - 100/ 2,
			leftTopY = 0 + 100/ 2,
			rightTopX = 0 + 100/ 2,
			rightTopY = 0 + 100/ 2,
			leftBottomX = 0 - 100/ 2,
			leftBottomY = 0 - 100/ 2,
			rightBottomX = 0 + 100/ 2,
			rightBottomY = 0 - 100/ 2;

		type_point p(leftTopX, leftTopY);
		Points[current].push_back(p);

		p.x = rightTopX;
		p.y = rightTopY;
		Points[current].push_back(p);

		p.x = rightBottomX;
		p.y = rightBottomY;
		Points[current].push_back(p);

		p.x = leftBottomX;
		p.y = leftBottomY;
		Points[current].push_back(p);
		
	}
И код отрисовки:

Код:
/* Функция вывода на экран */
void Display(void) {

	glClearColor(0.3, 0.5, 0.5, 1);    /*задаём цвет заднего фона*/
	glClear(GL_COLOR_BUFFER_BIT);    /*очищаем окно до цвета фона*/
	glLoadIdentity();

	for (int i = 0; i < Points.size(); i++){
		glTranslatef((GLfloat) centerX[i], (GLfloat) centerY[i], (GLfloat)0.0); /*переносим центр фигуры в точку centerX, centerY*/
		glRotatef(rquad, 0.0f, 0.0f, 1.0f);        // Вращение по оси X в точке centerX, centerY

		glScalef((GLfloat)scale, (GLfloat)scale, 1.0f);

		glBegin(GL_QUADS);
		glColor3ub(Colors[i][0], Colors[i][1], Colors[i][2]);
		for (int j = 0; j < Points[i].size(); j++) {
			glVertex2i(Points[i][j].x, Points[i][j].y);
		}
		glEnd();
		glFinish();
	}

	glFinish();

}
Пробовал в конце каждой итерации в главном цикле, как уже говорил, перенести с помощью функции glTranslatef ось в точки 0;0;0. Но ничего не получилось. Очень надеюсь на чью-нибудь помочь.
Poltish вне форума Ответить с цитированием
Старый 06.05.2017, 06:35   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

https://solarianprogrammer.com/2013/...on-view-model/
p51x вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение графика, расположение осей координат OmegaBerkut Помощь студентам 1 12.11.2015 19:10
Поздравляю всех с началом лета Вадим Мошев Свободное общение 22 03.06.2013 21:26
Паскаль, графика. Вращение октаэдра вокруг осей координат. San-ch Паскаль, Turbo Pascal, PascalABC.NET 1 28.02.2011 04:25
Построение осей координат lordseko Помощь студентам 4 21.12.2010 06:12
слова с одинаковым началом и концом shelest Помощь студентам 2 28.02.2010 15:07