В прошлой статье в теории были рассмотрены некоторые аспекты использования ChatGPT в узконаправленной области изучения библиотеки Bullet Physics library. Теперь попробую привести практический пример. Для начала, в общем виде, обсудим ситуацию: человек и языковая модель думают по разному. Не уверен, можно ли вообще применять данный глагол ко второму объекту. Представим следующую ситуацию. ChatGPT известно о библиотеке, он представляет, что такое физика, но он абсолютно ничего не знает о том, что нужно человеку. С другой стороны, есть человек, у которого есть задача, он знаком с физикой, но в целом не знаком с библиотекой Это значит, что, интуитивно на уровне гипотезы, существуют различные пути взаимодействия: Конкретизировать инструкции, чтобы направить творческие возможности ChatGPT и оптимизировать его инструменты по работе с данными; Рассказать подробно о себе ChatGPT, чтобы у него сложилось понимание о собеседнике; Предложить ChatGPT ролевую модель, чтобы ограничить его реакции. Здесь будет рассмотрен первый вариант с оглядкой на предыдущую статью. Несмотря на то, что цель у нас одна – добиться решения нашей проблемы средствами библиотеки Bullet, в процессе ее достижения необходимо будет решить несколько подзадач: Использовать понятия, связанные с физикой; Увеличить понимание задач для ChatGPT; Увеличить понимание библиотеки для человека.  Итак, может у меня ограниченная фантазия, но я не смог ничего лучше придумать в виде задачи, чем реализация отскока объектов при падении массивного предмета. Этого точно нет в библиотеке в виде готовой функции, а значит результат непредсказуем и интересен. Сформируем запрос: Используй репозиторий  "https://github.com/bulletphysics/bullet3" Мы должны создать демонстрацию, наподобие HelloWorld. Мы должны использовать методы из папки исходных файлов. Здесь присутствует падающий объект, статичный объект и несколько страдающих объектов. Когда падающий объект сталкивается со статичным объектом, тогда на страдающие объекты применяется сила, зависящая от импульса столкновения, даже если страдающий и падающий объект не сталкиваются напрямую. Как я могу это сделать? Здесь и далее прошу прощения за «мыло», так как исходные диалоги потерялись осталось только видео ChatGPT ответил в несколько этапов, периодически заикась, но, в результате предложил следующее. Рассмотрим отдельно, как перемещается информация.  ChatGPT Человек Bullet Ее необходимо использовать, в качестве примера реализации брать файл HelloWorld Для решения задачи необходимо использовать btPersistentManifold, btRigitBody. Необходимо размещать после(?) stepSimulation Физика Речь идет о твердых телах Столкновения могут быть между твердыми телами Задача Необходимо создать рабочий пример с инструкциями Задача напрямую связана точками столкновения Итоговый код выглядит следующим образом: В целях тестирования визуализируем точки столкновения с помощью 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 предлагает определять относятся точки к падающему телу или нет: Так применять силу: Так брать импульс: Если собрать все, что было, в одну кучу, то получим некоторое решение нашей задачи. Ссылка на видео с таймингом: Can ChatGPT help developer to create for using C++ libraries? Заключение В этой статье рассмотрено практическое применение использования ChatGPT в решении задач.  Из неочевидных проблем, озвученных в статье, можно отметить следующее: Так и не смог с помощью чата «найти» InplaceSolverIslandCallback. Стоимость этой проблемы очень низка, так как решается простым поиском. Так и не смог заставить чат «предложить» функцию activate, а без нее страдающие объекты не двинулись бы с места. Стоимость этой проблемы невероятно высока, так как даже документация напрямую нигде не указывает об этом. Внутренняя логика такова, что только сталкивающие объекты обрабатываются алгоритмами. В нашем случае, сила как бы берется из «ниоткуда», поэтому алгоритм просто проигнорирует наше добавление силы. Здесь наверно требуется какой-то особый подход. Не заметил, что не все точки были «подкрашены» на первом этапе. Тоже о стоимости нельзя ничего сказать, так как попросту упустил это из виду. Возможно, я смог бы найти иное решение проблемы. В целом, статья описывает интересный опыт совместного решения проблемы с языковой моделью, а значит может кому-то помочь, а кого-то направить в нелегкой стезе изучения нового знания.