Объясните про 3д куб

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 411
Зарегистрирован: 13.10.2013 (Вс) 14:05

Объясните про 3д куб

Сообщение Don Leno » 09.04.2022 (Сб) 21:47

Всем салют!
Давно меня здесь не было))
Итак, я к вам с вопросом по 3д графике. Работаю в Blitz3d и создаю простейшую модель в 3д редакторе MilkShape3d. Суть в том что я создал куб и наложил текстуру на него, а затем все это успешно отобразил в Blitz3d. Все хорошо! Но мне понадобилось создать лишь одну грань куба, либо две грани куба. И не стал создавать вручную новый куб, а просто используя вертексы уже сущесвующего создал новый куб. Сначало мне хватило лишь 8 вертексов для создания куба. После наложения текстуры я понял что UV координаты не правильны (текстура не наложилась нормально). Поэтому добавил еще скопировал еще 8 вертексов от загруженого куба, и успешно пересоздал все полигоны по вертексам с правильными UV координатами! Все просто замечательно, НО! в загруженом кубе из 3д редактора всего 20 вертексов, а в моем только 16! ЧЯДНТ?!
Мне кажется что я где то что-то сделал неправильно, раз потерял еще 4 вертекса при постройке своего куба вручную. Но Blitz3d показывает что в моем кубе 20 вертексов?!
Моя цель такова что при необходимости не отображать весь куб, а лишь те грани что видимы нам сейчас. Но как мне создать грани отдельно от куба с той же текстурой? Тем более в проекте может быть 100 кубов и нужна функция которая будет отображать лишь те грани кубов которые видимы сейчас. К сожалению, в Blitz3d не предусмотрена функция удаления вертекса или треугольника, лишь удаление всей 3д модели!
Мне не нужен готовый код, тем более я пишу не на VB, а в другом редакторе. Мне нужна теория как и что делать!

У меня есть один вариант, но это морока в 3д редакторе: создать все грани куба и загружать их при необходимости.
У вас нет доступа для просмотра вложений в этом сообщении.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4089
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Объясните про 3д куб

Сообщение Mikle » 09.04.2022 (Сб) 23:04

В кубе должно быть 24 вертекса, пока нет нормалей, только текстурные координаты, можно исхитриться, и сделать меньше, но это не имеет смысла. С нормалями уже не выйдет сэкономить, а без нормалей не будет света.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 411
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Объясните про 3д куб

Сообщение Don Leno » 10.04.2022 (Вс) 0:08

Спасибо Mikle, что откликнулся!
Вот незадача, а в созданой модели всего 20 вертексов, может я снова где то недосчитал, хотя функции стандартные считывают от Blitz3d то не моя вина. Лан так по сути мне нужно урезать количество отображаемых треугольников которые не видимы камере, чтобы увеличить производительность. Это я только с кубом эксперемнтирую, а если взять модель уже посложнее то я уж не знаю как. Просто я не нашел функции удаления треугольников. Можно как вариант пересоздавать модель но без лишних треугольников. Но ума не приложу как это делается.
Кстати о нормалях. Я не особо знаю что это. Но как ты объясняешь они нужны для освещения. Так вот там есть функция
UpdateNormals (mesh)
Перерасчитывает все нормали в геометрии. Это необходимо для нормального освещения созданных по-вертексно объектов без использования 'VertexNormals' команды для каждого.

Это из справки. А также
VertexNormal surface,index,nx#,ny#,nz#
Устанавливает нормаль к существующему вертексу.

Так что если пересоздать куб, то можно дать команду на перерасчет нормалей и все будет ок!, я надеюсь))
Но может у тебя есть какие нибудь идеи (пусть не программные реализации) как уменьшить кол-во полигонов, то буду рад услышать.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4089
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Объясните про 3д куб

Сообщение Mikle » 10.04.2022 (Вс) 8:25

Никогда не работал с Blitz3d и другими движками, но все они под капотом имеют либо Direct3D, либо OpenGL (ещё Vulkan). Правила для всех общие. Я долго пытался осмыслить написанное в первом сообщении, но так и не смог. Вот это к чему:
мне понадобилось создать лишь одну грань куба, либо две грани куба

Ты каждый раз смотришь, сколько граней куба видно, и по результату создаёшь новый куб без "лишнего"?

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 411
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Объясните про 3д куб

Сообщение Don Leno » 10.04.2022 (Вс) 11:19

