среда, 28 декабря 2016 г.

Падал прошлогодний снег.

   Или двигаю полигоны, часть третья. Учебная, можно сказать, сцена, присматриваюсь, как бы сделать систему частиц на полигонах. Сейчас тренировался разворачивать полигоны в сторону камеры(не очень получилось), частично потренировался управлять активностью "частиц", сделал координаты "частицы" при первом появлении зависящим от настраиваемых параметров.



Кому интересно, можете скачать, 655 kB:
snow.blend.zip

Управление- просто запустить, если хотите поиграть с количеством снежинок, то просто удаляйте, копируйте их в режиме редактирования.


вторник, 27 декабря 2016 г.

Раскидал полигоны.





1000 с копейками полигонов-квадов, скрипт запускается каждый тик, есть легкие тормоза. Полигонам не рассчитывается ориентация в сторону камеры, поэтому несколько быстрее работают.  Думаю, что в случае с сотней - другой полигонов тормозов быть не должно.

понедельник, 26 декабря 2016 г.

Шпаргалки по mathutils и линейной алгебре.

   После того как убил кучу времени, пытаясь собрать матрицу ориентации на объект, решил завести шпаргалку. Пост будет дополняться, по мере понимания мной всяких фишек, для памяти. Банальные и неинтересные вещи.

суббота, 24 декабря 2016 г.

Двигаю полигоны.

    Я тут попробовал полигоны подвигать, скорее прицениться, что надо, для фейковой системы частиц на полигонах, вместо объектов. 

пятница, 23 декабря 2016 г.

Покамест замораживаю.

    Может быть, если пойму, в чем проблема со столкновениями, переделаю. А пока добавил пару параметров в систему частиц, плюс анимации и кривые теперь имеют более осмысленные имена, ну и перепаковал архив в .zip. Циклов стало больше, толку правда чуть.

понедельник, 19 декабря 2016 г.

Пока так.

    В принципе, вполне работоспособная версия, я было даже обрадовался, дескать закончил. Ага, как же, размечтался, одноглазый. Работать - то оно работает, но только до тех пор, пока частицам не надо просчитывать столкновения и вот тут вылезает такая неприятность, что теряются ключи, потому что система частиц теряет свои частицы, или еще что с ними делает, и фиг знает, как эту проблему решить. Обидно, да. Вдвойне обидно, что иногда оно работает вполне себе нормально, а потом как вожжа под хвост попадает. Буду думать, а пока свежая версия.
explodeToShape0.9.py.7z
Лицензия:
    "Скачивая этот аддон, вы соглашаетесь с тем, что данный аддон поставляется "как есть", автор не несет ответственности за любой причиненный данным аддоном вред вашему Блендеру, компьютеру, здоровью, планете, душе. Используя данный аддон вы соглашаетесь с возможным приближением момента тепловой смерти Вселенной. " )))

суббота, 17 декабря 2016 г.

Добавил что хотел.

Добавил кнопочку запекания результата работы оператора, как и хотел. Также добавил возможность включения/отключения воздействия гравитации на траекторию частиц. Код сейчас добавлять не буду, смотрите картинку:

пятница, 16 декабря 2016 г.

Баловался.

     Всех с Пятницей!
     Возился с одной задумкой, хотелось добавить кнопочку на панель настройки оператора, для так сказать, оформления результата настройки. Делалось это для аддона взрыва, но он уже изрядно разросся, поэтому я не рискнул сразу в его коде писать. Если всё выгорит, а меня всё равно терзают смутные сомнения, то можно будет видеть траекторию разлета осколков, и настраивать параметры как нравится и только когда уже всё будет готово, запаковывать в ключи формы. Сейчас во время работы оператора приходится гонять туда -сюда текущий кадр сцены, чтобы просто увидеть результат.


суббота, 10 декабря 2016 г.

Зря жаловался.

    Внезапно всё пошло, причем почти сразу же после написания предыдущего поста. Логику добавления системы частиц я поменял, еще кое-какие изменения есть. По сути эта версия уже Бета, основной функционал готов, осталось только напильником пройтись, попереименовывать некоторые переменные, определиться с диапазоном их изменения, возможно добавить еще каких настроек, или наоборот, какие-то настройки убрать. Еще добавить всякие подсказки, короче красиво оформить. Да, проверку типа объекта надо сделать, чтобы оно не пыталось взорвать лампочку, к примеру.
 
    Долго провозился с системой частиц, сразу всем хочу сказать, не надо для изменения текущего кадра в сцене использовать scene.frame_current, оно так не работает, система частиц плевать хотела на такое изменение, юзайте scene.frame_set(), если бы я сразу им воспользовался, то пару дней не провозился бы.


    Ниже код, какой он есть сейчас. ДЛИННОТА!



четверг, 8 декабря 2016 г.

что-то оно не хочет опять.

   Хотел переделать логику добавления/удаления модификаторов системы частиц. Сейчас всё это дело на каждую копию вешается в индивидуальном порядке, при этом настроики системы частиц у всех копий одинаковы. Планировал добавлять систему частиц и модификаторы только на первую копию, а потом клонировать уже её, с этим как раз проблем нет. А вот когда начинаю применять модификаторы система частиц впирается рогом и не дает изменить сетку копий. Причем ручками применяю - всё работает. Разобрался заодно с ключами анимации, теперь они Linear.

четверг, 10 ноября 2016 г.

понедельник, 7 ноября 2016 г.

Переезд кнопки.

    Погонял кнопку исполнения оператора по разным местам и панелям, по результату сделал вывод, что если разместить кннопку во вкладке DATA, как изначально планировалось, то блендер просто не даст изменить активный объект, вроде как выбрал какой-то объект, значит с ним и работай, нечего с объекта на объект зайцем скакать. Зато в меню 3D окна - пожалуйста, делай что хочешь, так что кнопка оператора туда переезжает. Покамест вожусь с настройкой интерфейса, точнее почитываю, что попадается про это дело, надо сделать крутилки кучи настраиваемых параметров. Так-то на пробу вставил пару проперти, все нормально работает, только не очень опрятно получается. Модификатор Solidify я добавил, надо еще несколько изменить логику работы оператора, добавлять систему частиц и модификаторы только на первый клон, а уже с него все копировать. Еще надо поправить получающуюся анимацию, кривые ключей почему-то создаются типа Безье, нехорошо, надо линейные.

воскресенье, 6 ноября 2016 г.

Как я и думал.

    При работе оператора от назначенной кнопки почему-то не происходит смена текущего объекта, сиречь bpy.context.object. Поэтому, при работе все модификаторы вешаются не на клоны объекта, а на  сам объект.

пятница, 4 ноября 2016 г.

Что за ерунда?

    Переписал оператор взрыва объекта, с добавление модификатора Solidify, при вызове оператора из текстового редактора всё работает нормально, как только делаю оператору кнопку на панели, при нажатии этой кнопки в консоли сплошные ошибки. Система частиц и модификаторы вешаются на объект, на котором их быть не должно. Тьфу...

понедельник, 10 октября 2016 г.

Код оператора будущего аддона.

    Разобрался с выбором объекта и с прочими появившимися проблемами. Что еще надо сделать:
a) Добавить модификатор Solidify, и соответственно применение его.
b) Оформить некоторые переменные как Property
c) Написать первую версию Гуя, и разместить его в DATA

    Выпотрошил пример Simple Operator из примеров блендера и заменил функционал. Замучился я с применением модификатора взрыва, никак не хотел он нормально применяться, пришлось каждый раз пересчитывать его данные, как итог, результат не похож на настроенный оригинал. Все остальное позже доделаю, а пока можно почитать, да и потестить ( с подсветкой синтаксиса и комментариями!):


пятница, 7 октября 2016 г.

Что-то я делаю не так.

    Пытаюсь написать оператор блендера на основе скрипта из предыдущего сообщения. Казалось бы, код вполне себе работоспособный, бери и пользуйся. Голосом М. Задорнова: "Конечно!". То не могу активный объект переназначить, теперь модификатор взрыва выеживается. Применяется совсем не так, как ручками. Совсем другая логика, ни разу не BGE. Где бы что на русском языке почитать, для достижения просветления, не век же мне в позе лотоса медитировать созерцая строки кода? Бубен купить что ли?

среда, 5 октября 2016 г.

Пишу аддон взрыва объекта.

   Будем считать, что пока еще версия 0.1 Авось хватит времени его дописать, но пока не сделал, буду периодически выкладывать сюда код. Собственно базовый функционал уже готов, при запуске скрипта, при наличии выбранного объекта, рядом с ним генерируется объект, отвечающий за демонстрацию взрыва. На нем генерируется куча ключей форм, значения которых анимируется. Вот эту анимацию и надо запускать в BGE, не забывая конечно, что анимацию нужно применять именно на этом свежесозданном объекте. Код и немного подробностей ниже, извините что мало и код без подсветки синтаксиса, но всё еще будет переписываться, поэтому ИЗВИНИТЕ.


суббота, 30 июля 2016 г.

Проверил одну мысль...

    В связи с сильными дождями появилась свободная минутка и я решил проверить одну мысль: что если генерировать Stencil - маску "на лету"? Таки получилось. Что это дает?


суббота, 9 июля 2016 г.

Вершины в словаре.

    Время доступа по ключу к записанному в словаре значению величина постоянная и не зависит от размера словаря. Казалось бы, что сразу не сообразить, закидывать в словарь всякое разное? А вот поди же... Сообразил, что если вершины меша записать в словарь, то для изменения каких-то характеристик конкретной вершины не надо перебирать их всех циклом, а просто вызвать по ключу.
   Ключи в словарях это нечто невероятно удобное. Достаточно сказать, что они могут быть разных типов. Как вам понравится идея использования в качестве ключа например числа типа float? Или экземпляр собственноручно написанного класса? А ведь можно. Потому что всё есть объект.
    Вот, сообразив всё вышеописанное, соорудил даже не пример, нет, это скорее альфа - прототип ландшафта, в котором рельеф задается изменением z-координаты вершин меша. Оно еще весьма корявое, но если кому интересно:

SculptLand.blend.7z (108 kB)

вторник, 12 апреля 2016 г.

воскресенье, 10 апреля 2016 г.

Хорошо, когда некогда возиться...

   По причине недостатка времени пришлось залезть в модуль bpy для ускорения работы - ну вот не могу я три десятка блоков клонировать три раза, каждый раз смещая и поворачивая клон на 90 градусов, да еще применяя поворот. А надо ведь еще переименовать каждый блок, чтобы имя объекта совпадало с именем меша, да еще добавить каждому блоку игровое проперти с определенным значением - ручками будет нудно и долго. Проперти надо добавлять, потому что у меня редактор должен использовать bge, а проперти будет служить указанием типа, для сборки в список имен блоков одного типа. Я еще не решил как оно лучше будет сделать. И наверное, надо выстроить блоки в линию.
    Запишу, читателям может пригодится, мне как страховка от склероза.

*****
Клонировать и покрутить:

import bpy
# получаем выделенный объект
object = bpy.context.object
# дублируем
bpy.ops.object.duplicate()
# поскольку после дублирования выделенным становится клон, то переполучаем
# выделенный объект.
object = bpy.context.object
# двигаем, тут понятно и так
object.location[1] = object.location[1] - 4.0
# вращаем, угол задается в радианах
bpy.ops.transform.rotate(value = 1.5708, axis = (0.0, 0.0, 1.0))
# применяем вращение
bpy.ops.object.transform_apply(rotation = True)

*****
Создать новое проперти и изменить его значение:

import bpy
# получаем выделенный объект
object = bpy.context.object
# создаем новое проперти типа STRING
bpy.ops.object.game_property_new(type = 'STRING', name = 'TYPE')
# получаем к новому проперти доступ по имени и изменяем значение
object.game.properties.get('TYPE').value = 'bla-bla'

*****
Переименовать объект и меш:

import bpy
# получаем выделенный объект
object = bpy.context.object
# Переименовываем сам объект блока
object.name = 'NEW_NAME'
# Переименовываем меш блока
object.data.name = 'NEW_NAME'



вторник, 22 марта 2016 г.

Немного о агрегатировании.

Набросал небольшой пример агрегатирования пользовательских классов. Всё сделано очень упрощенно, хотя все равно простыня получилась. Вешаете на дефолтный куб сенсор типа Always включенный в импульсном режиме, к нему подключаете контроллер типа Module, и в нем прописываете функцию main().

среда, 2 марта 2016 г.

Блоки.

Наклепал еще блоков.
Сделал все текстуры формата dds.
Наложил большую текстуру маски, правда еще толком не настроил.


понедельник, 29 февраля 2016 г.

Сделал десяток блоков.

    Нужно еще:
1) Настроить нормально материалы, добавить большую черно-белую маску, что бы не так заметна была плитка текстур.
2) Переделать текстуры на размер кратным 2. У меня их там всего пяток, так что недолго.
3) Переименовать блоки и как объекты, и как меши.
5) Сделать еще кучу блоков поворота и блоки плавного спуска. Дофига еще.
6) Создать таблицу высот для каждого блока.

Пока выглядит так:



Blog by Flogger-K. 3D и не только: "Случай в квадрате 36-80" или "Операция Святой Яну...

Blog by Flogger-K. 3D и не только: "Случай в квадрате 36-80" или "Операция Святой Яну...: Когда-то достаточно давно я видел оба фильма. И их названия очень даже соответствовали моим извращениям по поиску алгоритма генерации блоков...

воскресенье, 28 февраля 2016 г.

четверг, 25 февраля 2016 г.

Создание блока.


Опишу, как я создаю блок. Мало ли, вдруг прогрессирующий склероз совсем заест. Или вдруг кто совет полезный даст.


воскресенье, 21 февраля 2016 г.

Медленно.

    Скачал и поставил плагин к GIMP'у, экспортирующий изображение в формате .dds. Ну как скачал/поставил - в Центре приложений ввел в поисковую строку "dds", оно и вылезло, осталось только кнопку "Установить" нажать, да подтвердить паролем. Линукс развращает... Немного потестировал, но что-то особой разницы в производительности для BGE я не заметил. Надо еще поэкспериментировать.
    Возвращаясь к блочному ландшафту, не прошло и недели, как я немного переделал высокополигональный меш, запек с него новую карту нормалей и запек AO. Швов не видать, правда когда буду делать меши других типов, придется слегка помучатся. Ну да когда это будет ))). Надо бы еще разобраться с бликами - очень уж сильно бликует, словно маслом намазано.
Ниже результат в виде картинок:


четверг, 18 февраля 2016 г.

Хорошая мысля всегда приходит опосля.

    Внезапно сообразил как сделать более-менее вменяемую развертку для блока. Ниже картинки с перерисованной текстурой. Карта нормалей запекалась с корявого блока, я его не менял.


среда, 17 февраля 2016 г.

Война с разверткой окончилась ничем.

   Для начала конечно надо написать, почему я её затеял - всё дело в том, что текстуры не желали накладываться так, что бы между соседними блоками ландшафта не было швов.  Ниже на второй картинке заметно влияние карты нормалей, запеченной с криво сделанного высокополигонального меша. А тут еще и просто текстуры криво склеиваются - даже разница в яркости имеется. Вот и затеял я сделать развертку такую, чтобы текстуры на неё накладывались ровно-ровно, да вот только для такого типа геометрии блока это мне непосильно.Для предыдущих блоков еще куда не шло или для ровной стеночки без проблем, а тут ширина отвесной стенки получается в два раза больше ширины нижней или верхней поверхности. Собственно оно и видно. В общем мучал я развертку, резал её по всякому, а вот сейчас вдруг вспомнил, что в режиме Texture Paint можно включить симметрию и просто намалевать как надо. Развертку теперь можно сделать как удобно и не париться. Есть только одно замечание для Texture Paint - размер текстуры, используемой в качестве кисти, все же должен быть сообразен с размером модели.

Модели в этот раз не будет, геометрия не изменилась. Ниже картинки, что я сделал по-быстрому:


пятница, 12 февраля 2016 г.

Потихоньку вожусь с геометрией блоков ландшафта.

    Всё никак не выберу подходящую форму. И карты нормалей использовать охота, и карты затенения и АО. Да еще хочется, что бы текстуры накладывались без "растяжек", поэтому надо еще вменяемую развертку сделать. Губа не дура, однако. Заодно решил попробовать blend4Web в качестве вьювера для моделек. Вот ссылка, аж 2,2 МБ:

TEST_SLOPE.html

Кому неохота грузить модельку, ниже пара скриншотов. Текстурку рисовал прямо по модели в режиме Texture Paint. Освещение - один Sun и пара Hemi. 226 полигонов.



воскресенье, 7 февраля 2016 г.

Скрипт поиска файла в директории и вложенных директориях # 2

Как выяснилось, предыдущая версия наотрез оказалась работать в винде. Слеши там, видите ли, "не той системы". А эта, по идее, должна работать везде.


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import bge
import os

def searchFile(startPath, nameFile):
    # результат поиска, по умолчанию "ничего не нашли", он же флаг
    result = False
    # список всех путей к папкам, в которых будем искать
    listPaths = [startPath]
    # просматриваем доступные пути к директориям
    for path in listPaths:
        #print('dir -- ', path) # debug
        # просматриваем содержимое текущей папки
        for ob in os.listdir(path):
            #print('ob -- ', ob, os.path.isfile(os.path.join(path, ob)), os.path.isdir(os.path.join(path, ob))) # debug
            # если файл, тот что нам нужен          
            if ob == nameFile:
                # то изменяем значение флага на путь к файлу
                result = os.path.join(path, ob)
                # и выходим из этого цикла
                break
            # если же файл не тот, что нужен, но является папкой
            elif os.path.isdir(os.path.join(path, ob)):
                # добавляем путь к новой папке в список всех путей для
                # последующего поиска там
                newPath = os.path.join(path, ob)
                listPaths.append(newPath)          
        # если в предыдущем цикле что-то нашли, то выходим и из этого цикла.
        if result != False:
            break
     
    # красиво оформляем фейл поиска      
    if result == False:
        result = 'Извините, по вашему запросу ничего не найдено'
       
    return result


def main():
   
    # путь к папке, с которой мы начнем поиск
    cernelPath = bge.logic.expandPath('//')
   
    # имя искомого файла, понятно, что должно быть своё
    nameFile = 'robot.blend1'

    # осуществляем поиск и сохраняем результат
    search = searchFile(cernelPath, nameFile)
    # выводим результат поиска на экран
    print(search)
    return 0

# бгешный запуск, вместо if __name__ == '__main__'
cont = bge.logic.getCurrentController()
sens = cont.sensors[0]
if sens.positive:
    main()


суббота, 6 февраля 2016 г.

Поиск файла в указанной директории и вложенных директориях.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  searchFile.py
#  
#  Copyright 2016 denis8424
#  
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#  
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#  
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#  
#
import os

def main():
    # путь к папке, с которой мы начнем поиск
    cernelPath = '/home/denis8424/bge/land_disain/'
    # имя искомого файла
    nameFile = 'soil.jpg'
    # осуществляем поиск и сохраняем результат
    search = searchFile(cernelPath, nameFile)
    # выводим результат поиска на экран
    print(search)
    return 0

