Blendering
Cтатьи
Меню

Поиск

Наш опрос
Чтобы Вы хотели увидеть на этом сайте?
Всего ответов: 191

Мини-чат
200

Друзья сайта

Реклама
Заработай на своем сайте

Статистика

Онлайн всего: 2
Гостей: 2
Пользователей: 0

Приветствую Вас, Гость · RSS 24.11.2024, 12:32

Главная » Статьи » Не мои статьи

Делаем машинку в игровом движке Блендера

 


Игровой движок Блендера использует 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

 

Категория: Не мои статьи | Добавил: blendering (12.02.2008)
Просмотров: 13448 | Комментарии: 15 | Рейтинг: 5.0/4 |
Всего комментариев: 7
7 tirbo  
0
А теперь в 2,5х не хочет работать...

6 O.din13  
0
Круто в воздух взлетает машинка!)

Колёса dynamic поставьте...


5 blendering  
0
Хм. они наверно дорабатывают его, я на 2.49 не ставил.

4 tirbo  
0
Все круто, только одно но, не идет на 2,49 !!!
И почему один от другого блендер всегда игровые движки меняет!!!

3 :)  
0
+1

2 EXer  
0
Класс

1 Новичёк блендинга  
0
круто!!!

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2024
Хостинг от uCoz