В прошлой статье в теории были рассмотрены некоторые аспекты использования ChatGPT в узконаправленной области изучения библиотеки Bullet Physics library. Теперь попробую привести практический пример.
Для начала, в общем виде, обсудим ситуацию: человек и языковая модель думают по разному. Не уверен, можно ли вообще применять данный глагол ко второму объекту.
Представим следующую ситуацию. ChatGPT известно о библиотеке, он представляет, что такое физика, но он абсолютно ничего не знает о том, что нужно человеку. С другой стороны, есть человек, у которого есть задача, он знаком с физикой, но в целом не знаком с библиотекой
Это значит, что, интуитивно на уровне гипотезы, существуют различные пути взаимодействия:
Конкретизировать инструкции, чтобы направить творческие возможности ChatGPT и оптимизировать его инструменты по работе с данными;
Рассказать подробно о себе ChatGPT, чтобы у него сложилось понимание о собеседнике;
Предложить ChatGPT ролевую модель, чтобы ограничить его реакции.
Здесь будет рассмотрен первый вариант с оглядкой на предыдущую статью.
Несмотря на то, что цель у нас одна – добиться решения нашей проблемы средствами библиотеки Bullet, в процессе ее достижения необходимо будет решить несколько подзадач:
Использовать понятия, связанные с физикой;
Увеличить понимание задач для ChatGPT;
Увеличить понимание библиотеки для человека.
Итак, может у меня ограниченная фантазия, но я не смог ничего лучше придумать в виде задачи, чем реализация отскока объектов при падении массивного предмета. Этого точно нет в библиотеке в виде готовой функции, а значит результат непредсказуем и интересен.
Сформируем запрос:
Используй репозиторий "https://github.com/bulletphysics/bullet3" Мы должны создать демонстрацию, наподобие HelloWorld. Мы должны использовать методы из папки исходных файлов. Здесь присутствует падающий объект, статичный объект и несколько страдающих объектов. Когда падающий объект сталкивается со статичным объектом, тогда на страдающие объекты применяется сила, зависящая от импульса столкновения, даже если страдающий и падающий объект не сталкиваются напрямую. Как я могу это сделать?
Здесь и далее прошу прощения за «мыло», так как исходные диалоги потерялись осталось только видео
ChatGPT ответил в несколько этапов, периодически заикась, но, в результате предложил следующее.
Рассмотрим отдельно, как перемещается информация.
ChatGPT |
Человек |
|
Bullet |
Ее необходимо использовать, в качестве примера реализации брать файл HelloWorld |
Для решения задачи необходимо использовать btPersistentManifold, btRigitBody. Необходимо размещать после(?) stepSimulation |
Физика |
Речь идет о твердых телах |
Столкновения могут быть между твердыми телами |
Задача |
Необходимо создать рабочий пример с инструкциями |
Задача напрямую связана точками столкновения |
Итоговый код выглядит следующим образом:
for (int i = 0; i < numManifolds; i++)
{
auto man = manifolds[i];
int num_contacts = man->getNumContacts();
for (int j = 0; j < num_contacts; j++)
{
btManifoldPoint mpt = man->getContactPoint(j);
}}
В целях тестирования визуализируем точки столкновения с помощью UE. Как только возникает контакт, то создаём сферы видимого размера. По крайней мере, это в теории. На практике же означает, что мы будем исследовать массив btPersistentManifold.
Красные точки соответствуют массиву из объектов btPersistentManifold
Ссылка на видео с таймингом: Can ChatGPT help developer to create for using C++ libraries?
Сгенерированное совместно с ChatGPT решение выводит слишком много точек. В тоже время сомнительно, что сам движок обрабатывает вообще все точки в процессе своей работы.
Во время написания статьи обратил внимание, что не все точки подкрашены красным. Верхние точки синих кубов не отмечены. К сожалению, это в дальнейшем не будет использоваться. Негативное последствие спешки, так как не очень-то хотелось уделять большое количество времени тестам.
ChatGPT |
Человек |
|
Bullet |
Столкновения между статическими объектами тоже считаются |
В btPersistentManifold слишком много точек |
Физика |
||
Задача |
Необходимо фильтровать данные |
Если принять за правду гипотезу, что физическая библиотека Bullet оптимизирует вычисления, то можно попробовать разобрать на составляющие внутренние процессы и забрать отфильтрованные значения.
Нам известна функция stepSimulation из предыдущих ответов ChatGPT. Мы можем предположить, что в процессе своей работы, вышеупомянутая функция будет фильтровать данные:
Исключать;
Объединять;
Группировать;
Разгруппировать
Выдвинем следующую гипотезу: если разобрать функцию stepSimulation на подпроцессы, то возможно найти функцию, которая занимается фильтрацией и результаты работы которой можно использовать впоследствии.
Переформулируем запрос:
Ты можешь написать и описать полный и отсортированный в порядке исполнения список функций, которые последовательно вызываются во время исполнения метода stepSimulation класса btDiscreteDynamicsWorld в репозитории https://github.com/bulletphysics/bullet3 и заданного файла по пути examples/HelloWorld/HelloWorld.cpp. Ты должен следовать следующей инструкции. Ты стартуешь с первой строчки stepSimulation, читай строчки пока не достигнешь функции, тогда добавь к списку методов, далее запомни эту позицию и прыгай в эту функцию и читай строчки в этой функции и добавь найденные функции в список. Не прыгай больше чем два раза. Если достигнешь конца метода, то возвращайся к запомненной позиции и продолжай чтение. Если достигнешь конца stepSimulation, остави это.
Честно говоря, только сейчас понимаешь насколько это «поток чистых разума», после прочтения того, что пришло в воспаленную голову в момент общения.
Однако ChatGPT справился. Эксперимента ради, я отправил в запрос этот текст в нескольких «свежих» чатах. В самом худшем варианте, я на третьей «регенерации» запроса получал ответ схожий с предыдущей статьей.
Напомню, что там я получал список функций библиотеки Bullet в ответ на мой запрос. И есть определенная вероятность, что этот список связан с работой stepSimulation. В списке нашлась функция calculateSimulationIslands, описание которой содержит слово «group». Оно похоже на то, что мы ищем.
Появился новый термин «Острова Симуляции». Череда простых вопросов, которые в общих чертах запрашивают информацию о связанных объектах с этим термином, приводит к следующему методу.
Функция buildAndProcessIsland напрямую указывает, что она создает острова симуляции и перебирает их, вызывая специальную callback функцию. Вроде бы все, что нам нужно, это забрать данные, когда он приходят в callback.
Однако, здесь у меня началось полнейшее непонимание с ChatGPT. Я запрашивал у него наследуемые классы от этого IslandCallback, в том числе связанные с HelloWorld, но он продолжал отвечать, что существует btDiscreteDynamicWorld::IslandCallback, который на самом деле не существует. А InplaceSolverIslandCallback, который в два счета находится простым поиском по ключевому слову, находить отказывался.
На какой-то момент я сдался и просто загрузил то, что использовал в начале, теперь уже в InplaceSolverIslandCallback.
Ссылка на видео с таймингом: Can ChatGPT help developer to create for using C++ libraries?
Таким сложным путем можно прийти к чему-то похожему, что я пытаюсь реализовать. Ведь зная точки столкновения можно реализовать исходный посыл, осталось только реализовать массивы страдающих кубов и определить падающий куб, далее найти импульс удара и рассчитать расстояние.
Так ChatGPT предлагает определять относятся точки к падающему телу или нет:
btCollisionObject * obj0 = manifold->getBody0();
Так применять силу:
body->applyForce(force, btVector3(0,0,0));
Так брать импульс:
float impulse = point->m_appliedImpulse;
Если собрать все, что было, в одну кучу, то получим некоторое решение нашей задачи.
Ссылка на видео с таймингом: Can ChatGPT help developer to create for using C++ libraries?
Заключение
В этой статье рассмотрено практическое применение использования ChatGPT в решении задач.
Из неочевидных проблем, озвученных в статье, можно отметить следующее:
Так и не смог с помощью чата «найти» InplaceSolverIslandCallback. Стоимость этой проблемы очень низка, так как решается простым поиском.
Так и не смог заставить чат «предложить» функцию activate, а без нее страдающие объекты не двинулись бы с места. Стоимость этой проблемы невероятно высока, так как даже документация напрямую нигде не указывает об этом. Внутренняя логика такова, что только сталкивающие объекты обрабатываются алгоритмами. В нашем случае, сила как бы берется из «ниоткуда», поэтому алгоритм просто проигнорирует наше добавление силы. Здесь наверно требуется какой-то особый подход.
Не заметил, что не все точки были «подкрашены» на первом этапе. Тоже о стоимости нельзя ничего сказать, так как попросту упустил это из виду. Возможно, я смог бы найти иное решение проблемы.
В целом, статья описывает интересный опыт совместного решения проблемы с языковой моделью, а значит может кому-то помочь, а кого-то направить в нелегкой стезе изучения нового знания.
Комментарии (6)
mister_pibodi
08.04.2023 06:57+5"В переведенных статьях страдает либо объект, либо читатель"
artemopolus Автор
08.04.2023 06:57Простите, это не переведенная статья... Это искаженное англицизмами сознание автора...
Jury_78
08.04.2023 06:57+2Интересно, кто то уже спрашивал у ChatGPT, что типа - "Как закопать конкурента, чтоб никто не нашел?" ;)
whoami
Триггерюсь каждый раз когда вижу ссылки в запросах к ChatGPT. Не ходит он по ссылкам без плагина.
Но с другой стороны радует что контекста и слов в URL хватает для генерации правдоподобного ответа.
artemopolus Автор
Мне кажется, это цензура со стороны openai. Я находил свои ветки через разнообразные запросы к чату и они датировались где-то серединой 2022