def searchFile(startPath, nameFile):
    # результат поиска, по умолчанию "ничего не нашли", он же флаг
    result = False
    # список всех путей к папкам, в которых будем искать
    listPaths = [startPath]
    # просматриваем доступные пути к директориям
    for path in listPaths:
        # просматриваем содержимое текущей папки
        for ob in os.listdir(path):
            # если файл, тот что нам нужен        
            if ob == nameFile:
                # то изменяем значение флага на путь к файлу
                result = path + ob
                # и выходим из этого цикла
                break
            # если же файл не тот, что нужен, но является папкой
            elif os.path.isdir(ob):
                # добавляем путь к новой папке в список всех путей для
                # последующего поиска там
                newPath = path + ob + '/'
                listPaths.append(newPath)
        # если в предыдущем цикле что-то нашли, то выходим и из этого цикла.
        if result != False:
            break
         
    # красиво оформляем фейл поиска    
    if result == False:
        result = 'Извините, по вашему запросу ничего не найдено'
     
    return result


if __name__ == '__main__':
main()


Красивого кода не получилось...

среда, 3 февраля 2016 г.

Пока ничего нового.

    Разве что набросал скриптец, расставляющий объекты в случайной позиции, но в определенном интервале, и задающем цвет и размер объекта в зависимости от случайного параметра. Цвет - градиент от синего к красному. Всё на bpy. А сподвиг меня на сей подвиг Flogger-K aka +Alexandr Kir, со своими вопросами, спасибо ему за это большое (это не шутка). Просто был недавно на форуме b3d.org.ua поднят вопрос визуализации астрономического феномена, в общем надо было визуализировать over 9000 объектов, каждый со своим цветом и размером, зависящим от некоторых параметров.  Я, редиска, когда нужно было, не сделал, другой человек постарался, честь ему и хвала. Теперь подспудно грызёт интерес - а как это можно было сделать?

import bpy
import random

scene = bpy.context.scene
sceneObj = scene.objects
ob = sceneObj['Sphere']

for ob in sceneObj:

    if ob.name != 'Camera' and ob.name != 'Hemi':

        e = random.random()
        if e != 0.0:
            r = 1.0 - 1.0 * e
            g = 0.0
            b = 0.0 +  1.0 * e
        else:
            r = 0.0
            g = 1.0
            b = 0.0
        a = 1.0

        ob.color = (r, g, b, a)
        ob.scale = (e, e, e)

        ob.location[0] = random.randrange(-100.0, 100.0, 1.0)
        ob.location[1] = random.randrange(-100.0, 100.0, 1.0)
        ob.location[2] = random.randrange(-100.0, 100.0, 1.0)

Ниже результат для немногим более двух тысяч объектов в области +/- 100 метров по всем трем осям, ничего особо интересного:


воскресенье, 24 января 2016 г.

С плавностью движения по карте высот разобрался.

    На видео результата можно полюбоваться:


Есть небольшие косяки, типа ошибки из-за выхода за пределы карты высот, но в целом я доволен.

moveHiMap.blend.7z (~150 kB)

Управление: WSAD - движение, 7,3,1, - выбор вида камеры. Но надо подождать пару минут, пока карта высот построится. Стартовая сцена так и называется - "start".

Опишу, как оно работает ниже.


вторник, 19 января 2016 г.

Подергунчик.

   Почти доделал движение по карте высот. Пока что юнит сильно дергается, потому что карта высот имеет между ячейками шаг в один метр. Это не по плавному ландшафту скользить... Надо как-то делать переходы по-плавнее. Есть еще косяк с "зарыванием" танчика в землю, на видео видно. Это уже недостаток выбранного мной подхода, как исправить пока не знаю.






понедельник, 18 января 2016 г.

Пожалуй успех.

   Как и собирался, собрал из векторов матрицу ориентации и присобачил к "юниту", что бы посмотреть, как оно будет вести себя. "Юнит" в кавычках, потому что настоящий юнит находится за пределами видимости камеры, а желтая болванка сложной формы это объект, отвечающий за отображение. "Юнит" ведет себя нормально, учитывая, что "опорные точки" находятся довольно далеко за пределами его корпуса. Если что - опорные точки находятся на углах белого прямоугольника. Там еще и направления осей ориентации отображаются соответствующим цветом, только их корпус "юнита" закрывает. Болванка имеет физический тип No Collision. Сделал ландшафт более плавным, для красоты. Придется, по видимому делать карту высот помельче.



   Что еще надо сделать: во-первых, определять координаты пустышек и всех опорных точек через вектора направления, а то у меня все координаты задаются ручками в скрипте, во-вторых, надо сделать "покататься" по более крупному ландшафту в произвольном направлении, просто для удовольствия, и поэтому, в-третьих,  надо вменяемое управление камерой.

воскресенье, 17 января 2016 г.

Побочный продукт.

   В процессе подготовки алгоритма движения по ландшафту с помощью карты высот создал небольшой пример во-первых, определения векторов направления координатных осей объекта, обзовем его опорным, а во-вторых, пересчета координат другого объекта (цели) из локальной системы координат опорного объекта в мировые. Пару раз перечитал предыдущее предложение, вроде сам понял, что написал ))).  Качайте, если интересно. Управление - стрелочки. Размер небольшой.
rotAxis.blend.7z
    Мне такая штука нужна для определения координат опорных, в прямом смысле этого слова точек. С помощью этих координат я буду выковыривать значения высоты из карты высот, а по значениям высоты буду строить матрицу ориентации для юнита, если сумею, конечно. По идее я как раз должен был сейчас делать алгоритм построения матрицы и проверять, корёжит ли юнит при движении по холмистой местности и не погружает ли он свои "колеса" слишком глубоко. А вот отвлёкся. И с картой высот и блочным ландшафтом тоже интересная вещь получается - в процессе "прикидок" выбирал размер блока как компромисс, что бы и блок был не слишком мелким, и расстояние между высотами не слишком большим, поскольку полагал, что блоки возьмут на себя функцию карты высот. А теперь получается, что карта будет отдельно от блоков. И можно опять (!) переделывать блочный ландшафт под удобный размер. Всегда советовал для начала выбирать удобный формат данных, а потом уже реализовывать, а сам получается своим советам не последовал.

суббота, 16 января 2016 г.

Пробую сделать движение по рельефу.

    Собственно видно пока что заготовку расчета огибания местности для двух осей. Высоты беру из  пустышек с сенсором Рэй, по идее нужно из карты высот выковыривать, да мне лень, какая собственно для черновика разница откуда брать данные? Потом конечно надо будет сделать. Собственно идея в том, чтобы строить на рассчитанных данных матрицу ориентации для юнита, причем без всякой физики. Естественно, что считаться это должно только когда юнит находится в поле зрения камеры. Не факт, правда, что получится сделать вменяемый расчет направления оси Z.  Посмотрим.






среда, 13 января 2016 г.

Повторение пройденного.

    Снова взялся делать ресурсы для блочного ландшафта - решил сделать разделение материалов с помощью текстурной маски. Все предыдущие файлы мягко говоря, для этой задачи не подходили - не хотелось возиться с разверткой. На сей раз саму геометрию сделал прямо-таки подозрительно быстро, тем более что сообразил, что для наложения материала не нужно делать "всякой твари по паре", достаточно собрать по одному блоку, а потом просто скопировать и покрутить их сколько надо и как надо. Ниже артинка с единым мешем-заготовкой. Его еще надо резать, размножать получившиеся блоки и переименовывать. Может еще надо будет переделать геометрию. 

вторник, 5 января 2016 г.

Получение списка файлов в папке с помощью os.listdir()

Внезапно обнаружил, что не написал про такую удобную функцию питона. А ведь собирался! Склероз проклятый...

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import os

def main():
    # получаем список имен всех файлов в папке, где лежит наш скрипт, если хотите другой           # путь, то его нужно указывать вместо точки в кавычках в аргументе функции listdir.
    L = os.listdir('.')
    # "фильтруем", любуемся в консоли на список бленд-файлов в текущей паке.
    for obj in L:
        if '.blend' in obj:
            print(obj)
    return 0

if __name__ == '__main__':
    main()