Нет я определяю их грани не повидимости, а по массиву. К сожалению, вышеприведеный код не имеет этого массива. Там лишь построение только одного куба из готовых вертексов.
Итак, к примеру возьмем массив 16*16*16 кубов. В массиве будет храниться есть ли куб или нет. Берем первый элемент массива и если у него есть сосед, то ту грань рисовать не надо (Смотреть рисунок ниже)
Я же не поленился создать в 3д редакторе 6 граней куба и написал функцию, которая загружает ту грань которая видима нам сейчас. Ниже на картинке код, хоть и не полностью
У вас нет доступа для просмотра вложений в этом сообщении.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 411
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Объясните про 3д куб

Сообщение Don Leno » 10.04.2022 (Вс) 11:53

Теперь немного разберу код чтобы было понятнее
Код: Выделить всё
         dwn#=chunk(x#,y#,z#-1)
         up#=chunk(x#,y#,z#+1)
         lft#=chunk(x#-1,y#,z#)
         rht#=chunk(x#+1,y#,z#)
         frn#=chunk(x#,y#+1,z#)
         bck#=chunk(x#,y#-1,z#)

chunk(x,y,z) - это массив в котором содержатся значение "есть ли куб, али нет"
dwn#=chunk(x#,y#,z#-1) - проверяем нижнего соседа на наличие. Если нет то переменая dwn=0. И так для каждой грани
значение переменных:
dwn#=down нижнияя часть куба
up#=up верхняя часть куба
lft#=left левая сторона куба
rht#=right правая сторона куба
frn#=front передняя сторона куба
bck#=back задняя сторона куба
Код: Выделить всё
           main=CreateMesh()
         PositionEntity main,0,0,0

Создаем пустой объект, в которой будем добавлять нашу геометрию (вертексы и треугольники). То есть я не просто отрисовываю каждую грань, а создаю целую 3д модель из них. Так как текстура одна то проблем с текстурированием нет. Но если что текстуры можно объединить в один файл, чтобы не сбилась UV развертка.
Код: Выделить всё
tex=LoadTexture( "2.bmp" )

Просто загружаю текстуру из файла, она пока висит в памяти

Код: Выделить всё
      If dwn#<=0 Then
            obj=LoadMesh("down.3ds")
            PositionMesh obj,x#*20,y#*20,z#*20
            ;EntityTexture obj,tex
            AddMesh obj,main
            FreeEntity obj
         End If

Вот и сам главный код. Если у грани нет соседа:
Код: Выделить всё
If dwn#<=0 Then

Тогда загружаем соответствующую сторону куба и размещаем на позицию по массиву:
Код: Выделить всё
         obj=LoadMesh("down.3ds")
            PositionMesh obj,x#*20,y#*20,z#*20

А далее просто добавляем нашу загруженну грань к главной 3д модели(main):
Код: Выделить всё
            AddMesh obj,main

Конечно все это идет перебором по циклу по всему массиву 16*16*16 циклов.

Вообще идею такого отсечения придумал не я. Я лишь подсмотрел на видео, где пытались воссоздать механику игры основаную на подобном принципе. Но мне понравилась идея. То есть сам алгоритм уменьшения полигональности в сцене за счет удаления лишних граней. Но если сильно надо будет кину ссылку в личку. Правда, само видео мне не по нраву...

P.S. Чуть не забыл
Код: Выделить всё
         dwn#=chunk(x#,y#,z#-1)
         up#=chunk(x#,y#,z#+1)
         lft#=chunk(x#-1,y#,z#)
         rht#=chunk(x#+1,y#,z#)
         frn#=chunk(x#,y#+1,z#)
         bck#=chunk(x#,y#-1,z#)

Здесь несколько нарушена правильность проверки. Например:
Код: Выделить всё
dwn#=chunk(x#,y#,z#-1)

z#-1 это проверка куба на заднюю грань,а не на нижнюю. Не знаю почему там так вышло... Я просто толком не вникал и быстро кодил чтобы получить результат

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 411
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Объясните про 3д куб

Сообщение Don Leno » 10.04.2022 (Вс) 12:11

А вот результаты проверки на производительность алгоритма:
У вас нет доступа для просмотра вложений в этом сообщении.

Sneaks
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 29.07.2006 (Сб) 12:08

Re: Объясните про 3д куб

Сообщение Sneaks » 15.04.2022 (Пт) 17:01

а если отсечь не видимые грани?
по большей части только центральный чанк будет видно с 5 сторон, а остальные только с 3х


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList