Создание простого гексагонального ландшафта
|
|
DancingOx | Дата: Вторник, 14.02.2012, 13:58 | Сообщение # 1 |
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
| Как и обещал, я начинаю выкладывать промежуточные результаты своей работы в отдельной теме. Как видите, получилось схематичное игровое поле, состоящее из хексов, находящихся на разной высоте и соединённых боковыми гранями для придания ландшафту сплошности. Каждому из трёх уровней высоты гекса соответствует своя текстура. Таким образом, было использовано четыре экземпляра класса geom: три для разноцветных гексов, и ещё один - сразу для всех боковых граней. Немного самокритики: 1. Текстуры наложены криво, - швы видны даже на плоских участках 1а. Нужны другие текстуры - с переходными тайлами и вообще, более аутентичные. 2. Горизонтальные боковые грани должны быть с той же текстурой, что и примыкающие к ним хексы, чтобы выделить сплошные горизонтальные участки. 3. Неплохо было бы сгладить углы, например, добавив дополнительные грани. Или использовать что-то вроде Set_Smooth, как в блендере. 4. Необходимо добавить логику рандомизации при назначении хексам высот, чтобы перейти от хаотичного рельефа к карте с долинами, плато и т.п. Об этом уже было упомянуто ninth в соседней теме.
Сообщение отредактировал DancingOx - Вторник, 14.02.2012, 14:53 |
|
| |
serg-kkz | Дата: Вторник, 14.02.2012, 22:07 | Сообщение # 2 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Нехватает освещения, плохо воспринимается.
ООП -
|
|
| |
DancingOx | Дата: Среда, 15.02.2012, 12:25 | Сообщение # 3 |
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
| Изменения: 1. Добавлен свет 2. Добавлена логика рандомизации 3. Горизонтальные боковые грани текстурируются в соответсвии с уровнем Лоскутность наложения текстур пока что остаётся основной проблемой.
Сообщение отредактировал DancingOx - Среда, 15.02.2012, 12:29 |
|
| |
serg-kkz | Дата: Среда, 15.02.2012, 12:44 | Сообщение # 4 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Quote (DancingOx) Лоскутность наложения текстур пока что остаётся основной проблемой. Тебе нужно задать правильно текстурные координаты у треугольников. Создай в редакторе хекс и наложи текстуру. Потом экспортируй в EEG ну и глянь, как их распределить по точкам. Это верный путь.
ООП -
|
|
| |
DancingOx | Дата: Среда, 15.02.2012, 14:47 | Сообщение # 5 |
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
| Quote (serg-kkz) Тебе нужно задать правильно текстурные координаты у треугольников. Проверил, было неверно. Для одиночного хекса нужно было сделать так: Получилось: С одним хексом всё просто, но как быть с боковыми гранями? Как сделать сплошной рисунок на поверхности, состоящей из собственно хексов, а также боковых чертырёхугольников и треугольников? Можно сделать из маленькой текстуры большую растянув/размножив её, а потом наложить сразу всю поверхность, как в этом фрагменте, например: Если растягивать - детализация меньше будет, а если размножать, то надо использовать тайловые текстуры. Также, неизвестен размер поверхности, может потребоваться слишком большая текстура. Другой путь - запастись наборами тайловых текстур для 6-ти, 4-х и 3-угольников, что также весьма накладно. Что посоветуете?
Сообщение отредактировал DancingOx - Среда, 15.02.2012, 15:05 |
|
| |
serg-kkz | Дата: Среда, 15.02.2012, 15:35 | Сообщение # 6 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Хотя у тебя хекс другой, но можно было рассчитать и для тех прямоугольников, что находятся на одном уровне с треугольниками. И проблема можно сказать решена. Остаётся только те, которые имеют разный размер из-за высоты, здесь в принципе тоже есть закономерность. Также можно в редакторе создать хексы с прямоугольниками для всех высот, ну и глянуть что да как. Можешь еще глянуть работу с текстурами в статьях или в мануале, а так-же работа с egg на официальном сайте движка.
ООП -
Сообщение отредактировал serg-kkz - Среда, 15.02.2012, 15:43 |
|
| |
serg-kkz | Дата: Среда, 15.02.2012, 21:20 | Сообщение # 7 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Вот думаю ответ на все твои проблемы.
Создавай каждые поверхности по отдельности и наноси текстуру как в моем примере. Потом конечно можно соединить в один объект. Но лучше, скажем воду сделать отдельно и через манипуляции с UV воду можно анимировать или привинтить шейдер.
А текстурные координаты при генерации для всех точек установи 0.0
ООП -
|
|
| |
DancingOx | Дата: Среда, 15.02.2012, 22:19 | Сообщение # 8 |
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
| Спасибо за эксклюзивный пример! Очень лаконичный! Однако, неясно, что за объекты Code TextureStage TexGenAttrib и методы Code .setTexGen(...) .setTexProjector(...) .MWorldPosition(...) в строках Code environ.setTexGen(TextureStage.getDefault(), TexGenAttrib.MWorldPosition) environ.setTexProjector(TextureStage.getDefault(), render, environ) environ.setTexScale(TextureStage.getDefault(), 0.6)
|
|
| |
serg-kkz | Дата: Среда, 15.02.2012, 23:02 | Сообщение # 9 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Однако
TextureStage - текстурный канал, а именно имя присвоенное UV редактором на который нужно вешать текстуру. Как правило по умолчанию первый дефолтный канал не имеет имени. Поэтому не нужно задавать имя 'texcoord' при генерации.
TexGenAttrib - генерирует атрибуты меша для текстур, в т.ч. UV... как-то так.
.setTexGen(...) - собственно устанавливает атрибуты мешу.
.setTexProjector(...) - Проекция текстуры на нужный текстурный слой исходя из двух позиций и их ориентации , пример как нужно затекстурить вертикальные полигоны:
Code import direct.directbase.DirectStart from pandac.PandaModules import * tex = loader.loadTexture('fcelluloz.png') tex.setMagfilter(Texture.FTLinearMipmapLinear) tex.setMinfilter(Texture.FTLinearMipmapLinear) nod = NodePath('blank') nod.setHpr(0, 100, 0) environ = loader.loadModel("hex") environ.setTexGen(TextureStage.getDefault(), TexGenAttrib.MWorldPosition) environ.setTexProjector(TextureStage.getDefault(), environ, nod) environ.setTexScale(TextureStage.getDefault(), 0.6) environ.setTexture(tex) environ.reparentTo(render) run() .MWorldPosition(...) - Нужно глянуть на оф. сайте Reference. Ты не поверишь там на заданные вопросы по API можно найти ответы. Ссылку дать?
ООП -
Сообщение отредактировал serg-kkz - Среда, 15.02.2012, 23:53 |
|
| |
DancingOx | Дата: Четверг, 16.02.2012, 00:53 | Сообщение # 10 |
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
| Quote (serg-kkz) Ссылку дать? Я сам тоже смотрел документацию по API, смотрел - но не видел. Нашел референс, прочитал, перевёл и понял, что не знаю, как это интерпретировать/применить. Применил твои рекомендации. Для этого пришлось сначала записать соответствующий nodepath в .bam-файл. (как сохранить его в .egg, я не нашёл) Все geomы (для горизонтальных и для наклонной поверхностей) добавлены командой node.addGeom(geom) к этому ноду и после загрузки модели из .bam затекстурены совместно: Интересно, углы между гранями сглажены. Как это достигается? P.S. Попробую затекстурить поверхности по-отдельности, с учётом ориентации.
Сообщение отредактировал DancingOx - Четверг, 16.02.2012, 00:58 |
|
| |
serg-kkz | Дата: Четверг, 16.02.2012, 14:40 | Сообщение # 11 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Не понял, зачем было сохранять. А метод setTexture(...) к экземпляру объекта NodePath не действует? Чтобы сохранить в egg нужно расширение написать egg . Quote (DancingOx) Интересно, углы между гранями сглажены. Как это достигается? Волшебством: Quote (serg-kkz) TexGenAttrib - генерирует атрибуты меша для текстур, в т.ч. UV... как-то так.
ООП -
|
|
| |
DancingOx | Дата: Четверг, 16.02.2012, 16:54 | Сообщение # 12 |
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
| serg-kkz, да, незачем было сохранять, это все нубовские мыслесплетения меня до такого довели. Quote (serg-kkz) Чтобы сохранить в egg нужно расширение написать egg . Так? Code <NodePathObject>.writeBamFile('hexes.egg') Попробовал, и, что закономерно, в текстовом редакторе увидел бардак из символов - бинарный файл же. А такого метода в панде вообще нет: Code <...>.writeEggFile('hexes.egg') А такой - применим только для EggData, которое ещё надо получить: Code <EggDataObject>.writeEgg('hexes.egg')
Сообщение отредактировал DancingOx - Четверг, 16.02.2012, 16:57 |
|
| |
serg-kkz | Дата: Четверг, 16.02.2012, 19:41 | Сообщение # 13 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Тебе обязательно нужно сохранять? Дело в том, что после сохранения генерируемые атрибуты пропадают, т.к. они существуют только во время работы. После загрузки сохраненного bam файла текстурные координаты другие, а не те которое были при генерации. Думаю, чтоб сохранить в egg нужно преобразовать EggData.
ООП -
|
|
| |
DancingOx | Дата: Пятница, 17.02.2012, 02:01 | Сообщение # 14 |
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
| Quote (serg-kkz) Тебе обязательно нужно сохранять? Вот, сделал без промежуточных сохранений с использованием отдельного нода для каждой поверхности. Все ноды (в т. ч. и наклонный) обрабатывались одинаково, только с разными текстурами (квадратными тайлами). 1. Видно, что в пределах одной (боковой) поверхности сглаживание углов есть, а между разными поверхностями - нет. 2. Боковая текстура растягивается по вертикали в зависимости от высоты стенки, - выглядит некрасиво. 3. Неплохо бы оформить переходной слой на краях поверхностей (в местах перехода на боковую поверхность), например, посредством смешивания текстур.
Сообщение отредактировал DancingOx - Пятница, 17.02.2012, 02:11 |
|
| |
serg-kkz | Дата: Пятница, 17.02.2012, 09:45 | Сообщение # 15 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Quote (DancingOx) 2. Боковая текстура растягивается по вертикали в зависимости от высоты стенки, - выглядит некрасиво. Я для чего приводил пример в сообщении № 9? либо сделай так, либо поверни меш перед проецированием текстуры на нужный угол т.к. по умолчанию она наносится сверху вниз и наоборот.
ООП -
|
|
| |