[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Форум Panda3D - по русски » Panda3D » WiP » Создание простого гексагонального ландшафта
Создание простого гексагонального ландшафта
DancingOxДата: Вторник, 14.02.2012, 13:58 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
Как и обещал, я начинаю выкладывать промежуточные результаты своей работы в отдельной теме.
Как видите, получилось схематичное игровое поле, состоящее из хексов, находящихся на разной высоте и соединённых боковыми гранями для придания ландшафту сплошности. Каждому из трёх уровней высоты гекса соответствует своя текстура. Таким образом, было использовано четыре экземпляра класса geom: три для разноцветных гексов, и ещё один - сразу для всех боковых граней.


Немного самокритики:
1. Текстуры наложены криво, - швы видны даже на плоских участках dry
1а. Нужны другие текстуры - с переходными тайлами и вообще, более аутентичные.
2. Горизонтальные боковые грани должны быть с той же текстурой, что и примыкающие к ним хексы, чтобы выделить сплошные горизонтальные участки.
3. Неплохо было бы сгладить углы, например, добавив дополнительные грани. Или использовать что-то вроде Set_Smooth, как в блендере. tongue
4. Необходимо добавить логику рандомизации при назначении хексам высот, чтобы перейти от хаотичного рельефа к карте с долинами, плато и т.п. Об этом уже было упомянуто ninth в соседней теме.
Прикрепления: 8240355.jpg(122Kb) · 0991550.jpg(64Kb)


Сообщение отредактировал DancingOx - Вторник, 14.02.2012, 14:53
 
serg-kkzДата: Вторник, 14.02.2012, 22:07 | Сообщение # 2
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
Нехватает освещения, плохо воспринимается.

ООП  -  
 
DancingOxДата: Среда, 15.02.2012, 12:25 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
Изменения:
1. Добавлен свет
2. Добавлена логика рандомизации
3. Горизонтальные боковые грани текстурируются в соответсвии с уровнем

Лоскутность наложения текстур пока что остаётся основной проблемой.
Прикрепления: 3890267.jpg(143Kb)


Сообщение отредактировал DancingOx - Среда, 15.02.2012, 12:29
 
serg-kkzДата: Среда, 15.02.2012, 12:44 | Сообщение # 4
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
Quote (DancingOx)
Лоскутность наложения текстур пока что остаётся основной проблемой.

Тебе нужно задать правильно текстурные координаты у треугольников. Создай в редакторе хекс и наложи текстуру. Потом экспортируй в EEG ну и глянь, как их распределить по точкам. Это верный путь.


ООП  -  
 
DancingOxДата: Среда, 15.02.2012, 14:47 | Сообщение # 5
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
Quote (serg-kkz)
Тебе нужно задать правильно текстурные координаты у треугольников.

Проверил, было неверно. Для одиночного хекса нужно было сделать так:

Получилось:

С одним хексом всё просто, но как быть с боковыми гранями?
Как сделать сплошной рисунок на поверхности, состоящей из собственно хексов, а также боковых чертырёхугольников и треугольников?
Можно сделать из маленькой текстуры большую растянув/размножив её, а потом наложить сразу всю поверхность, как в этом фрагменте, например:

Если растягивать - детализация меньше будет, а если размножать, то надо использовать тайловые текстуры.
Также, неизвестен размер поверхности, может потребоваться слишком большая текстура. wacko
Другой путь - запастись наборами тайловых текстур для 6-ти, 4-х и 3-угольников, что также весьма накладно.
Что посоветуете?
Прикрепления: 3273579.jpg(88Kb) · 5782073.jpg(94Kb) · 5305311.jpg(73Kb)


Сообщение отредактировал DancingOx - Среда, 15.02.2012, 15:05
 
serg-kkzДата: Среда, 15.02.2012, 15:35 | Сообщение # 6
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
Хотя у тебя хекс другой, но можно было рассчитать и для тех прямоугольников, что находятся на одном уровне с треугольниками. И проблема можно сказать решена. Остаётся только те, которые имеют разный размер из-за высоты, здесь в принципе тоже есть закономерность. Также можно в редакторе создать хексы с прямоугольниками для всех высот, ну и глянуть что да как. Можешь еще глянуть работу с текстурами в статьях или в мануале, а так-же работа с egg на официальном сайте движка.

Прикрепления: 6614875.png(40Kb)


ООП  -  

Сообщение отредактировал serg-kkz - Среда, 15.02.2012, 15:43
 
serg-kkzДата: Среда, 15.02.2012, 21:20 | Сообщение # 7
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
Вот думаю ответ на все твои проблемы.

Создавай каждые поверхности по отдельности и наноси текстуру как в моем примере. Потом конечно можно соединить в один объект. Но лучше, скажем воду сделать отдельно и через манипуляции с UV воду можно анимировать или привинтить шейдер.

А текстурные координаты при генерации для всех точек установи 0.0
Прикрепления: gen1.rar(102Kb)


ООП  -  
 
DancingOxДата: Среда, 15.02.2012, 22:19 | Сообщение # 8
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
Спасибо за эксклюзивный пример! biggrin Очень лаконичный!
Однако, неясно, что за объекты
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
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: 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, смотрел - но не видел. Нашел референс, прочитал, перевёл и понял, что не знаю, как это интерпретировать/применить.
Применил твои рекомендации. biggrin Для этого пришлось сначала записать соответствующий nodepath в .bam-файл. (как сохранить его в .egg, я не нашёл)
Все geomы (для горизонтальных и для наклонной поверхностей) добавлены командой node.addGeom(geom) к этому ноду и после загрузки модели из .bam затекстурены совместно:

Интересно, углы между гранями сглажены. Как это достигается?
P.S. Попробую затекстурить поверхности по-отдельности, с учётом ориентации.
Прикрепления: 2205773.jpg(107Kb)


Сообщение отредактировал DancingOx - Четверг, 16.02.2012, 00:58
 
serg-kkzДата: Четверг, 16.02.2012, 14:40 | Сообщение # 11
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
Не понял, зачем было сохранять. А метод setTexture(...) к экземпляру объекта NodePath не действует? biggrin Чтобы сохранить в egg нужно расширение написать egg happy .
Quote (DancingOx)
Интересно, углы между гранями сглажены. Как это достигается?

Волшебством:
Quote (serg-kkz)
TexGenAttrib - генерирует атрибуты меша для текстур, в т.ч. UV... как-то так.


ООП  -  
 
DancingOxДата: Четверг, 16.02.2012, 16:54 | Сообщение # 12
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
serg-kkz, да, незачем было сохранять, это все нубовские мыслесплетения меня до такого довели. biggrin
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
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
Тебе обязательно нужно сохранять? Дело в том, что после сохранения генерируемые атрибуты пропадают, т.к. они существуют только во время работы. После загрузки сохраненного bam файла текстурные координаты другие, а не те которое были при генерации. Думаю, чтоб сохранить в egg нужно преобразовать EggData.

ООП  -  
 
DancingOxДата: Пятница, 17.02.2012, 02:01 | Сообщение # 14
Лейтенант
Группа: Пользователи
Сообщений: 40
Награды: 0
Репутация: 3
Статус: Offline
Quote (serg-kkz)
Тебе обязательно нужно сохранять?

Вот, сделал без промежуточных сохранений с использованием отдельного нода для каждой поверхности. Все ноды (в т. ч. и наклонный) обрабатывались одинаково, только с разными текстурами (квадратными тайлами).

1. Видно, что в пределах одной (боковой) поверхности сглаживание углов есть, а между разными поверхностями - нет.
2. Боковая текстура растягивается по вертикали в зависимости от высоты стенки, - выглядит некрасиво.
3. Неплохо бы оформить переходной слой на краях поверхностей (в местах перехода на боковую поверхность), например, посредством смешивания текстур.
Прикрепления: 4873815.png(774Kb)


Сообщение отредактировал DancingOx - Пятница, 17.02.2012, 02:11
 
serg-kkzДата: Пятница, 17.02.2012, 09:45 | Сообщение # 15
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
Quote (DancingOx)
2. Боковая текстура растягивается по вертикали в зависимости от высоты стенки, - выглядит некрасиво.

Я для чего приводил пример в сообщении № 9? либо сделай так, либо поверни меш перед проецированием текстуры на нужный угол т.к. по умолчанию она наносится сверху вниз и наоборот.


ООП  -  
 
Форум Panda3D - по русски » Panda3D » WiP » Создание простого гексагонального ландшафта
Страница 1 из 212»
Поиск: