LINUX.ORG.RU

Наложение текстуры на окружность заданной по формулам математики

 , , , ,


0

2

Есть вот такой код, текстура накладывается на 6ю часть окружности(то есть угол в 60 градусов) - но не работает - не пойму в чем проблема

glBegin(GL_POLYGON);

		//glTexCoord2f(1.0f, 0.0f);
		//glVertex3f(xleft, yup, 0.0f);
		int n = 10;
		for (int i = 0; i < n; i++)
		{
			glTexCoord2f(1.0f, i / 10.0f);
			glVertex3f(xleft, 0.6f * sin(90.0 - 60.0 / n * i), 0.6f * cos(90.0 - 60.0 / n * i));
		}
		//glTexCoord2f(1.0f, 1.0f);
		//glVertex3f(xleft, ydown, .6f);

		//glTexCoord2f(0.0f, 1.0f);
		//glVertex3f(xright, ydown, .6f);

		for (int i = 0; i < n; i++)
		{
			glTexCoord2f(0.0f, 1.0f - i / 10.0f);
			glVertex3f(xright, 0.6f * sin(30.0 + 60.0 / n * i), 0.6f * cos(30.0 + 60.0 / n * i));
			if (b)
				std::cout << 0.6f * sin(30.0 + 60.0 / n * i) << " " << 0.6f * cos(30.0 + 60.0 / n * i) << std::endl;
		}
		b = false;
		//glTexCoord2f(0.0f, 0.0f);
		//glVertex3f(xright, yup, 0.0f);

		glEnd();

синусов и косинусов не бойтесь - это параметрическое уравнение окружности X=R*cos(fi), Y=R*sin(fi) - где R радиус, X - координата по иксу, Y - координата по игреку. Я частями накладываю текстуру по кусочкам для этого в формуле деления и умножения на части



Последнее исправление: bad_master (всего исправлений: 5)

А ты в курсе, что так уже не делают? Это старый OpenGL подход. Извини, что не ответ на вопрос.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от rumgot

другой подход требует лишних телодвижений

bad_master
() автор топика

Мёртвый код, нормальные пацаны шейдеры бахают, а геометрию рисуют в том же блендере с последующей подгрузкой 3d моделек, хотябы из obj формата ну и mtl для материалов. И у них твои проблемы даже в теории не появляются. ЕМНИП чего-то ты не вызываешь из того что надо, но с ходу не вспомню, давно на glBegin-ах ничего не видел.

peregrine ★★★★★
()
  1. В функциях синусов и косинусов, по моему, указывают угол в радианах, а не в градусах.

РАДИАН(ГРАДУС) = ГРАДУС * (ПИ / 180);

  1. glVertex3f - у тебя ортогональная проекция? Если да, зачем координаты вершины по оси Y записывать в глубину? Или там как-то по особому отображается?

Окружность вообще рисуется при таких условиях, хотя бы без текстуры?

Прошу простить, если мои замечания пошли по зря.

todnaz_t
()
Ответ на: комментарий от todnaz_t

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

Да похоже на то - хотя странно что нет градусов.

Если да, зачем координаты вершины по оси Y записывать в глубину? Или там как-то по особому отображается?

Отображаться должно вот как на картинке(правда вид сбоку и тут угловатый цилиндр-окружность целиком, а кода лишь на одну грань выделена цветом) https://ibb.co/bNTvbLD

bad_master
() автор топика
Ответ на: комментарий от static_lab

я уже сделал, там надо умножить на 0.0175 - но в 90 градусов выдает -0.002 по z координате из-за этого получается что картинку по диагонали режет https://ibb.co/r2QK3jF - взял round и срезал числа после 2 знаков запятой, а потом сравнил с -0 и поменял на 0

                glBegin(GL_POLYGON);

		int n = 10;
		for (int i = 0; i < n+1; i++)
		{
			glTexCoord2d(1.0f, (float)i / n);
			glVertex3d(xleft, (0.68f * sin((90.0 - 60.0 / n * i) *0.0175)), (-0==round(0.68f * cos((90.0 - 60.0 / n * i) * 0.0175)*100)/100)?0: round(0.68f * cos((90.0 - 60.0 / n * i) * 0.0175) * 100) / 100);
			if (b)
				std::cout << (float)i / n<<" "<< (0.68f * sin((90.0 - 60.0 / n * i) * 0.0175)) << " " << round(0.68f * cos((90.0 - 60.0 / n * i) * 0.0175) * 100) / 100<< std::endl;
		}
		if (b)
			std::cout << "------------" << std::endl;

		for (int i = 0; i < n+1; i++)
		{
			glTexCoord2d(0.0f, 1.0f - (float)i / n);
			glVertex3d(xright, (0.68f * sin((30.0 + 60.0 / n * i)*0.0175)), (-0 == round(0.68f * cos((30.0 + 60.0 / n * i) * 0.0175) * 100) / 100) ? 0 : round(0.68f * cos((30.0 + 60.0 / n * i) * 0.0175) * 100) / 100);
			if (b)
				std::cout << 1.0f - (float)i / n<<" "<< (0.68f * sin((30.0 + 60.0 / n * i) * 0.0175)) << " " << round(0.68f * cos((30.0 + 60.0 / n * i) * 0.0175) * 100) / 100<< std::endl;
		}
		b = false;

		glEnd();
Теперь другая проблема - картинка искривлена https://ibb.co/0ckc18k

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 6)
Ответ на: комментарий от bad_master

Ты хочешь сделать слот-машину?

Очевидно, текстуры имеют другое соотношение длин сторон, чем сектор барабана.

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

я этими синусами и косинусами делаю приближение к кругу а картинки кривые становятся https://ibb.co/Dr7FMVh - ну это схематично

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 2)
Ответ на: комментарий от bad_master

Какие ты текстурные координаты вершинам задал, так у тебя текстура и ляжет. Никто за тебя соблюдать аспект на картинках не будет. Всё сам.

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

да сделал - пришлось частями текстуры и вершин маленькими квадратами. https://ibb.co/ZNDhHY3 как я понял когда рисовал сначала левая часть - потом правая, то похоже библиотека заменяла это на два треугольника /\ изогнутых

bad_master
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.