Создание проекта Lamborghini Urus (WebGL/PlayCanvas). Часть 9.
Это Часть 9 из серии уроков по созданию Lamborghini Urus при помощи WebGL/PlayCanvas.
Для тех, кто не читал предыдущие части, вот демонстративное видео.
В этой части урока, мы добавим еще больше интерактивности в сцену, создадим кастомные скрипты и запрограммируем интерфейс.
Доступ к материалам, такие как: модели в формате "FBX", текстуры, запеченные карты "AO" и другое, вы можете получить оформив подписку на Patreon.
Patreon - 3DGROUNDСкачайте скрипт приведенный ниже, вызвав контекстное меню на ссылке "view raw" и нажав "Save link as...". Добавьте скрипт в проект, перетащив файл "wheelRotation.js" на панель "Assets" → "scripts".
Выберите во "Viewport" объект передних покрышек, затем нажмите в "Inspector" кнопку "Add Component", добавьте компонент "Script". Из списка скриптов "Add Script", выберите "wheelRotation".
Тоже самое проделайте для объекта задних покрышек и всех дисков. Важно, применять скрипт именно к объектам, а не к шаблонам или "Entity", который выше по иерархии.
Что удобно, не нужно делать каких-то дополнительных настроек, просто применяем скрипт и все готово.
Нажмите "Play", колеса стали крутиться! За счет того, что у нас смещается текстура и крутятся колеса создается эффект, что машина действительно едет по пустыне, хотя она статическая.
Скачайте скрипт "openDoors.js" и добавьте его в проект в "Assets" → "scripts".
Выберите во "Viewport" левые двери и примените к объекту скрипт "openDoors", предварительно добавив компонент "Script".
В настройках скрипта для левой двери обязательно установите "axis" равную "y" и включите флажок "Inverted".
По аналогии поступаем и с правой дверью. Выделяем объект во "Viewport", применяем компонент "Script", из списка выбираем "openDoors", указываем настройки как на скриншоте ниже.
И все тоже самое для двери заднего багажника.
Нажмите "Play", когда загрузится плеер, нажмите на клавиатуре кнопку 1, у вас откроются двери. Позже, мы сделаем открытие дверей по кнопке в интерфейсе.
Как видите, работа со криптами очень простая, а благодаря универсальным настройкам, их можно применять и в других проектах.
Скачайте скрипт "setColor.js" и добавьте его в проект в "Assets" → "scripts".
Примените скрипт к "Entity" - "Discs".
Выберите "Entity": "SM_WheeDisc_1", "SM_WheeDisc_2", "SM_WheeDisc_3". На панели "Inspector" и добавьте тег "disk". Не забудьте нажать Enter на клавиатуре, для добавления тега.
Скачайте скрипт "setColor.js" и добавьте его в проект в "Assets" → "scripts".
Примените скрипт к "Entity" - "Car". В настройках скрипта оставьте параметр "Material Tag" равным по-умолчанию.
Принцип работы данного скрипта: когда мы генерируем событие для смены цвета (нажатие кнопки в интерфейсе), для всех материалов, которые имеют тег "carpaint", будет изменен цвет "Diffuse", на тот, который мы будем передавать непосредственно через это событие.
Перейдите в панель "Assets", в поиске найдите все материалы нашего "M_CarPaint....", выделите эти материалы и в панели "Inspector", в форме "Tags", напишите тег "carpaint". Не забудьте нажать
Следующим этапом мы создадим интерфейс и свяжем нажатие кнопок и цветов.
Создайте новый "Entity" на панели "Hierarchy" с именем "UI". Затем, скачайте скачайте скрипт "ui.js" и добавьте его в проект в "Assets" → "scripts".
Назначьте скрипт "ui" для "Entity" - "UI", добавив компонент "Script" и выбрав из списка советующий скрипт.
В данном скрипте, мы создаем интерфейс посредством HTML кода. Добавляя динамически необходимые "div" элементы и определяем "CSS" стили.
Мы не будем подробно описывать весь процесс, поскольку, это выходит за рамки данного мастер-класса.
Принцип таков, что мы создаем блок по центру, внизу страницы, в который добавляем кнопки смены цветов и дополнительные кнопки смены дисков и открытия дверей.
В данном массиве мы определяем, какие будут цвета кнопок. "color" - это цвет для смены в материале, а "hex" - это шестнадцатеричный код цвета HTML кнопки.
color: new pc.Color(255.0/255.0, 131.0/255.0, 0/255.0),
hex: "#ff8300"
},
{
color: new pc.Color(82.0/255.0, 176.0/255.0, 0/255.0),
hex: "#52b000"
},
{
color: new pc.Color(17.0/255.0, 74.0/255.0, 151.0/255.0),
hex: "#114a97"
},
{
color: new pc.Color(162.0/255.0, 24.0/255.0, 24.0/255.0),
hex: "#a21818"
}
];
Размер кнопок задаем при помощи этой переменной.
Кнопки открытия дверей и смены колесных дисков. Здесь также определили дополнительные свойства, такие как название кнопки, размер иконки, сама иконка и название события, которое передаётся.
name: 'Door',
icon: iconDoor,
iconSize: '90%',
action: 'opendoor',
tag: '',
data: ''
},
{
name: 'Wheel',
icon: iconWheel,
iconSize: 'contain',
action: 'setdisk',
tag: 'disk',
data: ''
}
];
Иконки для кнопок смены цвета, мы генерируем динамически, создавая квадратный "div" блок с фоном и наложенным поверх "CSS" с полупрозрачным градиентом. Здесь вообще обошлись без какой-либо графики.
Кнопки открытия дверей и смены дисков, были нарисованы в Photopea в векторе, далее сохранен как "SVG", затем код из "SVG" был переведен в "CSS" код.
var iconDoor = "url("data:image/svg+xml,%3Csvg version='1.2' baseProfile='tiny-ps' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 164 165' width='164' height='165'%3E%3Ctitle%3Ecardoor%3C/title%3E%3Cstyle%3E tspan %7B white-space:pre %7D .s0 %7B fill: %23ffffff %7D %3C/style%3E%3Cpath fill-rule='evenodd' class='s0' d='m60.62 11.98c7.56-7.67 17.88-11.98 28.65-11.98h69.7c2.78 0 5.03 2.25 5.03 5.03v154.94c0 2.78-2.25 5.03-5.03 5.03h-121.71c-7.17 0-13.48-4.74-15.47-11.63l-20.35-70.43c-1.52-5.25-0.08-10.9 3.76-14.79l55.42-56.18zm50.05 81.59c0 3.33 2.7 6.04 6.04 6.04h21.13c3.33 0 6.04-2.7 6.04-6.04c0-3.33-2.7-6.04-6.04-6.04h-21.13c-3.33 0-6.04 2.7-6.04 6.04zm28.12-21.13c2.8 0 5.06-2.28 5.03-5.08l-0.43-41.73c-0.03-2.76-2.27-4.98-5.03-4.98h-44.91c-8.13 0-15.92 3.28-21.6 9.1l-31.67 32.44c-3.73 3.82-1.02 10.25 4.32 10.25h94.28z' /%3E%3C/svg%3E")";
Таким образом, мы не подключали дополнительно графику, и все иконки реализованы в виде кода.
По нажатию кнопки смены цвета, мы вызываем функцию "app.fire", в которой передаем имя события и сам цвет. Цвет мы берем динамически из массива "colors ".
Для открытия дверей и смены дисков вызываем событие динамически, где берем имя события и параметр тег из массива "buttons".
Таким образом мы связали интерфейс с другими скриптами. И можем удалять или добавлять новые цвета или кнопки в массивах, не меняя сам код скрипта "ui".
Примечание!
Обратите внимание, на то, что для скрипта "setColor", мы в параметрах указывали самостоятельно тег, а для скрипта "setDisk" тег передается динамически через событие. Это сделано специально, для демонстрации разных подходов к задаче.
В этой части мы добавили интерактивность нашей сцене, сделали интерфейс и проект обретает завершённость. В следующей части, мы улучшим освещение, тени и сделаем картинку более привлекательной.
FAQ
1. О чём эта статья?
2. Что рассматривается в Part 9?
3. Почему проект продолжает развиваться на протяжении многих частей?
4. Какие задачи обычно решаются на этом этапе разработки?
5. Почему важно улучшать визуальное качество проекта?
6. Как оптимизация влияет на пользовательский опыт?
7. Можно ли добавлять новые элементы конфигурации автомобиля?
8. Почему удобство интерфейса играет важную роль?
9. Подходит ли PlayCanvas для создания коммерческих конфигураторов?
10. Можно ли использовать подобные технологии за пределами автомобильной отрасли?
11. Почему важно поддерживать структуру проекта?
12. Могут ли такие проекты работать на мобильных устройствах?
13. Нужны ли знания программирования для реализации сложных функций?
14. Какие преимущества даёт интерактивный конфигуратор по сравнению с обычными изображениями?
15. Можно ли продолжать развивать проект после публикации?
16. Для кого будет полезна эта статья?
Vasyl Lukianenko is a 3D artist and technical author focused on practical workflows, optimization, and production-ready techniques. He publishes tutorials, courses, and tools to help artists work faster and get cleaner results.
Все публикации автора












{{comment.text}}