Игровой движок Блендера использует Bullet Physics. Физический движок Bullet умеет раскладывать транспорт на составные части (Vehicle Wrapper), а это очень удобно при создании реалистичного оснащения машины. За считанные минуты вы сможете создать подвеску, рулевое управление, тормоза, ускорение и т.д.
Если у вас нет собственной модели машины, можете скачать .blend, прилагающийся к этому тутору. VehicleTutorial.blend В нём машинка, изображённая снизу.
Я создал модель и текстуры. Они распространяются под лицензией Creative Commons Attribution 3.0 Unported License. Это означает, что вы можете использовать их как для персонального, так и для коммерческого использования. Нужно только указать моё имя и не выдавать работу за свою.
Если у вас нет модели машинки, то можете скачать её: VehicleTutorial.blend ( Создано в Блендере 2.45 ) .blend содержит всё, что нужно – камера, пол и машинка. Модель состоит из 5-ти игровых объектов– корпус машины и 4 колеса.
Важно! Все части машины используют ось у для передвижения. Корпус машинки: ось у – длина, х – ширина, z – высота. Колёса: ось у – длина, х – ширина, z – высота. Машинка: настройки игрового движка 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. Box: Со средой взаимодействует «бокс» - мнимый «ящик», ограничивающий меш машинки. Используется центр меша для центра бокса. Преимущества: Можно получить большее значение 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. Actor - отключить. Bounds - отключить. Повторите это для всех колёс. Важно! Поставьте машинку на трэк. НЕ ставьте колёса на трэк. НЕ ставьте колёса под арки корпуса.
Камера Теперь надо настроить камеру так, чтобы она следовала за машинкой. 1. Выберите камеру, которая будет следовать за машинкой. 2. В окне Buttons Window, откройте панель игровой логики (F4). Buttons Window >> Panels Logic (F4) 3. Добавьте Sensor для камеры. Добавьте контроллер для камеры. Добавьте Actuator для камеры. 4. Включите сенсор Always. По умолчанию, при выборе сенсора Always будет включена кнопка TRUE level triggering. Если оставить так, то камера будет возвращаться к слежению за машинкой снова и снова. Это убьёт FPS.
Выберите сенсор Always. Щёлкните на кнопке True level trigger (кнопка с 3-мя точками) чтоб выключить её. 5. Контроллер AND . ( Он выбран по умолчанию. Можете переименовать его, если хотите)
6. Выберите Camera Actuator. Произведите эти настройки: OB: Имя машинки, за которой будет следить камера. Height: Вес центра машинки. Min: Минимальная дистанция от центра машинки. Сменить с 0.00 на 20.00 X Y кнопки: относительная ось, которую будет использовать камера для слежения за машинкой. (Когда машинка движется, камера всегда будет следовать сзади, как воздушный шарик на верёвочке.) Max: Максимальная дистанция от центра машинки. Сменить с 0.00 дo 20.00 OB: Имя объекта машинки. (Car_Red, если вы скачали мой .blend) Height(Вес): 6.00 Min: 20.00 X Yкнопки: Y Max: 20.00 7. Соедините Sensor и Controller. Соедините Controller и Actuator. Соедините, используя маленькие шарики справа. Протяните «нить» до похожего шарика слева. Машинка: Настройки Ещё нужен питонный скрипт для настройки машинки. 1. Выберите машинку. 2. В окне Buttons Window, откройте панель игровой логики (F4) Buttons Window >> Panels Logic (F4) 3. Добавьте сенсор для машинки, добавьте контроллер. Переименуйте их, если считаете нужным. 4. Выберите сенсор Always. По умолчанию, при выборе сенсора Always будет включена кнопка TRUE level triggering. Если оставить так, то камера будет возвращаться к слежению за машинкой снова и снова. Это убьёт FPS.
Выберите сенсор Always. Щёлкните на кнопке True level trigger чтоб выключить её.
5.Поменяйте контроллер AND на Python Controller. Это можно сделать, выбрав Python из списка контроллеров (щёлкните по AND) 6. Используйте Text Editor (текстовый редактор), чтобы создать пустой питонный скрипт CarSetup.py. Откройте SR:5 - Scripting User Preference >> Layout box >> SR:5 - Scripting Добавьте пустой скрипт в текстовый редактор. Text Editor >> ADD NEW Назовите его CarSetup.py
7. Контроллер Python. вместо Script:...... напишите CarSetup.py открыть SR:2 - Model User Preference>> Layout box >> SR:5 - Scripting Python Controller: Script:.... Написать CarSetup.py 8. Соедините сенсор Always и Python Controller. Используйте «шарики» справа (см. Выше) Машинка: Настройка управления Создадим питонный скрипт для управления машинкой: газ, тормоза, рулевое управление. Будем использовать клавиатуру для простоты управления. 1. Добавьте сенсор Keyboard. 2. Назовите его Gas. (Скрипт будет искать имя сенсора Gas)
3. Используйте клавишу W. (Сначала поле для назначения клавиши пустое. Нужно кликнуть по нему, появится надпись 'Press a key'. Нажмите W.) 4. Повторите пункты 1,2 и 3: Тормоз S Налево A Направо D Ручной тормоз Пробел
5. Добавьте Python Controller.
6. В текстовом редакторе создайте пустой питонный скрипт. Назовите его Powertrain.py. Open SR:5 - Scripting User Preference menu >> Layout box >> SR:5 - Scripting Add an empty script to the text editor. Text Editor menu >> arrowheads >> ADD NEW Name it Powertrain.py 6. Соедините сенсоры Keyboard к новому питонному контроллеру CarSetup.py создаст подвеску и «прикрепит» колёса на свои места. Этот скрипт состоит всего из 57 строк кода. (37, если не хотите получить хорошую подвеску.) Недавно мы создали 2 пустых скрипта: CarSetup.py и Powertrain.py. Откройте CarSetup.py. Сюда мы добавим код для настройки машинки. 1. Откройте CarSetup.py в текстовом редакторе. Open SR:5 - Scripting User Preference menu >> Layout box >> SR:5 - Scripting Open CarSetup.py Text Editor menu >> arrowheads >> CarSetup.py Для этого туториала я разбил скрипт на 3 части: 1. Создание ограничителя (constraint, констрэйнт) 2. Добавление колёс. 3. Настройка подвески. Создание Констрэйнта. Vehicle wrapper является частью модуля PhysicsConstraints. Сделать его доступным можно с помощью импорта. 1. Импорт модуля PhysicsConstraints.
# import PhysicsConstraints import PhysicsConstraints |
Транспортное средство, использующееся в этом уроке – легковая машина. Она состоит из 5-ти объектов – корпуса и 4-х колёс. 2. Собираем машинку. # 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"] |
3. Я не уверен, нужен ли следующий кусок кода. Но можно его и оставить.
# keep the vehicle active, otherwise simulation stops: car.applyImpulse([ 0.0, 0.0, 0.0], [ 0.0, 0.0, 0.0]) |
4. Следующий шаг – создание констрэйнта для корпуса машинки. (Тип констрэйнта для транспортного средства – 11).
# get car physics ID car_PhysicsID = car.getPhysicsId() # create a vehicle constraint vehicle_Constraint = PhysicsConstraints.createConstraint(car_PhysicsID, 0, 11) |
Этот скрипт будет запущен только 1 раз для настройки машинки. Так или иначе, код для двигателя, рулевого управления, тормозов, спидометра и т.д. будет запускаться по мере необходимости и будет требовать наличия constraint ID.
5. Создадим переменную для сохранения 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. Type: Object name 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?) [0.0, 0.0, -1.0] attaches the suspension under the car's object center. [0.0, 0.0, 1.0] attaches the suspension above the car's object center. 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. Type: float 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.) Type: float 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 2. Создадим «основу» машинки, поместив колёса на свои места. # tire position from car's object center (local axis) tirePos_FD = [ -2.0, 3.0, -1.0] tirePos_FP = [ 2.0, 3.0, -1.0] tirePos_RD = [ -2.0, -3.0, -1.0] tirePos_RP = [ 2.0, -3.0, -1.0] |
3. Высота подвески. # suspension angle from car object center suspensionAngle_FD = [ 0.0, 0.0, -1.0] suspensionAngle_FP = [ 0.0, 0.0, -1.0] suspensionAngle_RD = [ 0.0, 0.0, -1.0] suspensionAngle_RP = [ 0.0, 0.0, -1.0] |
4. Оси, по которым колёса прикреплены к корпусу.
# tire axis attached to axle tireAxis_FD = [ -1.0, 0.0, 0.0] tireAxis_FP = [ -1.0, 0.0, 0.0] tireAxis_RD = [ -1.0, 0.0, 0.0] tireAxis_RP = [ -1.0, 0.0, 0.0] |
5. Высота привода (высота, на которую поднимается корпус по отношению к колёсам) 6. Радиус колеса # tire radius tireRadius_FD = 0.75 tireRadius_FP = 0.75 tireRadius_RD = 0.75 tireRadius_RP = 0.75 |
7. Назначение ведущих колёс
# tire has steering? tireSteer_FD = True tireSteer_FP = True tireSteer_RD = False tireSteer_RP = False |
8. Присоединение колёс к машине
# 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 ) |
Настройка подвески Замечание: Все эти настройки могут быть изменены в любое время и в любом скрипте. Когда колёса будут прикреплены к машине, вы сможете настроить трение, настроить подвеску и др. Если не настроить их самим, то будут использрваны настройки по умолчанию. 1. Насколько хороши ваши колёса?
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) |
2. Подвеска
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) |
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) |
CarSetup.py
Законченный скрипт будет выглядеть примерное так: # 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 # tire position from car object center tirePos_FD = [ -2.0, 3.0, -1.0] tirePos_FP = [ 2.0, 3.0, -1.0] tirePos_RD = [ -2.0, -3.0, -1.0] tirePos_RP = [ 2.0, -3.0, -1.0] # suspension angle from car object center suspensionAngle_FD = [ 0.0, 0.0, -1.0] suspensionAngle_FP = [ 0.0, 0.0, -1.0] suspensionAngle_RD = [ 0.0, 0.0, -1.0] suspensionAngle_RP = [ 0.0, 0.0, -1.0] # tire axis attached to axle tireAxis_FD = [ -1.0, 0.0, 0.0] tireAxis_FP = [ -1.0, 0.0, 0.0] tireAxis_RD = [ -1.0, 0.0, 0.0] tireAxis_RP = [ -1.0, 0.0, 0.0] # 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 ) ################################ Fine tune the suspension # 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) # roll influence vehicle.setRollInfluence( 0.08, 0) vehicle.setRollInfluence( 0.08, 1) vehicle.setRollInfluence( 0.08, 2) vehicle.setRollInfluence( 0.08, 3) |
Powertrain.py – это скрипт, запускающийся по запросу.
Используется vehicle wrapper для настройки управления газом, тормозами, задним ходом и поворотами. В третьей части урока (Игровая логика) мы создали 2 пустых скрипта - CarSetup.py и Powertrain.py. Перед этим мы написали код для CarSetup.py. Теперь напишем скрипт Powertrain.py. 1. Откройте Powertrain.py в текстовом редакторе Open SR:5 - Scripting User Preference menu >> Layout box >> SR:5 - Scripting Open Powertrain.py Text Editor menu >> arrowheads >> Powertrain.py Для урока я условно разбил скрипт на 3 части. 1. Получение ID констрэйнта. 2. Газ и тормоза Gas and brakes. 3. Рулевое управление Получение ID констрэйнта для машинки. ID констрэйнта был создан во время настройки машины. Мы сохранили его как переменную для объекта машинки. После этого мы можем задать ID констрэйнта для машинки. 1. Импортируйте модуль PhysicConstraints.
# import PhysicsConstraints import PhysicsConstraints | 2. Задать имя машинки # get list of objects in scene objList = GameLogic.getCurrentScene().getObjectList() # get vehicle named Car_Red car = objList["OBCar_Red"] |
3. Зададим имя констрэйнта, который мы сохранили во время настройки машинки как переменную.
# get the constraint ID constraint_ID = car.constraint_ID |
4. Используйте его для получения ID констрэйнта для транспорта.
# get the vehicle constraint ID vehicle = PhysicsConstraints.getVehicleConstraint(constraint_ID) | Настройка газа и тормозов 1. Назначение текущего контроллера.
# get the current controller controller = GameLogic.getCurrentController() |
2. Назначение сенсоров для газа, тормоза и ручного тормоза. ################ Gas -- Brakes -- Reverse # 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") |
3. Газ нажат: какое ускорение? 4. Кнопка «тормоз» нажата: насколько быстрым будет торможение?
# gas pedal? if gasPedal.isPositive() == True: power = -800.0 # no gas? check the brakes. elif brakeReverse.isPositive() == True: power = 800.0 # No gas and no brake? else: power = 0.0 | 5. Ручной тормоз. # emergency brake? if eBrake.isPositive() == True: force = 100.0 # no emergency brake else: force = 0.0 |
6. Применить силу. 4 колеса.
vehicle.applyEngineForce(power, tire) 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 # apply power to all four wheels vehicle.applyEngineForce( power, 0) vehicle.applyEngineForce( power, 1) vehicle.applyEngineForce( power, 2) vehicle.applyEngineForce( power, 3) |
7. Ручной тормоз. Только для задних колёс.
vehicle.applyBraking(force, tire) 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) |
Рулевое управление 1. Создадим сенсоры для поворота влево и вправо.
############# Steering # get sensor named Left steerLeft = controller.getSensor("Left") # get senor named Right steerRight = controller.getSensor("Right") |
2. Поворот налево? Направо?
# turning left ? if steerLeft.isPositive() == True: turn = .3 # no? turning right? elif steerRight.isPositive() == True: turn = -.3 # not turning? go straight. else: turn = 0.0 |
3. Рулевое управление vehicle.setSteeringValue(amount, tire) 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) |
Powertrain.py Законченный скрипт будет выглядеть примерно так:
# 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() ################ Gas -- Brakes -- Reverse # 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") # gas pedal? if gasPedal.isPositive() == True: power = -800.0 # 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) ############# Steering # get sensor named Left steerLeft = controller.getSensor("Left") # get senor named Right steerRight = controller.getSensor("Right") # turn left? if steerLeft.isPositive() == True: turn = .3 # turn right? elif steerRight.isPositive() == True: turn = -.3 # go straight? else: turn = 0.0 # steer with front tires only vehicle.setSteeringValue(turn,0) vehicle.setSteeringValue(turn,1) |
Если всё сделано правильно, то нажимайте P и ездите на своей машинке, используя клавиатуру! Если есть проблемы – вот ссылка на готовый .blend. Всё настроено и в рабочем состоянии. VehicleFinished.blend Если хотите узнать больше о движке Bullet и vehicle wrapper, вот ссылка на документацию о них: Vehicle Wrapper Один момент, не раскрытый в этом туторе: One getWheelRotation (Это работает как спидометр.) Немного математики – и можно будет следить за скоростью машинки. Перевод - GoG
|