Python вопросы

Список разделов Blender 3D Плагины

Описание: Обсуждение расширений для Blender
Модератор: exooman

Сообщение #101 Korchy » 28.11.2020, 18:45

Pavel,
Передавай не 8 параметров, а один список.
тогда от if избавиться элементарно в твоем примере
Код: Выделить всё
def fnc(lst:list)
#    if use_0:
#            coeff += 0
    coeff += lst[i] if lst[i] else 0
Но подозреваю задача сложнее и так на синтетических примерах понять сложно
Korchy M
Аватара
Сообщения: 2933



Сообщение #102 Pavel » 28.11.2020, 19:32

grayich, это в molecular аддоне частицы симулировать нужно. Частиц может быть миллион, два, четыре миллиона, как здесь:
phpBB [media]


Может быть вообще 10 миллионов. Кадров может быть много. Например, 500. Каждый кадр делится ещё и на под-кадры. Этих под-кадров может быть 100 штук. В итоге в симуляции будет 500 x 100 = 50 000 шагов моделирования.

Для каждой частицы в функциях есть много if блоков, которые при разных симуляциях могут быть разными. Но эти if блоки всегда одинаковы для одной симуляции. Если изменить настройки частиц, и перезапустить симуляцию, то if блоки будут другими.

Добавлено спустя 2 минуты 53 секунды:
Korchy, но всё равно будет вычисляться конструкция if в операторе. Мне нужно именно чистая простынь кода без каких либо if вообще. Нужно конструировать функции перед их запуском, как кирпичи. Если нужно трение, то добавляем "кирпич" для трения, если нужна разрушаемость, то добавляем "кирпич" разрушаемости. Но не для каждой частицы 50 000 раз одно и тоже выяснять.

Добавлено спустя 2 часа 17 минут:
Я вот думаю, может сделать эти функции трения, разрушаемости, жёсткости и т. д. в отдельных py файлах. А потом написать скрипт, который бы склеил их в новый py файл с кучей вариаций одной и той же функции.
Например, получится такой код:

Код: Выделить всё
COLLISION = 0b0001
FRICTION = 0b0010
STIFFNESS = 0b0100
BROKEN = 0b1000


def solver_1():
    # collision_code
    return


def solver_2():
    # collision_code
    # friction_code
    return


def solver_3():
    # collision_code
    # friction_code
    # stiffness_code
    return


def solver_4():
    # collision_code
    # friction_code
    # stiffness_code
    # broken_code
    return


mode = COLLISION | FRICTION | STIFFNESS | BROKEN
solvers = {
    COLLISION: solver_1,
    COLLISION | FRICTION: solver_2,
    COLLISION | FRICTION | STIFFNESS: solver_3,
    COLLISION | FRICTION | STIFFNESS | BROKEN: solver_4
}
solver = solvers[mode]
print(solver)
input('OK')

Будет много вариаций функции, которые собраны автоматически с помощью скрипта. Наверное попробую так сделать.
Pavel M
Аватара
Сообщения: 1208

Сообщение #103 Korchy » 28.11.2020, 23:37

тебе же ничего не мешает передать список функций как параметр в твои solver_xx функции. А потом выполнить последовательно переданные фукнции по списку.

Код: Выделить всё
def solver(funcs:list):
    for func in funcs:
        func()

def collision():
    print('collision')

def friction():
    print('friction')

solver([collision])
solver([collision, friction])
Korchy M
Аватара
Сообщения: 2933



Сообщение #104 Pavel » 29.11.2020, 01:23

Korchy, придётся много параметров передавать. И вызов самих функций тоже время занимает. Я хочу сделать одну функцию, которая собрана из кусков. Буду делать одну сплошную функцию. Если проходить по списку функций, то тоже время будет тратиться. Особенно если частиц несколько миллионов и подшагов под сотню.

Изначально мне нужен был конструктор функций, с помощью которого можно из кусков кода создать одну функцию без if и циклов. Я хочу сделать куски кода, которые соединю и сохраню в py скрипте, который будет использоваться в итоговом аддоне.

На моём последнем примере выше я сделал все вариации (на самом деле не все, это просто пример) solver функции: с трением, без трения и т. д. В зависимости от настроек, будет запускаться нужная функция. Вариаций этих функций будет очень много. Но эти функции не будут писаться вручную, а будут собраны другим скриптом из кусков кода.
Pavel M
Аватара
Сообщения: 1208

Сообщение #105 Korchy » 29.11.2020, 10:08

Мне кажется у тебя подход неправильный в корне. Если ты считаешь, что выполнение кода занимает много времени, то лучше писать код на более низкоуровневом языке, чем пытаться выжать какие-то нано-секунды производительности из высокоуровневого языка.
Если питон не тянет ту производительность, которая тебе нужна, он не вытянет ее ни с обработкой вызовов функций / условий, и без них тоже не вытянет.Ты не выиграешь много производительности на избавлении от усвлоий.
Если гнаться за скоростью, тебе нужно делать так, как делают многие авторы аддонов - писать свой обработчик на низкоуровневом язвке (С++) и делать мост между бленом и твоим обработчиком. Так например работает UV Packmaster. Он берет из блена острова развертки и перекидывает их в модуль, написанный на С++, там все обсчитывается и перекидывается обратно. Скорее всего тебе надо делать аналогично.
Korchy M
Аватара
Сообщения: 2933



Сообщение #106 grayich » 29.11.2020, 12:10

Korchy писал(а):писать свой обработчик на низкоуровневом язвке (С++) и делать мост между бленом и твоим обработчиком
в целом не поможет, если оно будет из питона вызываться миллионы раз, то сильно быстрее не станет. Нужно или всё писать на c\c++ либо менять логику.
Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 5733

Сообщение #107 Pavel » 29.11.2020, 14:02

Korchy писал(а):писать свой обработчик на низкоуровневом язвке (С++) и делать мост между бленом и твоим обработчиком.
как раз так в аддоне и сделано. Ядро написано на Cython (фактически на Си). Все частицы передаются в ядро, там обрабатываются и возвращаются в блендер с новыми скоростями и позициями.

Я хочу ускорить cython ядро, но для начала хочу решить эту проблему на питоне. Так как если смогу решить её на питоне, то будет ясно как делать в cython коде. Ну или будет понятно, в каком направлении гуглить, чтобы сделать аналог python кода на cython. Просто если бы я написал вопрос, как решить эту проблему, используя cython, то никто бы не ответил.
Pavel M
Аватара
Сообщения: 1208

Сообщение #108 grayich » 29.11.2020, 14:08

Pavel, я правильно понимаю, что ты по сути пытаешься написать свой физический движок в котором рассчитываешь влияние всех соседних частиц для каждой частицы?
Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 5733

Сообщение #109 Pavel » 29.11.2020, 14:33

grayich, я не пишу движок. Он уже написан. Его написал Pyroevil (ник в ютубе). Я хочу его ускорить. Да, поиск соседей занимает много времени. Используется KD дерево для поиска соседей. Это по-моему самая тяжёлая операция в симуляторе. Но поиск соседей я пока не буду ускорять. Хочу начать с малого. Я хочу ускорить код для столкновений и код для просчёта связей между частицами.

У меня в голове летает мысль на фоне, что когда я запускаю симуляцию, ядро выполняет десяток if операторов для каждой частицы каждого кадра и каждого подкадра.

Если частиц 8 000 000, кадров 500, подкадров 100, операторов if 10, то за всю симуляцию будет выполнено конструкций if: 8000000x500x100x10 = ‭4 000 000 000 000‬
Я думаю такое количество if замедляет симулятор.
Pavel M
Аватара
Сообщения: 1208

Сообщение #110 mac7 » 03.12.2020, 23:51

Как вырубить invoke_props_popup оператор, так как он изначально игнорирует return {'FINISHED'} и {'CANCELLED'} в execute() ?:-|
mac7 M
Аватара
Откуда: Луцьк
Сообщения: 335

Сообщение #111 Pavel » 04.12.2020, 09:31

mac7, я такими операторами не пользовался, но, посмотрев в api, думаю что отключить его нельзя. Вот написал такой оператор:
Код: Выделить всё
import bpy


class TEST_OT_Operator(bpy.types.Operator):
    bl_idname = 'object.test_operator'
    bl_label = 'Test Name'
    bl_options = {'REGISTER', 'UNDO'}

    test_float: bpy.props.FloatProperty(name='Test Float', default=0.0)

    def execute(self, context):
        print(self.test_float)
        return {'FINISHED'}

    def invoke(self, context, event):
        return context.window_manager.invoke_props_popup(self, event)


bpy.utils.register_class(TEST_OT_Operator)
bpy.ops.object.test_operator('INVOKE_DEFAULT')

Если его вызвать, то появится всплывающее окно с параметром. Ты хочешь это окно "вырубить" после того, как пользователь введёт значение один раз? Если да, то, как я думаю, это противоречит идеи invoke_props_popup. Так как это окошко всплывает для того, чтобы пользователь ввёл нужные параметры, и если его не устроит результат, то он смог ввести новые параметры. А если после первого ввода окошко закроется, то смысла нет в этом окошке. Пользователь должен иметь возможно перенастроить оператор.
Pavel M
Аватара
Сообщения: 1208

Сообщение #112 Pavel » 10.02.2021, 16:03

По запросу "blender ui library" в яндексе нашёл это обсуждение:
stackoverflow (what-is-the-framework-using-in-blender-gui)

Оказывается интерфейс в блендере реализован с помощью OpenGL:
Blender uses OpenGL to draw all of its user interface

И прочитав обсуждения по ссылкам, которые оставили на stackoverflow, тоже неоднократно увидел подтверждение этому.

Как можно на питоне аналогичный интерфейс создать? Есть же библиотека OpenGL для питона. Получается можно аналогично сделать?

Мне нужна программа с простым интерфейсом. И нужен полный контроль над внешним видом интерфейса.
Из виджетов нужны числовые поля ввода (целочисленные и дробные) и кнопки. И нужен виджет-холст, на котором отображается аналог Graph Editor'а из блендера.

Я пытался сделать на tkinter это, но всё работает очень медленно. Изменяю пиксели изображения tkinter.PhotoImage. Вот этот интерфейс с холстом 400x400 пикселей занял более 2 секунд:
Изображение
А мне нужно в реалтайме менять интерфейс.

Мне не подходят готовые библиотеки как qt и т. д., так как нужен полный контроль того, что будет отрисовываться в этом Graph Editor'е. Мне нужно отрисовывать различные кривые, менять их в реалтайме и видеть результат.
Pavel M
Аватара
Сообщения: 1208

  • 1

Сообщение #113 andreymal » 10.02.2021, 17:13

«готовые библиотеки как qt» обычно тоже имеют механизмы рисования в canvas или opengl, позволяя отрисовать что угодно под полным контролем
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Аватара
Сообщения: 1195

Сообщение #114 mac7 » 11.02.2021, 01:56

Pavel писал(а):Оказывается интерфейс в блендере реализован с помощью OpenGL:
ну и костюмный UI можно создавать в блендере
https://www.youtube.com/watch?v=iWsQDnphu80&ab_channel=Jayanam
mac7 M
Аватара
Откуда: Луцьк
Сообщения: 335

Сообщение #115 Pavel » 11.02.2021, 09:24

andreymal писал(а):готовые библиотеки как qt
я помню как-то раз хотел его установить и началось... 100 тыщ гектар качаешь и ни конца ни края... А потом ошибка при установке. И сиди потом разбирайся в ихнем гуи, как его создавать. Вот разработчики блендера взяли OpenGL и начали делать интерфейс с нуля на низком уровне. Мне тоже нужно так же сделать. Мне скорее нужна не гуи библиотека, а графическая. Кнопки будут обычными полигонами, кривые - вершины, соединённые рёбрами. А в гуи библиотеках одни костыли в этом плане. И если мне понадобится сделать произвольный виджет, то я буду зависеть от ограничений гуи библиотеки.

mac7 писал(а):ну и костюмный UI можно создавать в блендере
мне не хочется напрягать пользователей, чтобы они устанавливали и изучали блендер
Pavel M
Аватара
Сообщения: 1208

Сообщение #116 mac7 » 11.02.2021, 10:13

mac7 M
Аватара
Откуда: Луцьк
Сообщения: 335

Сообщение #117 grayich » 11.02.2021, 12:28

Pavel, озвучь конкретную задачу, чёто запутался,
в чисто питоне рисовать нужно без блендера или чё?
Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 5733

Сообщение #118 Bibo » 11.02.2021, 12:51

Pavel писал(а):я помню как-то раз хотел его установить и началось... 100 тыщ гектар качаешь и ни конца ни края...
Ну дело в том что это гигантская производственная система, берущая много времени на освоение и погружение. Как блендер от мира кнопошных приложений.
Bibo
Аватара
Сообщения: 596

Сообщение #119 grayich » 11.02.2021, 13:56

Pavel писал(а):Мне скорее нужна не гуи библиотека, а графическа
pygame, pyglet, kivy
ещё можно использовать полноценный игровой движок, например godot, в нём используется язык похожий на питон

ещё есть такая мощная штука как processing, это уже не питон
но тебе может подойти
Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 5733

Сообщение #120 Pavel » 11.02.2021, 14:16

grayich писал(а):Pavel, озвучь конкретную задачу, чёто запутался,
мне нужно создавать свои собственные виджеты и графические элементы, а не использовать готовое. Как это сделали разработчики блендера. Они написали свою собственную гуи библиотеку.

Мне ещё нужно создать интерфейс как в блендере, или похожий. Чтобы окна создавались так же. Изменялся размер окон и т. д.

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

Как это сделать? В opengl создавать полигоны и т. д. Или это как-то по другому делается?

Я хочу сделать редактор файлов из игры. Формат файлов имеет специфические данные. У меня разобраны форматы на питоне, если некоторых не будет хватать, их легко разобрать. Но проблема создать гуи для редактирования этих форматов. Есть графические форматы: 3д модели, анимационные кривые. Мне нужно создать grapheditor с рукоятками на кривых, есть кривые без рукояток. Есть форматы не графические: ноды ИИ сетки (которые можно графически представить), spawn-форматы, параметры шейдеров, материалов и т. д.

И гуи должен хорошо работать в 3д. Чтобы в 3д окне можно было обрабатывать события и манипулировать объектами, а не только с помощью кнопок на других окнах.
Pavel M
Аватара
Сообщения: 1208

Пред.След.

Вернуться в Плагины

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 2 гостя