|
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 8
|
|
Трехмерная графика30.10.2019, 23:37. Показов 13146. Ответов 47
Метки нет (Все метки)
Как понятно из названия хочется с помощью языков этих в ручную написать 3 мерное пространство, думал делать через 3 мерный массив, но подумав получше понял что идея плохая, кто подскажет как с нуля сделать 3 мерное пространство ?
0
|
|
| 30.10.2019, 23:37 | |
|
Ответы с готовыми решениями:
47
Трехмерная точка Трехмерная матрица через вложенные вектора трехмерная графика |
| 01.11.2019, 21:05 | |||
|
Я не в курсе, какие современные книги есть по компьютерной графике, которые просто переводятся на шейдеры и имеют примеры на шейдерах, но вот несколько на английском, которые я изучаю:
Добавлено через 11 минут
1
|
|||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,916
|
||||
| 01.11.2019, 21:12 | ||||
|
Но и у других есть нишевые преимущества: OpenGL1 проще для старта. Он, хоть и магически, но делает то, что от него хотят без написания нескольких отдельных программ (одна для проца и по одной для шейдеров). Тупо говоришь ему "нарисуй треугольник по этим точкам" и он рисует. Для примитивной графики этого достаточно, но если хочется всерьез заниматься графикой - естественно, нужно быстренько уходить на тот же OGL2. Ручная растеризация хороша для понимания всей этой машинерии без магии вообще. Плюс работает даже когда видеокарты нет в принципе. Но и воспользоваться ей не удастся, так что поигрались - и на шейдерную библиотеку.
0
|
||||
| 01.11.2019, 21:36 | ||
|
А есть затенения, это то что даёт объекту трёхмерность, когда, допустим, у кубика одни грани светлее, а другие темнее. С помощью математики это делается довольно просто. Известно положение источника света, известна нормаль в точке, а так как фрагментный шейдер выполняется для каждого фрагмента, то цвет фрагмента определятся через умножение цвета на скалярное произведение нормали, на вектор направления на источник света. Если нормаль смотрит на прямо на источник, то есть между нормалью и направлением на источник 0 градусов, то скалярное произведение даёт 1, и получается максимальный множитель. Номально единичный вектор, а направление на источник, тоже нужно сделать единичным ветором. Получится, что остаётся один множитель - Cos. Без затенения белый кубик выглядит так и не выглядит, как 3D объект: https://jsfiddle.net/8Observer8/pespackq/ А вот если добавить затенение, то кубик выглядит, как 3D объект: https://jsfiddle.net/8Observer8/4jchxo84/ Если писать свою графическую 3D библиотеку, то добавить затенение, скорее всего, будет очень сложно, да и не перспективно. Лучше сделать на шейдерном.
0
|
||
| 01.11.2019, 22:18 | ||||
|
Добавлено через 8 минут Добавлено через 28 минут
0
|
||||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,916
|
||||||||
| 02.11.2019, 14:49 | ||||||||
Разве что из интереса или на старших моделях, приближающихся к телефонным или компьютерным процессорам, и то вряд ли.
0
|
||||||||
| 02.11.2019, 16:08 | ||||||||
|
0
|
||||||||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,916
|
||||||||||
| 02.11.2019, 23:52 | ||||||||||
![]() Разобраться, как на самом низком уровне работает вся эта трехмерка и хватит ли у меня навыков уложиться по скорости и объему. Своему подходу я следую только потому что это интересно, но не потому что эффективно. Более того, если кто-то стремится не к процессу, а к результату, я буду агитировать за максимально высокоуровневые библиотеки. Но вот если такой цели нет, можно попробовать разные подходы и смотреть что понравится больше.И тот же OGL1 сгодится чтобы "потыкать трехмерку палочкой", когда нет требования эффективности. Примерно так же графику можно выводить средствами SDL или Qt, разве что в последних выводить 3D сложнее. Я там не был как раз по той причине, что практика 3D сейчас не особо интересует. А C# не интересовал никогда. Вот пообщаться на философские темы - сколько угодно. Если бы ТС или Folian высказали конкретную цель: написать игру, я бы сразу отослал к вам, как более сведущему в этом вопросе. Но ситуация-то другая: Folian решил написать чисто софтовый движок в консоли. Все прекрасно понимают, что практическая ценность у такого велосипеда нулевая, но велосипед на то и велосипед чтобы извлекать учебную пользу. Смею надеяться, что в софтовых реализациях у меня опыта побольше, поэтому я указал на типичные проблемы и подходы - [U]для данной задачи/U].
0
|
||||||||||
| 03.11.2019, 03:10 | |||||||||||
|
0
|
|||||||||||
| 03.11.2019, 03:11 | ||
|
0
|
||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,916
|
||||||
| 03.11.2019, 11:44 | ||||||
|
Ну и, конечно, вызывают сомнения способности консоли эту красоту отобразить. Учитывая разрешение в сотню на сотню точек и два десятка градаций яркости. Хотя разработчикам aalib / caca вроде бы что-то удается. То есть все это скорее красивости, чем функционал. Когда они есть это хорошо, но когда нет - не смертельно. И еще раз усомнюсь в источнике моделей - кто их рисовать-то будет и стоит ли оно того? Вот и используют вместо этого "магию", что-то в роде "а теперь скажем компьютеру нарисовать треугольник - glBegin(GL_TRIANGLES)". "а теперь повернем его на какой-то угол - glRotatef(...)". Если повезет - дойдут до ручного расчета матриц, ведь в OGL1 тоже можно умножить текущую матрицу на явно заданную пользователем. То есть для отправной точки "трехмерная графика это не так сложно" оно сойдет, а дальше уже можно смело говорить "а теперь забываем OGL1 как устаревший и переходим к шейдерам". И мне кажется, что уже имея общее представление о функционировании трехмерки эту ступеньку будет преодолеть проще. Но это все в хорошем случае если преподаватель действительно хочет научить, а студенты - научиться именно данному предмету, а бывает это далеко не всегда. И вот в таком случае OGL1 позволит достичь хоть какого-то результата.
0
|
||||||
| 03.11.2019, 16:19 | ||||||||||||||
|
Добавлено через 1 час 47 минут Добавлено через 14 минут Добавлено через 26 минут Я вспомнил, что трёхмерная графика используется:
Я считаю, что 3D графика не разрывна с большим желание и стремлением изобразить что-то в 3D, а значит, что неразрывно связано с 3D редакторами, например, Blender, который бесплатный и легковесный. Должно быть внутренняя сильная потребность развиваться в 3D конструировании, и потребность в изучении математики, которая стоит за всеми состояниями и процессами.
0
|
||||||||||||||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,916
|
||||||||||||
| 03.11.2019, 18:06 | ||||||||||||
|
Вот такое сойдет в качестве освещения от направленного источника? С текстурами и даже моделями закрашивания не заморачивался - цвет грани рассчитывается по одной вершине. Теоретически, цвет возможно интерполировать между вершинами, но мне было лень, да и памяти в контроллере всего 20 кБ, ее и на видеобуфер-то не хватает (320х240 точек, по 16 бит на цвет, плюс задний буфер плюс 16 бит буфер глубины получается 450 кБ), а ведь еще сами вершины хранить надо и полурассчитанные данные. Если добавить еще текстуры и интерполяцию цветов контроллер совсем загнется. А для компьютера я ведь уже давал название книжки, где авторы делают ровно то же самое, но под DOS. Вместе с текстурами, освещением и всем остальным. Есть ведь и другие, не менее интересные занятия: те же контроллеры (сейчас пилю полу-медицинский прибор определения пульса, он даже что-то определяет несмотря на мои усилия), механика, интерпретатор Lua, еще Qt или gtk палочкой потыкать надо (не на winapi же гуй делать, правда!). Не говоря об основной работе. А вот это баловство с ручной растеризацией это именно баловство. Ну и учтите, что для матричного OGL2 все-таки нужны знания о матрицах, векторах и аффинных преобразованиях. А процедурным OGL1 может пользоваться школьник класса восьмого. И это тоже существенный плюс, так как понятия матриц и векторов там таки даются, хотя и как опциональные, но это повысит его заинтересованность в линейной алгебре. Где-то у меня валяется попытка реализации игрового GUI на SDL2 + OpenGL1. Как и положено первому велосипеду - скрипит и падает, куда ж без этого. Но формочки, кнопочки, поля ввода, ползунок прокрутки и тому подобную мелочь показывает. Правда делал уже довольно давно, сейчас, конечно, делал бы по-другому, причем начал бы с прикручивания туда Lua для обработки событий. Не поймите неправильно: личное мнение это личное мнение, я стараюсь его никому не навязывать. Вы же не будете составлять чертежи на телефоне, правда? Или ту же скелетную анимацию. Телефон хорошо годится для демонстрации контента "на выезде", но не тогда, когда рядом есть компьютер. И при производстве контента телефон также проигрывает.
0
|
||||||||||||
|
2 / 1 / 1
Регистрация: 05.04.2019
Сообщений: 14
|
|
| 03.11.2019, 18:41 | |
|
Дайте гайд, куда копипастить код чтоб у себя проверить, и выше ncur_doom.rar закидывать
VS 2017
0
|
|
| 03.11.2019, 19:38 | ||||||||||||
|
0
|
||||||||||||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,916
|
||||||
| 03.11.2019, 20:40 | ||||||
|
Хватит уже рекламы webGL. Ну позволяет оно выводить трехмерку на телефоне, ну и что. Вы вцепились в какую-то микроскопичесую фичу и преподносите ее как будто ключевую.
0
|
||||||
| 03.11.2019, 21:13 | ||||||
|
0
|
||||||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,916
|
||||
| 03.11.2019, 23:45 | ||||
|
Именно в той прошивке не делал, но не вижу принципиальной проблемы: вместо константного вектора берем вектор от вершины к источнику. Это делается в gl.c: в функции glDrawTriangleV вместо вектора light считаем тот, который нужен. Правда, конечно, добавится тяжелая функция взятия обратного корня, но ведь и ее можно оптимизировать одним хитрым хаком. Много ли внимания уделяется растеризации примитивов, конкретной реализации буфера глубины и его разрядности? Между прочим, даже в этой теме Folian применил совсем другой подход, не завязанный на матрицы - и в конкретном применении он эффективнее.
0
|
||||
| 06.11.2019, 13:21 | ||||||||||||
|
Геометрия куба:
Ось Y направлена вверх. Ось Z направлена на нас. Пусть центр куба находится в центре координат, а сторона куба равна 1 метру. Координаты вершин: v0: (0.5, 0.5, 0.5) v1: (-0.5, 0.5, 0.5) v2: (-0.5, -0.5, 0.5) и т.д. Переносим куб в программу, создав одномерный массив:
0
|
||||||||||||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,916
|
||
| 06.11.2019, 14:20 | ||
|
А если хотите потом вывести как общий одномерный массив в OGL или еще куда, так явное приведение типов никто не отменял. Более того, если мне не изменяет память, в соответствующих функциях задается расстояние между элементами, и туда удобно подставить sizeof(Point). А потом спокойно добавлять в тот же вектор нормали, текстурные координаты и прочее. В случае же одномерного массива, все смещения придется считать вручную, да еще и не в одном месте.
0
|
||
| 06.11.2019, 15:10 | |||||||||
|
MaksimK1, вам задание. Перевести описанную мною идею на Си, C++ или на тот язык, который вам нравится. Я сделал пример на C#. Может быть вам он поможет сейчас или в будущем:
0
|
|||||||||
| 06.11.2019, 15:10 | |
|
Помогаю со студенческими работами здесь
40
Трёхмерная графика Трехмерная графика Трехмерная графика трёхмерная графика Трехмерная графика surf из двухмерной матрицы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|