Показаны сообщения с ярлыком Питон. Показать все сообщения
Показаны сообщения с ярлыком Питон. Показать все сообщения

воскресенье, 3 февраля 2019 г.

Заинтересовался Godot.

   Скачал на предмет посмотреть - пощупать. Что можно сказать - 3D я пока особо не трогал, все же изучать лучше начинать с простого, тем более что в самоучителе на их сайте показывают работу на примере двухмерных игр. Что подкупает - встроенный прямо в редактор справочник по API и готовые элементы управления, вроде кнопок и прогресс баров. Ну и конечно Питон-подобный язык скриптов под названием GDScript. Отличия конечно есть, но по большей части то же самое. Если интересно, то можно зайти в ютубе на канал ScanerSoft, там есть хорошего качества уроки и довольно подробные. Ссылка, если что.
  
В общем, поигравшись с Godot, и немножко с ним разобравшись, решил вспомнить молодость и сделать приложение - часы. Давным-давно, когда я только начинал вникать в азы программирования, я делал свой аналог виджета часов на рабочий стол еще на VisualBasic 6.0. Или уже на VB.Net? Не помню. НО помню, что возился тогда долго, знаний не было, спросить тоже было не у кого. Вот, решил сейчас повторить подвиг, скачал текстуры циферблата и стрелок и за пару часов сделал. Картинка:


Скопипастю код функции, управляющей движением стрелок:
 
func _process(delta):

    var currTime = OS.get_time()
   
    var currSecond = currTime['second']
    var secondHand = self.get_node("Second_hand")
    secondHand.rotation_degrees = currSecond * 6
   
    var currMinute = currTime['minute']
    var minuteHand = self.get_node("Minute_hand")
    minuteHand.rotation_degrees = currMinute * 6 + currSecond * 0.1
   
   
    var currHour = 0
    if currTime['hour'] >= 12:
        currHour = currTime['hour'] - 12
    else:
        currHour = currTime['hour']
    var hourHand = self.get_node("Hour_hand")
    hourHand.rotation_degrees = currHour * 30 + currMinute * 0.5
 

вторник, 14 августа 2018 г.

IDDQD

    Сделал еще один маленький пример, на этот раз вроде даже понятно, зачем такое нужно, в отличии от предыдущего, про который я до сих пор понять не могу, нафига я его делал. Как понятно из названия, пример читов, точнее изменения какого-либо проперти в зависимости от последовательности нажатых клавиш. Как оно работает: у объекта, должного реагировать на читы, есть строка, в конец которой при нажатии на клавишу добавляется буква, соответствующая нажатой клавише, то есть, нажали "W", значит добавляется "W". А дальше идет поиск вхождения имени специального проперти в эту строку, правда специальность эта отмечена символом, указывающим тип проперти, которое при поиске вхождения опускается. Объясняю, имя проперти-читов начинается с "_" или "$", например _IDDT или &MONEY. Первое булевое и при обнаружение последовательности "IDDT" значение проперти "_IDDT" будет изменено на TRUE. Практически так же будет вести себя и $MONEY, с той лишь разницей, что к её значению будет добавлено +100. Ну и после обнаружения последовательности строка нажатых клавиш создается заново , чтобы избежать повторного срабатывания чита. Ниже КДПВ, код и ссылка на пример:

вторник, 20 марта 2018 г.

Снова здравствуйте...


И вот я снова дома. Вроде отоспался, выпил беларуской водки, поел нашего хлеба с нашей же колбасой, вкусно... Включил комп, и стал вспоминать, где какая клавиша для чего в Блендере нужна, а самый лучший способ вспомнить — что-нибудь сделать. Решил сделать пример полосы загрузки уровня и расстановки объектов, благо об этом когда-то просили, понимаю что давно это было, но лучше поздно, чем никогда. Ну и чтобы тупо не дублировать пост типа «вот скачайте пример, кому надо» попробую расписать работу примера поподробнее. Тем более, что склероз не дремлет, могу и сам забыть. Да, версия Блендера в примере 2.78а, более поздние у меня не идут, надо обновления на мой Линь поставить, но мне лень. Да и интернет у меня не сказать, что хорошего качества и не дешевый. Из-за качества интернета и общего устаревания системы этот пост решил набрать в LibreOffice, а потом просто скопипастить текст, чтобы избежать постоянных предпросмотров в самом Блоггере, тоже эксперимент получается.

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

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

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



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

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


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

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

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

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

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

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

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

Пока так.

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

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

Баловался.

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


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

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

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


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



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

Как я и думал.

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

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

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

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

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


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

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

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


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

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

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


воскресенье, 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().

воскресенье, 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 метров по всем трем осям, ничего особо интересного:


вторник, 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()

  

среда, 30 декабря 2015 г.

Не мытьем, так катаньем...

Не сумел сообразить, как передать аргументы на запуск в блендерплейер, зато сообразил, что можно просто создать файл сценария операционной системы и уже его запустить. Однако получилось.  Еще не сообразил, как отправлять совместно некоторые аргументы, но задание разрешения уже работает. Понятно, что у вас пути и имена файлов должны быть иными.
P.S. Сообразил, достаточно указать явно оболочку оси типа:
x = subprocess.Popen([gameName + '  ' + arguments], shell = True) и все заработает. Ну, почти все.
 Ниже уже не нужный скриптец: