В прошлой статье в теории были рассмотрены некоторые аспекты использования ChatGPT в узконаправленной области изучения библиотеки Bullet Physics library. Теперь попробую привести практический пример.

Начнем серфить по-серьезному?
Начнем серфить по-серьезному?

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

Интуитивная схема начального этапа
Интуитивная схема начального этапа

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

Это значит, что, интуитивно на уровне гипотезы, существуют различные пути взаимодействия:

  1. Конкретизировать инструкции, чтобы направить творческие возможности ChatGPT и оптимизировать его инструменты по работе с данными;

  2. Рассказать подробно о себе ChatGPT, чтобы у него сложилось понимание о собеседнике;

  3. Предложить ChatGPT ролевую модель, чтобы ограничить его реакции.

Здесь будет рассмотрен первый вариант с оглядкой на предыдущую статью.

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

Несмотря на то, что цель у нас одна – добиться решения нашей проблемы средствами библиотеки Bullet, в процессе ее достижения необходимо будет решить несколько подзадач:

  1. Использовать понятия, связанные с физикой;

  2. Увеличить понимание задач для ChatGPT;

  3. Увеличить понимание библиотеки для человека. 

Итак, может у меня ограниченная фантазия, но я не смог ничего лучше придумать в виде задачи, чем реализация отскока объектов при падении массивного предмета. Этого точно нет в библиотеке в виде готовой функции, а значит результат непредсказуем и интересен.

Сформируем запрос:

Используй репозиторий  "https://github.com/bulletphysics/bullet3" Мы должны создать демонстрацию, наподобие HelloWorld. Мы должны использовать методы из папки исходных файлов. Здесь присутствует падающий объект, статичный объект и несколько страдающих объектов. Когда падающий объект сталкивается со статичным объектом, тогда на страдающие объекты применяется сила, зависящая от импульса столкновения, даже если страдающий и падающий объект не сталкиваются напрямую. Как я могу это сделать?

Запрос к ChatGPT
Запрос к ChatGPT

Здесь и далее прошу прощения за «мыло», так как исходные диалоги потерялись осталось только видео

ChatGPT ответил в несколько этапов, периодически заикась, но, в результате предложил следующее.

ChatGPT указал реализацию
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. Мы можем предположить, что в процессе своей работы, вышеупомянутая функция будет фильтровать данные:

  1. Исключать;

  2. Объединять;

  3. Группировать;

  4. Разгруппировать

Выдвинем следующую гипотезу: если разобрать функцию stepSimulation на подпроцессы, то возможно найти функцию, которая занимается фильтрацией и результаты работы которой можно использовать впоследствии.

Переформулируем запрос:

Ты можешь написать и описать полный и отсортированный в порядке исполнения список функций, которые последовательно вызываются во время исполнения метода stepSimulation класса btDiscreteDynamicsWorld в репозитории https://github.com/bulletphysics/bullet3 и заданного файла по пути examples/HelloWorld/HelloWorld.cpp. Ты должен следовать следующей инструкции. Ты стартуешь с первой строчки stepSimulation, читай строчки пока не достигнешь функции, тогда добавь к списку методов, далее запомни эту позицию и прыгай в эту функцию и читай строчки в этой функции и добавь найденные функции в список. Не прыгай больше чем два раза. Если достигнешь конца метода, то возвращайся к запомненной позиции и продолжай чтение. Если достигнешь конца stepSimulation, остави это.

Скриншот запроса
Скриншот запроса

Честно говоря, только сейчас понимаешь насколько это «поток чистых разума», после прочтения того, что пришло в воспаленную голову в момент общения.

Однако ChatGPT справился. Эксперимента ради, я отправил в запрос этот текст в нескольких «свежих» чатах. В самом худшем варианте, я на третьей «регенерации» запроса получал ответ схожий с предыдущей статьей.

Напомню, что там я получал список функций библиотеки Bullet в ответ на мой запрос. И есть определенная вероятность, что этот список связан с работой stepSimulation. В списке нашлась функция calculateSimulationIslands, описание которой содержит слово «group». Оно похоже на то, что мы ищем.

Строчка из ответа ChatGPT
Строчка из ответа ChatGPT

Появился новый термин «Острова Симуляции». Череда простых вопросов, которые в общих чертах запрашивают информацию о связанных объектах с этим термином, приводит к следующему методу.

Ответ от ChatGPT
Ответ от ChatGPT

Функция buildAndProcessIsland напрямую указывает, что она создает острова симуляции и перебирает их, вызывая специальную callback функцию. Вроде бы все, что нам нужно, это забрать данные, когда он приходят в callback.

Однако, здесь у меня началось полнейшее непонимание с ChatGPT. Я запрашивал у него наследуемые классы от этого IslandCallback, в том числе связанные с HelloWorld, но он продолжал отвечать, что существует btDiscreteDynamicWorld::IslandCallback, который на самом деле не существует. А InplaceSolverIslandCallback, который в два счета находится простым поиском по ключевому слову, находить отказывался.

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

Результат работы вставленной функции
Результат работы вставленной функции

Ссылка на видео с таймингом: Can ChatGPT help developer to create for using C++ libraries?

Таким сложным путем можно прийти к чему-то похожему, что я пытаюсь реализовать. Ведь зная точки столкновения можно реализовать исходный посыл, осталось только реализовать массивы страдающих кубов и определить падающий куб, далее найти импульс удара и рассчитать расстояние.

Так ChatGPT предлагает определять относятся точки к падающему телу или нет:

ChatGPT
ChatGPT
btCollisionObject * obj0 = manifold->getBody0();

Так применять силу:

ChatGPT
ChatGPT
body->applyForce(force, btVector3(0,0,0));

Так брать импульс:

ChatGPT
ChatGPT
float impulse = point->m_appliedImpulse;

Если собрать все, что было, в одну кучу, то получим некоторое решение нашей задачи.

Иллюстрация решения
Иллюстрация решения

Ссылка на видео с таймингом: Can ChatGPT help developer to create for using C++ libraries?

Заключение

В этой статье рассмотрено практическое применение использования ChatGPT в решении задач.

Из неочевидных проблем, озвученных в статье, можно отметить следующее:

  1. Так и не смог с помощью чата «найти» InplaceSolverIslandCallback. Стоимость этой проблемы очень низка, так как решается простым поиском.

  2. Так и не смог заставить чат «предложить» функцию activate, а без нее страдающие объекты не двинулись бы с места. Стоимость этой проблемы невероятно высока, так как даже документация напрямую нигде не указывает об этом. Внутренняя логика такова, что только сталкивающие объекты обрабатываются алгоритмами. В нашем случае, сила как бы берется из «ниоткуда», поэтому алгоритм просто проигнорирует наше добавление силы. Здесь наверно требуется какой-то особый подход.

  3. Не заметил, что не все точки были «подкрашены» на первом этапе. Тоже о стоимости нельзя ничего сказать, так как попросту упустил это из виду. Возможно, я смог бы найти иное решение проблемы.

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

Комментарии (6)


  1. whoami
    08.04.2023 06:57
    +1

    Триггерюсь каждый раз когда вижу ссылки в запросах к ChatGPT. Не ходит он по ссылкам без плагина.

    ChatGPT is not connected to the internet, and it can occasionally produce incorrect answers.

    Но с другой стороны радует что контекста и слов в URL хватает для генерации правдоподобного ответа.


    1. artemopolus Автор
      08.04.2023 06:57

      Мне кажется, это цензура со стороны openai. Я находил свои ветки через разнообразные запросы к чату и они датировались где-то серединой 2022


  1. kuil
    08.04.2023 06:57
    +1

    "Страдающий объект"!


  1. mister_pibodi
    08.04.2023 06:57
    +5

    "В переведенных статьях страдает либо объект, либо читатель"


    1. artemopolus Автор
      08.04.2023 06:57

      Простите, это не переведенная статья... Это искаженное англицизмами сознание автора...


  1. Jury_78
    08.04.2023 06:57
    +2

    Интересно, кто то уже спрашивал у ChatGPT, что типа - "Как закопать конкурента, чтоб никто не нашел?" ;)