Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
134 / 7 / 8
Регистрация: 06.06.2012
Сообщений: 46

Нарисовать 1/8 сферы

23.09.2019, 15:49. Показов 6315. Ответов 30

Студворк — интернет-сервис помощи студентам
Добрый день, необходимо нарисовать 1/8 сферы, как это можно реализовать?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.09.2019, 15:49
Ответы с готовыми решениями:

Написать код, чтобы нарисовать сферы различных форм
Господа специалисты помогите написать код "Чайнику" в матлабе чтобы нарисовать сферы различных форм как на рис во вложении. ...

Найти высоту h, соответствующую положению равновесия шарика относительно сферы, и реакцию сферы N
Вот задача -- сфера радиусом R = 2 м равномерно вращается вокруг оси симметрии с частотой (n) 30 мин-1. Внутри сферы находится шарик массой...

Нарисовать флаг, нарисовать график y=ctg x Нарисовать анимацию
Дело таково у меня сейчас практика, где я очень не успиваю сделать все свои задания... Большая просьба кто готов помочь, пишите а кто...

30
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
23.09.2019, 16:10
Примерно так же, как полную сферу, но развертка по оси не 360, а 45 градусов - получится "ломтик". Либо по другой оси на 180, а 22,5 градуса - получится "шапка". Либо по обеим половина - получится выпуклый равносторонний прямоугольный треугольник. А можно просто отрисовывать только каждый восьмой полигон - получится "ситечко".
Если подробнее: средствами OpenGL можно нарисовать сферу по отдельным "поясам" изменяющегося диаметра и с разными z-координатами. Нарисуйте на бумажке разбиение плоского кольца на треугольники - будет нагляднее.
0
134 / 7 / 8
Регистрация: 06.06.2012
Сообщений: 46
23.09.2019, 16:13  [ТС]
А есть пример кода с регулировкой развертки?
0
9944 / 2945 / 496
Регистрация: 05.10.2013
Сообщений: 8,004
Записей в блоге: 240
24.09.2019, 00:53
niksn13, покажите ваш код, которые рисует треугольник в 3D пространстве. На самом деле, это чисто математическая задача. Если вы на бумаге можете решить эту задачу математически, то перенести в 3D не составит особого труда, если вы знаете, как рисовать объекты в 3D. Проблема может быть если у вас нет никакого опыта рисования с помощью OpenGL, тогда нужно решать сначала эту проблему. Основы OpenGL можно начать изучать здесь: https://habr.com/ru/post/310790/
1
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
24.09.2019, 09:46
Цитата Сообщение от niksn13 Посмотреть сообщение
А есть пример кода с регулировкой развертки?
Покажите сначала ваш код для полной сферы
1
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
24.09.2019, 10:09
1)Координаты треугольникам задавать через параметрическое уравнение сферы
“Параметрическое уравнение сферы с центром в точке”
https://ru.wikipedia.org/wiki/Сфера

2)можно нарисовать плоский треугольник из N треугольников, задать центр и радиус сферы затем нормализовать вектора из (центр сферы и точка треугольника) и умножить на радиус сферы, получим треугольники повторят кусок сферы.

3)можно воспользоваться что уже 2019 год и таких задач решали N раз и гуглить
half sphere opengl
https://stackoverflow.com/ques... -glusphere

4)можно схалтурить и нарисовать всю сферу отрезав кусок пирамидой видимости.
1
134 / 7 / 8
Регистрация: 06.06.2012
Сообщений: 46
24.09.2019, 13:07  [ТС]
Спасибо ребят, уже сделал, код кидать смысла не вижу, реализовал через старый добрый шарп, в связке с gl, привычнее
0
9944 / 2945 / 496
Регистрация: 05.10.2013
Сообщений: 8,004
Записей в блоге: 240
24.09.2019, 13:46
Цитата Сообщение от niksn13 Посмотреть сообщение
код кидать смысла не вижу, реализовал через старый добрый шарп, в связке с gl, привычнее
Есть смысл. Без кода данная тема будет бесполезная потеря времени. На OpenGL нет никакой разницы на каком языке написана программа. Я писал на Си, C++, Java и даже Python. А теперь пишу на C# и TypeScript (WebGL). Так что любой OpenGL-программист поймёт код на любом языке, даже если он не использовал этот язык никогда. Для С++ программиста не составит труда перевести OpenGL-код из C#, даже если он никогда не писал на C#. Может вам кто-то что-то подскажет полезного по коду. Лучше дополнительно архив с проектом прикрепить, чтобы легко было скачать и запустить в VS. С помощью чего делали связку C# с OpenGL? OpenTK, Tao или что-то другое?

