Как создать машину в блендере
моряк ТВМФ
3D моделирование авто в Blender 2.82. Урок 28.
3D моделирование авто в Blender 2.82. Урок 27.
3D моделирование авто в Blender 2.82. Урок 26.
3D моделирование авто в Blender 2.82. Урок 25.
3D моделирование авто в Blender 2.82. Урок24.
3D моделирование авто в Blender 2.82. Урок 23.
3D моделирование авто в Blender 2.82. Урок 22.
3D моделирование авто в Blender 2.82. Урок 21.
3D моделирование авто в Blender 2.82. Урок 20.
3D моделирование авто в Blender 2.82. Урок 19.
3D моделирование авто в Blender 2.82. Урок 18.
3D моделирование авто в Blender 2.82. Урок 17.
3D моделирование авто в Blender 2.82. Урок 16.
3D моделирование авто в Blender 2.82. Урок 15.
3D моделирование авто в Blender 2.82. Урок 14.
3D моделирование авто в Blender 2.82. Урок 13.
3D моделирование авто в Blender 2.82. Урок 12.
3D моделирование авто в Blender 2.82. Урок 11.
3D моделирование авто в Blender 2.82. Урок 10.
3D моделирование авто в Blender 2.82. Урок 9.
3D моделирование авто в Blender 2.82. Урок 8.
3D моделирование авто в Blender 2.82. Урок 7.
3D моделирование авто в Blender 2.82. Урок 6.
3D моделирование авто в Blender 2.82. Урок 5.
3D моделирование авто в Blender 2.82. Урок 4.
3D моделирование авто в Blender 2.82. Урок 3.
3D моделирование авто в Blender 2.82. Урок 2.
3D моделирование авто в Blender 2.82. Урок 1.
Моделирование и рендер автомобиля в Blender и Photoshop
В нашем сегодняшнем руководстве мы займемся моделированием автомобиля Lotus Elise при помощи Blender. Воспользуемся невероятным студийным освещением и проведем рендер при помощи движка Blender Cycles.
Композицию мы составим внутри compositor в Blender, а финальные эффекты и пост-обработка будут выполнены при помощи Photoshop. Запускайте Blender, и давайте приступим.
Давайте посмотрим на то, что мы сегодня будем создавать.
Моделируем и рендерим Lotus Elise
Настройка фоновых изображений
Добавьте то же изображение еще раз, выставите его в правом окне просмотра, и скопируйте параметры в соответствии с изображением.
Добавьте еще одно изображение для вида сверху.
Далее пойдут этапы создания изображений.
Нажмите SHIFT+A, чтобы добавить плоскость в окно просмотра в анфас, откройте панель инструментов клавишей Т, и включите привязку к просмотру. Перейдите в режим редактирования, нажав клавишу Tab, и выставите настройки в соответствии с нижеприведенным изображением.
Выберите верхние узлы, кликнув правой кнопкой мыши, а затем нажмите Е несколько раз, чтобы вытиснить их, и расставьте их так, как показано на изображении ниже.
Сделайте то же самое поверх заднего колеса.
Вытисните 2 угла с задней стороны, как показано на изображении ниже:
Вытисните их несколько раз и соедините их с передней частью. Выберите узлы, которые вы хотите связать, и нажмите Alt+M, чтобы их соединить.
Выберите верхний угол и вытисните его в соответствии с изображением ниже.
Вытисните их еще несколько раз, а затем выделите нижнюю часть, как показано ниже. Вы можете воспользоваться инструментом создания круглой области выделения, нажимая клавишу C для выделения нескольких узлов.
Перейдите в вид в анфас и перетащите эти узлы так, как показано, на фоновое изображение.
Выставите вытисненные углы в соответствии с чертежом из вида сверху.
Выделите 6 граней вокруг отверстия, которое должно быть на лицевой части корпуса.
Примените к ним тиснение и немного уменьшите их. Затем снова примените тиснение, и перетащите их по оси Z таким образом, чтобы образовалось отверстие.
Используйте тот же подход для задней части автомобиля для создания отверстий для фар и других дизайнерских решений.
Добавьте больше граней, и расположите их в соответствии с чертежом для создания кривых. Чтобы исключить различные части вроде дверец, выберите узлы и нажмите P, а затем выберите выделение, чтобы отделить его от объекта.
После того, как вы проделаете это, у вас должно получиться нечто похожее на изображение, приведенное ниже. Перейдите в панель редактирования и добавьте суб-поверхностный модификатор (sub-surf modifier). Поставьте галочку на оптимальном виде. Нижеприведенный скриншот демонстрирует нам распределение углов в соответствии с кривых корпуса.
Добавьте зеркальный модификатор (mirror modifier), затем выберите merge и clipping (соединение и обрезка). Теперь у вас готов привлекательный корпус автомобиля.
Добавляем колеса и дополнительные детали
Остальные части вроде фар можно создать при помощи основных фигур вроде блоков и плоскостей. Добавьте модификатор массива (array modifier), чтобы создать копии.
Стекла – это так же простые плоскости с небольшой кривой, примененной к ним. Всегда применяйте суб-поверхностный модификатор (sub-surf modifier), чтобы все выглядели плавно.
После того, как все детали будут собраны вместе, можно считать, что перед вами почти готовый автомобиль, и можно переходить к материалам.
Устанавливаем материалы и базовое освещение
Добавьте плоскость и несколько раз примените тиснение. Переключитесь на вид со стороны, и немного закруглите плоскость. Добавьте суб-поверхностный модификатор. Теперь у нас есть отличная плоскость, выступающая в роли стены студии.
Добавьте простую плоскость прямо над автомобилем, сделайте ее по размеру схожей с автомобилем.
В верхней панели в выпадающем списке выберите рендер Cycles.
Добавьте материал после выбора плоскости, измените тип поверхности на Emission. Силу установите на 5. Только что, при помощи этой плоскости, мы установили базовое освещение.
Выделите заднюю плоскость, и добавьте еще один материал, но теперь уже в качестве поверхности нужно будет выбрать diffuse, а в качестве цвета – темно-синий небесный цвет.
На нижней панели измените режим с solid на rendered. Теперь ваша сцена готова, и мы можем протестировать результаты наложения материалов.
Нам нужно соединить этот материал с нашей сценой, воспользовавшись пунктом меню «append from file» (добавить из файла).
Найдите скачанный файл материала, перейдите в папку material, и выберите там car paint material.
Чтобы создать оставшийся материал, вам нужно будет открыть редактор узлов. В Blender материал можно создавать двумя методами.
Вот параметры материала колес в редакторе узлов и в панели. Выберите mix shader, а в качестве параметров ввода шейдера используйте diffuse и translucent. Установите значение фактуры примерно на 0.3, чтобы получить вид резины.
Мы воспользуемся тем же методом для создания материала ободков: воспользуемся шейдерами glossy и diffuse для того, чтобы получить металлическую поверхность.
Шейдер для стекла примерно такой же, только смешан с glossy shader для получения отражений.
Пластик для решетки радиатора и дополнительных элементов дизайна также создан при помощи смеси glossy и diffuse. Но здесь нам нужно использовать меньшее значение roughness (шероховатости) в параметрах glossy shader, чтобы получить более реалистичный вид пластика.
Материал для тормозов и дисков внутри покрышки представляет собой смесь текстуры шума при выводе displacement. Вы можете добавить текстуру шума, нажав Shift+A и выбрав текстуру из меню Add.
Логотип на ободках и на капоте автомобиля потребует оригинальной текстуры логотипа Lotus. Ее можно найти в Google. Добавьте цилиндр, перейдите в вид в анфас в режиме редактирования, и тогда вы сможете выбрать либо смарт-проект UV, либо проект из вида при помощи нажатия клавиши U после того, как будут выбраны все узлы при помощи клавиши A. Масштаб настройте при открытой в редакторе изображений UV текстуре.
Добавьте камеру при помощи меню Add, нажмите клавишу 0, чтобы перейти к виду с камеры. Подберите хороший ракурс. Теперь вы можете самостоятельно установить камеру, а затем нажать Alt+Ctrl+0, чтобы привязать камеру к этому ракурсу. Перейдите во вкладку Camera, выберите линзу 35мм, поставьте галочки на пункты Limits и Title Safe – это поможет вам удерживать автомобиль в центре сцены.
В самом низу панели Camera вы сможете найти параметр глубины резкости, который нужно настроить таким образом, чтобы знак + достиг передней части автомобиля. Это и будет точкой фокусировки, а фоновые объекты будут немного размыты в рендере, что даст нам привлекательный визуальный эффект.
Освещение и рендеринг
Перейдите во вкладку World, там, на surface input, нажмите кнопку «use node», выберите фон, а затем выберите Environment texture в color input.
Если вы являетесь обладателем хорошей видео-карты, и хотите использовать ее для рендера, то можете пройти в пользовательские настройки из меню File. Перейдите во вкладку System, и выберите там CUDA в поле выбора вычислительного устройства. OpenCL пока еще не поддерживается, так что будет работать только на картах CUDA.
После выбора CUDA, в панели Render, вы можете выбрать GPU вместо CPU в качестве устройства. Хорошая видео-карта делает рендер гораздо быстрее, чем CPU.
В поле sampling выберите около 1000, чтобы получить рендер без шума. 500 будет достаточно, но мы рекомендуем вам выставить значение выше. Учтите, что вы можете остановить рендер нажатием клавиши Esc в том случае, если уже уверены в том, что качество вас устраивает. В Light paths выберите пункт Full Global Illumination. Укажите «No caustic» для быстрого рендера.
Как только рендер будет завершен, вы можете снова открыть редактор узлов для составления композиции. На этот раз, вместо того чтобы выбирать материал, выберите иконку render layers из нижней панели редактора узлов.
В меню Add выберите Render Layers. Выделите Use nodes, если в нижней панели там не проставлена галочка.
Добавьте узлы Viewer и Composite из меню Output.
Дважды добавьте узел glare из категории filter в меню Add. Свяжите их параметрами, приведенными на изображении, кликнув левой кнопкой мыши и перетащив узлы из outputs в inputs. Нажмите N, чтобы открыть панель параметров, и выберите там Backdrop, чтобы увидеть результат на фоне. Вы можете выставить уровень увеличения сразу под опцией Backdrop.
Сохраните оба изображения: оригинальный рендер и композицию. Откройте их в Photoshop. Поместите слой композиции поверх оригинального рендера, и слегка понизьте уровень непрозрачности, чтобы эффект свечения не был таким сильным.
Из меню Layer добавьте слой curve adjustment, внесите незначительные изменения в тени и полутени.
Добавьте слой Hue and Saturation, повысьте Saturation.
Наконец, соедините все слои и, открыв меню Filter, выберите Lens Correction. В открытом окне перейдите во вкладку Custom, и в качестве значения виньетирования (vignette) выставьте 30-45, чтобы сфокусировать внимание на автомобиле. Итак, теперь у вас есть результат!
Это и есть то, над чем мы сегодня собрались поработать. Надеемся, что вам понравилось сегодняшнее руководство.
Несмотря на то, что все выглядит настолько сложным, мы уверены, чтобы если вы проследовали по этому руководству от начала до конца, вы без проблем сможете применить полученные навыки на практике. Спасибо вам за то, что были с нами, и надеемся на какие-то отзывы с вашей стороны! Если вам есть что сказать, или вы просто хотите поблагодарить нас, вы можете сделать это посредством поля комментариев, доступным внизу страницы!
Вам понравился материал? Поблагодарить легко!
Будем весьма признательны, если поделитесь этой статьей в социальных сетях:
Как создать машину в блендере
В нём машинка, изображённая снизу.
Я создал модель и текстуры. Они распространяются под лицензией Creative Commons Attribution 3.0 Unported License.
Это означает, что вы можете использовать их как для персонального, так и для коммерческого использования. Нужно только указать моё имя и не выдавать работу за свою.
Если у вас нет модели машинки, то можете скачать её:
VehicleTutorial.blend ( Создано в Блендере 2.45 )
.blend содержит всё, что нужно – камера, пол и машинка.
Модель состоит из 5-ти игровых объектов– корпус машины и 4 колеса.
Машинка: настройки игрового движка
1. Выберите машинку и откройте панель настройки логики(F4).
Выбрать машинку кликом мыши.
Открыть настройки игровой логики (F4)
Меню Buttons Window >> Panels Logic (F4)
2. Сделайте объект актёром (Actor) и создайте границы для него (Bounds)
Выбрать актёра: щёлкнуть на нём
Установить границы: нажать кнопку Bounds
3. Выберите: Dynamics, Rigid Body, No sleeping.
Опции Dynamics, Rigid Body и No sleeping необходимы для работы Vehicle Wrapper
4. Установите Mass на 200.00.
Насколько тяжёлой хотите вашу машинку?
5. Оставьте значение Radius на 1.0.
На самом деле, не важно, какой радиус. Мы будем использовать параметр Bounds, а на него радиус не влияет.
6. Damp на 0.050
Я думаю, что этот параметр устанавливает трение. Если он установлен на 0.00, то машинка будет ехать и ехать и ехать… А если изменить на 1.00, то она будет стоять на месте и буксовать.
7. RotDamp на 0.110
То же, что и Damp, только для вращения.
8. Bounds (Границы взаимодействия).
У вас есть две настройки на выбор: Box или Convex Hull Polytope.
Преимущества:
Можно получить большее значение FPS – кадров в секунду, нежели при использовании Convex Hull Polytope.
(Полный экран. Display Lists. Enable All Frames. Mipmaps. 268 FPS)
Недостатки:
Центр меша и центр бокса перемещаются вместе.
Convex Hull Polytope.
Используются границы меша для взаимодействия со средой. И не важно, где расположен центр меша (т.е. pivot – пивот – пер.)
Преимущества:
Намного более лучшее взаимодействие со средой
Недостатки:
Снижение FPS.
(Полный экран. Display Lists. Enable All Frames. Mipmaps. 203 FPS)
Чтобы увидеть границы:
User Preference menu >> Game >> Show Physics Visualization
Колёса. 4 объекта. Значение Force (сила) установлено по оси Y колеса.
Теперь надо настроить камеру так, чтобы она следовала за машинкой.
1. Выберите камеру, которая будет следовать за машинкой.
2. В окне Buttons Window, откройте панель игровой логики (F4).
Buttons Window >> Panels Logic (F4)
3. Добавьте Sensor для камеры. Добавьте контроллер для камеры. Добавьте Actuator для камеры.
Выберите сенсор Always.
Щёлкните на кнопке True level trigger (кнопка с 3-мя точками) чтоб выключить её.
6. Выберите Camera Actuator. Произведите эти настройки:
OB:
Имя машинки, за которой будет следить камера.
Height:
Вес центра машинки.
Min:
Минимальная дистанция от центра машинки.
Сменить с 0.00 на 20.00
X Y кнопки:
относительная ось, которую будет использовать камера для слежения за машинкой.
(Когда машинка движется, камера всегда будет следовать сзади, как воздушный шарик на верёвочке.)
Max:
Максимальная дистанция от центра машинки.
Сменить с 0.00 дo 20.00
7. Соедините Sensor и Controller. Соедините Controller и Actuator.
Соедините, используя маленькие шарики справа. Протяните «нить» до похожего шарика слева.
Ещё нужен питонный скрипт для настройки машинки.
1. Выберите машинку.
2. В окне Buttons Window, откройте панель игровой логики (F4)
Buttons Window >> Panels Logic (F4)
3. Добавьте сенсор для машинки, добавьте контроллер. Переименуйте их, если считаете нужным.
Выберите сенсор Always.
Щёлкните на кнопке True level trigger чтоб выключить её.
5.Поменяйте контроллер AND на Python Controller.
Это можно сделать, выбрав Python из списка контроллеров (щёлкните по AND)
8. Соедините сенсор Always и Python Controller.
Используйте «шарики» справа (см. Выше)
Машинка: Настройка управления
Создадим питонный скрипт для управления машинкой: газ, тормоза, рулевое управление. Будем использовать клавиатуру для простоты управления.
1. Добавьте сенсор Keyboard.
3. Используйте клавишу W. (Сначала поле для назначения клавиши пустое. Нужно кликнуть по нему, появится надпись ‘Press a key’. Нажмите W.)
CarSetup.py создаст подвеску и «прикрепит» колёса на свои места.
Этот скрипт состоит всего из 57 строк кода.
(37, если не хотите получить хорошую подвеску.)
Недавно мы создали 2 пустых скрипта: CarSetup.py и Powertrain.py. Откройте CarSetup.py. Сюда мы добавим код для настройки машинки.
1. Откройте CarSetup.py в текстовом редакторе.
Для этого туториала я разбил скрипт на 3 части:
1. Создание ограничителя (constraint, констрэйнт)
2. Добавление колёс.
3. Настройка подвески.
Vehicle wrapper является частью модуля PhysicsConstraints.
Сделать его доступным можно с помощью импорта.
Транспортное средство, использующееся в этом уроке – легковая машина. Она состоит из 5-ти объектов – корпуса и 4-х колёс.
# get list of objects in scene objList = GameLogic.getCurrentScene().getObjectList() |
# get vehicle named Car_Red
car = objList[«OBCar_Red»]
# get tires named TireFD, TireFP, TireRD, TireRP
tire_FD = objList[«OBTireFD»]
tire_FP = objList[«OBTireFP»]
tire_RD = objList[«OBTireRD»]
tire_RP = objList[«OBTireRP»]
# keep the vehicle active, otherwise simulation stops: car.applyImpulse([ 0.0, 0.0, 0.0], [ 0.0, 0.0, 0.0]) |
# get car physics ID car_PhysicsID = car.getPhysicsId() |
# create a vehicle constraint
vehicle_Constraint = PhysicsConstraints.createConstraint(car_PhysicsID, 0, 11)
Этот скрипт будет запущен только 1 раз для настройки машинки. Так или иначе, код для двигателя, рулевого управления, тормозов, спидометра и т.д. будет запускаться по мере необходимости и будет требовать наличия constraint ID.
# get the constraint ID and save it as an objCar variable car.constraint_ID = vehicle_Constraint.getConstraintId() |
6. Создадим vehicle constraint.
# get the vehicle constraint
vehicle = PhysicsConstraints.getVehicleConstraint(car.constraint_ID)
Функция для добаления колёс к машине
vehicle.addWheel( tire, tirePos, suspensionAngle, tireAxis,
suspensionHeight, tireRadius, tireSteer )
tire:
object being used for the tire.
tirePos:
Where is each tire positioned before the suspension is added.
This is the x, y and z distance of the tire’s object center from the car’s object center. Uses the x, y and z axis of the car’s object center.
Type:
List [ x, y, z] float values
I like to think of this as the car frame.
suspension_Angle:
This is the angle the car’s suspension is attached to the car frame.
Uses the x, y and z axis of the car’s object center.
Type:
List [ x, y, z] float values
Range:
-1.0 to 1.0. (Cosine values?)
tireAxis:
tire axis used to attach the tire to the car frame.
This determines the direction that car moves.
(The force that moves the vehicle is applied to the y axis of the tire.)
And the direction the tires rotate.
Type:
List [ x, y, z] float values
Range:
-1.0 to 1.0. (Cosine values?)
suspensionHeight:
This is the z distance from the car frame.
tireRadius:
What is the actual radius of the tires on your car?
This is used to calculate the number of times the tire rotates.
And the distance the tire’s object center is from the road surface.
(If the actual tire radius is 0.75 and you use 0.5, the tire will sink into the road.)
tireSteer:
Tire is a steering tire?
Type:
Bool
True or False. 1 or 0
1. tire: Назначение колёсам имён. (3-й шаг по созданию Vehicle Constraint.).
Переднее левое колесо: tire_FD
Переднее правое: tire_FP
Заднее левое: tire_RD
Заднее правое: tire_RP
5. Высота привода (высота, на которую поднимается корпус по отношению к колёсам)
# tire radius tireRadius_FD = 0.75 tireRadius_FP = 0.75 tireRadius_RD = 0.75 tireRadius_RP = 0.75 |
# tire has steering? tireSteer_FD = True tireSteer_FP = True tireSteer_RD = False tireSteer_RP = False |
# Add front driver tire vehicle.addWheel( tire_FD, tirePos_FD, suspensionAngle_FD, tireAxis_FD, suspensionHeight_FD, tireRadius_FD, tireSteer_FD ) |
# Add front passenger tire
vehicle.addWheel( tire_FP, tirePos_FP, suspensionAngle_FP, tireAxis_FP,
suspensionHeight_FP, tireRadius_FP, tireSteer_FP )
# Add rear driver tire
vehicle.addWheel( tire_RD, tirePos_RD, suspensionAngle_RD, tireAxis_RD,
suspensionHeight_RD, tireRadius_RD, tireSteer_RD )
# Add rear passenger tire
vehicle.addWheel( tire_RP, tirePos_RP, suspensionAngle_RP, tireAxis_RP,
suspensionHeight_RP, tireRadius_RP, tireSteer_RP )
Настройка подвески
Замечание:
Все эти настройки могут быть изменены в любое время и в любом скрипте.
Когда колёса будут прикреплены к машине, вы сможете настроить трение, настроить подвеску и др. Если не настроить их самим, то будут использрваны настройки по умолчанию.
vehicle.setTyreFriction(friction, tire) friction: Type: float tire: Type: integer 0 = 1st tire added 1 = 2nd tire added 2 = 3rd tire added 3 = 4th tire added |
# tire friction
vehicle.setTyreFriction(10.0, 0)
vehicle.setTyreFriction(10.0, 1)
vehicle.setTyreFriction(10.0, 2)
vehicle.setTyreFriction(10.0, 3)
vehicle.setSuspensionCompression(amount, tire) amount: Type: float tire: Type: integer 0 = 1st tire added 1 = 2nd tire added 2 = 3rd tire added 3 = 4th tire added |
# suspension compression
vehicle.setSuspensionCompression(6.0, 0)
vehicle.setSuspensionCompression(6.0, 1)
vehicle.setSuspensionCompression(6.0, 2)
vehicle.setSuspensionCompression(6.0, 3)
vehicle.svehicle.setSuspensionDamping(amount, tire)
amount:
Type: float
tire:
Type: integer
0 = 1st tire added
1 = 2nd tire added
2 = 3rd tire added
3 = 4th tire added
# suspension damping
vehicle.setSuspensionDamping(5.0, 0)
vehicle.setSuspensionDamping(5.0, 1)
vehicle.setSuspensionDamping(5.0, 2)
vehicle.setSuspensionDamping(5.0, 3)
vehicle.vehicle.setSuspensionStiffness(amount, tire)
amount:
Type: float
tire:
Type: integer
0 = 1st tire added
1 = 2nd tire added
2 = 3rd tire added
3 = 4th tire added
# suspension stiffness
vehicle.setSuspensionStiffness(18.5, 0)
vehicle.setSuspensionStiffness(18.5, 1)
vehicle.setSuspensionStiffness(18.5, 2)
vehicle.setSuspensionStiffness(18.5, 3)
vehicle.setRollInfluence(amount, tire) amount: Type: float tire: Type: integer 0 = 1st tire added 1 = 2nd tire added 2 = 3rd tire added 3 = 4th tire added |
# roll influence
vehicle.setRollInfluence( 0.08, 0)
vehicle.setRollInfluence( 0.08, 1)
vehicle.setRollInfluence( 0.08, 2)
vehicle.setRollInfluence( 0.08, 3)
Законченный скрипт будет выглядеть примерное так:
# import PhysicsConstraints
import PhysicsConstraints
# get list of objects in scene
objList = GameLogic.getCurrentScene().getObjectList()
# get vehicle named Car_Red
car = objList[«OBCar_Red»]
# get tires
tire_FD = objList[«OBTireFD»]
tire_FP = objList[«OBTireFP»]
tire_RD = objList[«OBTireRD»]
tire_RP = objList[«OBTireRP»]
# keep the vehicle active, otherwise simulation stops:
car.applyImpulse([ 0.0, 0.0, 0.0], [ 0.0, 0.0, 0.0])
######################### Create the vehicle constraint
# get physics ID
car_PhysicsID = car.getPhysicsId()
# create a vehicle constraint
vehicle_Constraint = PhysicsConstraints.createConstraint(car_PhysicsID, 0, 11)
# get the constraint ID and save it as an car variable
car.constraint_ID = vehicle_Constraint.getConstraintId()
# get the vehicle constraint ID
vehicle = PhysicsConstraints.getVehicleConstraint(car.constraint_ID)
######################## Add the wheels to the vehicle
# suspension height
suspensionHeight_FD = 0.3
suspensionHeight_FP = 0.3
suspensionHeight_RD = 0.3
suspensionHeight_RP = 0.3
# tire radius
tireRadius_FD = 0.75
tireRadius_FP = 0.75
tireRadius_RD = 0.75
tireRadius_RP = 0.75
# tire has steering?
tireSteer_FD = True
tireSteer_FP = True
tireSteer_RD = False
tireSteer_RP = False
# Add front driver tire
vehicle.addWheel( tire_FD, tirePos_FD, suspensionAngle_FD, tireAxis_FD,
suspensionHeight_FD, tireRadius_FD, tireSteer_FD )
# Add front passenger tire
vehicle.addWheel( tire_FP, tirePos_FP, suspensionAngle_FP, tireAxis_FP,
suspensionHeight_FP, tireRadius_FP, tireSteer_FP )
# Add rear driver tire
vehicle.addWheel( tire_RD, tirePos_RD, suspensionAngle_RD, tireAxis_RD,
suspensionHeight_RD, tireRadius_RD, tireSteer_RD )
# Add rear passenger tire
vehicle.addWheel( tire_RP, tirePos_RP, suspensionAngle_RP, tireAxis_RP,
suspensionHeight_RP, tireRadius_RP, tireSteer_RP )
# tire friction
vehicle.setTyreFriction(10.0, 0)
vehicle.setTyreFriction(10.0, 1)
vehicle.setTyreFriction(10.0, 2)
vehicle.setTyreFriction(10.0, 3)
# suspension compression
vehicle.setSuspensionCompression(6.0, 0)
vehicle.setSuspensionCompression(6.0, 1)
vehicle.setSuspensionCompression(6.0, 2)
vehicle.setSuspensionCompression(6.0, 3)
# suspension damping
vehicle.setSuspensionDamping(5.0, 0)
vehicle.setSuspensionDamping(5.0, 1)
vehicle.setSuspensionDamping(5.0, 2)
vehicle.setSuspensionDamping(5.0, 3)
# suspension stiffness
vehicle.setSuspensionStiffness(18.5, 0)
vehicle.setSuspensionStiffness(18.5, 1)
vehicle.setSuspensionStiffness(18.5, 2)
vehicle.setSuspensionStiffness(18.5, 3)
Используется vehicle wrapper для настройки управления газом, тормозами, задним ходом и поворотами.
Для урока я условно разбил скрипт на 3 части.
1. Получение ID констрэйнта.
2. Газ и тормоза Gas and brakes.
3. Рулевое управление
Получение ID констрэйнта для машинки.
ID констрэйнта был создан во время настройки машины. Мы сохранили его как переменную для объекта машинки. После этого мы можем задать ID констрэйнта для машинки.
# import PhysicsConstraints import PhysicsConstraints |
2. Задать имя машинки
# get list of objects in scene objList = GameLogic.getCurrentScene().getObjectList() |
# get vehicle named Car_Red
car = objList[«OBCar_Red»]
# get the vehicle constraint ID vehicle = PhysicsConstraints.getVehicleConstraint(constraint_ID) |
Настройка газа и тормозов
# get the sensor named Gas
gasPedal = controller.getSensor(«Gas»)
# get sensor named Brake
brakeReverse = controller.getSensor(«Brake»)
# get sensor named Ebrake
eBrake = controller.getSensor(«Ebrake»)
# no gas? check the brakes.
elif brakeReverse.isPositive() == True:
power = 800.0
# No gas and no brake?
else:
power = 0.0
# emergency brake? if eBrake.isPositive() == True: force = 100.0 |
# no emergency brake
else:
force = 0.0
Engine force is applied to the y axis of the tire.
power:
Type: float
tire:
Type: integer
0 = 1st tire added in CarSetup.py
1 = 2nd tire added in CarSetup.py
2 = 3rd tire added in CarSetup.py
3 = 4th tire added in CarSetup.py
force:
Type: float
tire:
Type: integer
0 = 1st tire (wheel) added in CarSetup.py
1 = 2nd tire added in CarSetup.py
2 = 3rd tire added in CarSetup.py
3 = 4th tire added in CarSetup.py
# back tires only.
vehicle.applyBraking( force, 2)
vehicle.applyBraking( force, 3)
# get sensor named Left
steerLeft = controller.getSensor(«Left»)
# get senor named Right
steerRight = controller.getSensor(«Right»)
2. Поворот налево? Направо?
amount:
Type: float
tire:
Type: integer
0 = 1st tire added in CarSetup.py
1 = 2nd tire added in CarSetup.py
2 = 3rd tire added in CarSetup.py
3 = 4th tire added in CarSetup.py
# steer with front tires only
vehicle.setSteeringValue(turn,0)
vehicle.setSteeringValue(turn,1)
# import PhysicsConstraints
import PhysicsConstraints
# get list of objects in scene
objList = GameLogic.getCurrentScene().getObjectList()
# get vehicle named Car_Red
car = objList[«OBCar_Red»]
# get the constraint ID
constraint_ID = car.constraint_ID
# get the vehicle constraint ID
vehicle = PhysicsConstraints.getVehicleConstraint(constraint_ID)
# get the current controller
controller = GameLogic.getCurrentController()
# get the sensor named Gas
gasPedal = controller.getSensor(«Gas»)
# get sensor named Brake
brakeReverse = controller.getSensor(«Brake»)
# get sensor named Emergency
eBrake = controller.getSensor(«EBrake»)
# no gas? check the brakes.
elif brakeReverse.isPositive() == True:
power = 800.0
# No gas and no brake?
else:
power = 0.0
# emergency brake
if eBrake.isPositive() == True:
force = 100.0
# no emergency brake
else:
force = 0.0
# apply power to all four wheels
vehicle.applyEngineForce( power, 0)
vehicle.applyEngineForce( power, 1)
vehicle.applyEngineForce( power, 2)
vehicle.applyEngineForce( power, 3)
# emergency brake. back tires only.
vehicle.applyBraking( force, 2)
vehicle.applyBraking( force, 3)
# get sensor named Left
steerLeft = controller.getSensor(«Left»)
# get senor named Right
steerRight = controller.getSensor(«Right»)
# go straight?
else:
turn = 0.0
# steer with front tires only
vehicle.setSteeringValue(turn,0)
vehicle.setSteeringValue(turn,1)
Если всё сделано правильно, то нажимайте P и ездите на своей машинке, используя клавиатуру!
Если хотите узнать больше о движке Bullet и vehicle wrapper, вот ссылка на документацию о них:
Vehicle Wrapper
Один момент, не раскрытый в этом туторе: One
getWheelRotation
(Это работает как спидометр.)
Немного математики – и можно будет следить за скоростью машинки.