Добавлено через 18 минут
Раз вы используете C#, то скину вам очень полезную информацию. Выше я кинул ссылку на знаменитые уроки LearnOpenGL в переводе на русский. Если перевод данных уроков на C#: LearnOpenTK. Правда, переведено только две главы и текст на английском, но если вы изучаете английский, то проблемы нет. Тогда далее вы сможете изучать оригинальные уроки: https://learnopengl.com/, переводя их на C#/OpenTK (на территории РФ этот сайт недоступен, нужно ставить VPN, например, плагин для браузеров Browsec)
1
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
24.09.2019, 14:07
Цитата Сообщение от niksn13 Посмотреть сообщение
Спасибо ребят, уже сделал
Интереса ради - какую именно четверть отрисовываете?
0
134 / 7 / 8
Регистрация: 06.06.2012
Сообщений: 46
24.09.2019, 14:54  [ТС]
Лучший ответ Сообщение было отмечено 8Observer8 как решение

Решение

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Интереса ради - какую именно четверть отрисовываете?
Отрисовываю "ломтик", но не имеет значения, ограничения цикла меняются и отрисовывается любая часть
Цитата Сообщение от 8Observer8 Посмотреть сообщение
С помощью чего делали связку C# с OpenGL?
Изменил готовый проект домика, под свои нужды, архив прикрепил



Если нужно само построение:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  for (alpha = 0.0; alpha < GL_PI; alpha += PI / gradation)
            {
 
                gl.Begin(OpenGL.GL_TRIANGLES);
                for (beta = 0.0; beta < (2.01 * GL_PI)/8; beta += PI / gradation)    // деление на восемь позволяет нарисовать 1/8
                {
                    x = (radius * Math.Cos(beta) * Math.Sin(alpha))/20;
                    y = (radius * Math.Sin(beta) * Math.Sin(alpha)) / 20;
                    z = (radius * Math.Cos(alpha)) / 20;
                    gl.Color(0, 0, 0);
                    gl.Vertex(x, y, z);
                    x = (radius * Math.Cos(beta) * Math.Sin(alpha + PI / gradation) )/ 20;
                    y = (radius * Math.Sin(beta) * Math.Sin(alpha + PI / gradation) )/ 20;
                    z = (radius * Math.Cos(alpha + PI / gradation)) / 20;
                    gl.Vertex(x, y, z);
                }
                gl.End();
            }
Вложения
Тип файла: rar 8 сферы.rar (1.36 Мб, 24 просмотров)
1
134 / 7 / 8
Регистрация: 06.06.2012
Сообщений: 46
24.09.2019, 15:05  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Раз вы используете C#, то скину вам очень полезную информацию
Спасибо, однако графикой в основном не занимаюсь, материал интересный, можно изучить, однако пока на это не хватает времени, много других забот и других задач
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
24.09.2019, 16:14
Цитата Сообщение от niksn13 Посмотреть сообщение
gl.Color(0, 0, 0);
зачем оно в цикле?
Цитата Сообщение от niksn13 Посмотреть сообщение
x = (radius * Math.Cos(beta) * Math.Sin(alpha))/20;
y = (radius * Math.Sin(beta) * Math.Sin(alpha)) / 20;
z = (radius * Math.Cos(alpha)) / 20;
Вместо деления на 20 каждой координаты лучше ввести константу, на которую умножать координаты:
C
1
2
3
x = (radius * Math.Cos(beta) * Math.Sin(alpha)) * scale;
y = (radius * Math.Sin(beta) * Math.Sin(alpha)) * scale;
z = (radius * Math.Cos(alpha)) * scale;
А еще лучше - glScale
.
Не совсем понятно зачем вы во внутреннем цикле считаете две точки, сдвинутые по (x,y), когда можно рисовать отрезками радиуса:
C
1
2
3
4
5
6
x = (radius * Math.Cos(beta) * Math.Sin(alpha)) * scale;
y = (radius * Math.Sin(beta) * Math.Sin(alpha)) * scale;
z = (radius * Math.Cos(alpha)) * scale;
gl.Vertex(x, y, z);
z = (radius * Math.Cos(alpha + PI / gradation)) * scale;
gl.Vertex(x, y, z);
0
134 / 7 / 8
Регистрация: 06.06.2012
Сообщений: 46
24.09.2019, 16:18  [ТС]
COKPOWEHEU, как говорится, работает, не трогай��



Даже не смею предположить что мой код, будет хотя бы смахивать на хороший, код написанный в торопях на коленке в принципе не может быть таковым
0
9944 / 2945 / 496
Регистрация: 05.10.2013
Сообщений: 8,004
Записей в блоге: 240
24.09.2019, 22:05
А я читернул. Создал стандартную сферу Blender 2.8, обрезал всё лишнее (как Микеланджело писал), экспортировал 1/8 в Collada (.dae) формат и загрузил в программу на OpenGL. Прикрепил для сравнения ваш и мой результат.

Мне очень понравилось, как вы быстро решили задачу. Далеко не все могут довести начатое дело до конца. Первый раз нужно делать, как получится. Главное - быстро и до конца. А потом уже можно рефакторить по мере получения навыков и новых знаний. Надеюсь, вы не бросите изучать геометрию и линейную алгебру через практику на OpenGL.
Миниатюры
Нарисовать 1/8 сферы   Нарисовать 1/8 сферы  
0
134 / 7 / 8
Регистрация: 06.06.2012
Сообщений: 46
24.09.2019, 22:39  [ТС]
8Observer8, интересный подход, но ещё раз упомяну свой ничтожный опыт в графике ( думаю пока), есть куда расти и развиваться, алгоритм совсем не проблема, просто с OpenGL опыта маловато, вот и решил узнать совета более опытных, по реализации)
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
25.09.2019, 09:49
Цитата Сообщение от 8Observer8 Посмотреть сообщение
А я читернул
Вы-то знаете недостатки своего метода, но ТСу пояснить стоит. Метод 8Observer8'а не универсален: если захочется сделать другую часть сферы, или изменить количество полигонов, или размер - придется делать новую модель и заново ее экспортировать. И объем: код генерации куска сферы "на лету" значительно меньше, чем код импорта трехмерной модели плюс сама модель.
То есть этот метод хорош для сложных моделей, которые с ходу не опишешь формулой, но вот для простых лучше процедурная генерация.
0
9944 / 2945 / 496
Регистрация: 05.10.2013
Сообщений: 8,004
Записей в блоге: 240
25.09.2019, 12:47
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И объем: код генерации куска сферы "на лету" значительно меньше, чем код импорта трехмерной модели плюс сама модель.
Если с нуля писать, то да, чтобы повторить мой код, времени у TC уйдёт значительно больше, потому что ему ещё нужно будет освоить формат Collada, работу с XML в C#. Но у меня уже был пример, в котором я изменил только одну строку - путь к модели. Я не писал никакого кода для решения задачи. Я лишь открыл Blender 2.8 (осваиваю новый Blender), отсёк в этом редакторе лишнее. По объёму работы я сделал значительно меньше усилий в совокупности. Есть такие модели, которые невозможно сгененировать на лету, либо это будет очень сложно и займёт много времени. К тому же Collada позволяет хранить скелетную анимацию, что может помочь решать определённые задачи в будущем. Я думаю, что TC сам понимает разницу между этими двумя подходами и когда какой выгоднее применять. Я применил этот метод потому что у меня была универсальная заготовка, которая может отображать модели, вращать камеру с помощью мыши и приближать/отдалять объекты колёсиком. В рамках поставленных условий не говориться, что нужно менять что-то. Но с другой стороны я, конечно, понимаю, что этот метод не подходит TC, потому что цель поставлена преподавателем и она математическая, то есть подразумевает использование тригонометрии и только поэтому моё решение не подходит TC.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
25.09.2019, 15:05
Цитата Сообщение от 8Observer8 Посмотреть сообщение
времени у TC уйдёт значительно больше, потому что ему ещё нужно будет освоить формат Collada, работу с XML в C#. Но у меня уже был пример
Я писал про объем, а не про время его написания. Даже если вы вхардкодите все вершины в массив, он займет больше места, чем код для генерации "на лету".
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Есть такие модели, которые невозможно сгененировать на лету, либо это будет очень сложно и займёт много времени.
Именно про это я написал:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
тот метод хорош для сложных моделей, которые с ходу не опишешь формулой, но вот для простых лучше процедурная генерация.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Но с другой стороны я, конечно, понимаю
Решить исходную задачу - хорошо. Научить ТСа решать подобные задачи - отлично. Но и предложить нестандартные решения для общего расширения кругозора (в том числе, своего) тоже прекрасно. Даже если ТС не воспользуется вашим решением, он будет знать, что такое возможно.
1
9944 / 2945 / 496
Регистрация: 05.10.2013
Сообщений: 8,004
Записей в блоге: 240
25.09.2019, 17:23
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Я писал про объем, а не про время его написания. Даже если вы вхардкодите все вершины в массив, он займет больше места, чем код для генерации "на лету".
Отличия в весе файлов могут быть пренебрежимо малы, а могут быть существенными. Разработчик должен отлично владеть и тем и другим способам, чтобы во время выбора путей решения задачи можно было чем-то пренебречь, в пользу каких-то более важных и более приоритетных вещей.
0
134 / 7 / 8
Регистрация: 06.06.2012
Сообщений: 46
26.09.2019, 09:28  [ТС]
Реализация на плюсах с хорошей основой под OpenGl, так же исправил некоторые замечания COKPOWEHEU (Построение отрезками радиуса делать не стал)
Вложения
Тип файла: rar сфера.rar (8.84 Мб, 14 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.09.2019, 09:28
Помогаю со студенческими работами здесь

Сферы применения с++
Всем привет) Подскажите пожалуйста где можно применять c++?Веб?Низкоуровневые задачи? Заранее спасиб)

Визуализация сферы
Здравствуйте, пишу программу под Android на OpenGL ES2. Нужно создать сферу, чтобы производить в дальнейшем с ней действия. Я подумал и...

Создание 3D сферы
Здравствуйте, Меня интересует простенький пример создания 3D сферы в wpf. В интернете примеров мало, а те, что есть представлены в...

Движение сферы
саму сферы я создала на OpenGl, нашла инфу, как двигатся вокруг себя (т е вокруг своей оси) а вот как заставить ее двигаться ...

Рисование сферы
подскажите фунцию рисования сферы. вот пример из книги (супер книга опенгл) я попытался взять отдельную часть кода. void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru