Author Topic: Пример 129: машинки (исправленный)  (Read 67 times)

0 Members and 1 Guest are viewing this topic.

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 910
  • Reputation 36
  • Game making is my hobby for life!
Пример 129: машинки (исправленный)
« on: March 18, 2019, 04:39:24 PM »
Привет всем!
Как вы знаете в стандартных примерах WS3D есть пример 129 "Physics vehicles". В общем пример с машинками, в котором используется физика Ньютон.
В примере был один серьёзный недостаток, который не позволял новичку что-то сделать на основе примера. Камера смотрела всегда в одну точку рядом с текущей машинкой. Проблема исправлена. Теперь камера смотрит верёд, по ходу движения машинки.
Изменение числа 50 на любое другое будет влиять на расстояние, на котором камера перестанет догонять машину.
Изменяя коэффициент 4, можно отрегулировать, насколько быстро камера догонит автомобиль.
Обновлённый код:
Code: [Select]
'' ----------------------------------------------------------------------------'' Пример сделал Nikolas (WorldSim3D developer)
'' ----------------------------------------------------------------------------
'' Пример 129: Демонстрация физики автомобиля (физ. движок Newton)
'' ----------------------------------------------------------------------------

'#define __STATIC__

#Include "../Include/WorldSim3D.bi"
#include "../Include/SampleFunctions.bi"

'Режим трансмиссии
type VehicleDrivingMode as UInt32
enum
    FronDrive=0,
    BackDrive=1,
    FullDrive=2,
    CountDrive=3
end enum

'Структура с параметрами создания авто
type VehicleCreateData
   
    'Параметры визуализации
    carMesh as Zstring ptr                      'Путь к модели кузова
    tireCount as Int32                           'Число колес автомобиля
    tireMesh as Zstring ptr ptr                    'Пути к моделям колес
    tirePosition as wVector3f ptr                  'Указатель на массив, содержащий позиции колес

    speedTexture as Zstring ptr                 'Путь к текстуре циферблата спидометра
    arrowTexture as Zstring ptr                 'Путь к текстуре- стрелке спидометра
    tahoTexture as Zstring ptr                  'Путь к текстуре циферблата тахометра
    handBrakeTexture as ZString ptr             'Путь к текстуре- индикатор включения "ручника"
    transTexture(3) as ZString ptr              'Путь к текстурам-индикаторам режима трансмиссии

    soundEngine as ZString ptr                  'Путь к звуковому файлу вука мотора
    soundStart as ZString ptr                   'Путь к звуку стартера
    soundBrake as ZString ptr                   'Путь к звуку тормозов
    soundStrafe as ZString ptr                  'Путь к звуку при заносах (условно)

    carName as ZString ptr                         'Название автомобиля

    'Физические параметры автомобиля
    carMass as Float32                  =1500.f    'Масса кузова
    tireMass as Float32                 =20.f    'Масса колеса

    'Параметры рулевого управления
    maxSteerAngle as Float32            =40.f    'Максимальный угол поворота колеса
    steerSpeed as Float32               =0.03f    'Cкорость поворота колеса

    'Параметры двигателя
    motorForce as Float32               =10.f    'Сила мотора
    maxSpeed as Float32                 =200.f    'Максимальная скорость
    maxRPM as Float32                   =6000.f    'Максимальные обороты двигателя
    idleRPM as Float32                  =1000.f    'Холостые обороты двигателя

    'КПП
    gearsBox as Float32 ptr             =0        'Коробка передач
    gearsVisual as ZString ptr ptr      =0        'Указатель на массив с путями к текстурам- визуализация включенных передач
    gearsCount as Int32                         'Число передач
    neutralGearIndex as Int32                     'Индекс нейтральной передачи
    reverseGearIndex as Int32                     'Индекс задней передачи
    firstGearIndex as Int32                       'Индекс первой передачи
    lastGearIndex as Int32                        'Индекс высшей передачи

    'Параметры подвески
    SLenght as Float32                  =2.0f    'Длина свободного хода подвески
    SConst as Float32                   =125.f    'Коэффициент жесткости подвески
    SDamper as Float32                  =2.f    'Коэффициент упругости подвески

    'Тормозная система и коэффициенты трения
    turnForceHelper as Float32          =0.15f    'Дополнительная сила при поворотах (эффект разворота)
    brakeForce as Float32               =100.f    'Сила торможения
    brakeLateralFriction as Float32     =1.f    'Коэффициент поперечного трения при торможении
    brakeLongitudinalFriction as Float32=2.f    'Коэффициент продольного (радиального) трения при торможении

    lateralFriction as Float32          =0.5f    'Коэффициент поперечного трения
    longitudinalFriction as Float32     =1.475f    'Коэффициент продольного трения

    'Коэффициент, влияющий на эффект "пробуксовки" ведущих колес
    tireSpinTorqueFactor as Float32     =0.015f

end type

'Структура с параметрами обновления авто
type VehicleUpdateData

    resetPosition as wVector3f          'Позиция рестарта
    resetAngle as Float32               'Горизотальный угол рестарта

    currentPosition as wVector3f        'Текущая позиция автомобиля

    vehicle as wNode                    'Указатель на автомобиль
    vehicleBody as wNode                'Указатель на физ. кузов авто

    carName as Zstring ptr              'Название автомобиля

    tireCount as Int32                  'Число колес автомобиля

    currentSteer as Float32             'Текущий угол поворота колес
    steerSpeed as Float32               'Скорость поворота управляемых колес

    motorON as Boolean            =false  'Флаг включения/отключения двигателя
    isCurrent as Boolean        =false  'Является ли автомобиль текущим (для обновления)

    motorForce as Float32               'Сила мотора

    currentSpeed as Float32                'Текущая скорость
    speedFactor as Float32        =1.5f   'Чисто субъективное ощущение: скорость, возвращаемая физ. движком Ньютон- меньше реальной.
                                        'Поэтому ввел такой коэффициент

    maxSpeed as Float32                 'Максимальная скорость
    maxRPM as Float32                   'Максимальные обороты двигателя
    idleRPM as Float32                  'Холостые обороты двигателя
    currentRPM as Float32               'Tекущие обороты двигателя

    isOnAir as Boolean                  'Флаг равен true, если все колеса авто. находятся "в воздухе"
    handBrake as Boolean        =false  'Флаг, отвечающий за ручной тормоз (ручник)

    gearsBox as Float32 ptr                'Указатель на массив, содержащий передаточные числа КПП
    gearsVisual as wArray               'Указатель на массив с текстурами- визуализация включенных передач
    gearsCount as Int32                 'Число передач КПП
    neutralGearIndex as Int32           'Индекс элемента в массиве, явл. нейтралью
    reverseGearIndex as Int32           'Индекс элемента в массиве, отвечающий за задний ход
    currentGearIndex as Int32           'Индекс текущей передачи
    firstGearIndex as Int32             'Индекс первой передачи
    lastGearIndex as Int32              'Индекс высшей передачи

    mode as VehicleDrivingMode          'Режим трансмиссии (передний/задний/полный привод)

    soundEngine as wSound               'Звук мотора
    soundStart as wSound                'Звук стартера
    soundBrake as wSound                'Звук торможения
    soundStrafe as wSound               'Звук при заносах (условно)

    soundEginePitch as Float32          'Частота звука двигателя будет изменяться в зависимости от RPM
    soundEngineVolume as Float32        'Громкость двигателя будет изменяться в зависимости от RPM

    speedTexture as wTexture            'Текстура циферблата спидометра
    arrowTexture as wTexture            'Текстура стрелки (используется для спидометра и тахометра)
    tahoTexture as wTexture             'Текстура циферблата тахометра
    handBrakeTexture as wTexture        'Текстура индикатора стояночного тормоза ("ручника")
    transTexture(3) as wTexture         'Текстуры- индикаторы трансмиссии

    sizeTexture as wVector2i            'Требуемый размер текстур для отображения на экране
    scaleTexture as wVector2f           'Масштаб текстур (исходный размер трех текстур должен быть одинаковым)
    positionSpidometr as wVector2i      'Позиция текстуры спидометра на экране
    positionTahometr as wVector2i       'Позиция текстуры тахометра на экране

    sizeTexture2 as wVector2i           'Требуемый размер текстур диаграммы КПП и приводов для отображения на экране
    scaleTexture2 as wVector2f          'Масштаб текстур КПП и диаграммы приводов
    positionGearBox as wVector2i        'Позиция текстуры включенной передачи КПП на экране
    positionDrive as wVector2i          'Позиция текстуры- диаграммы текущего привода автомобиля

    positionHandBrake as wVector2i      'Позиция текстуры индикатора стояночного тормоза
    scaleTexture3 as wVector2f          'Масштаб текстуры индикатора "ручника"

    positionTrans as wVector2i          'Позиция текстуры индикатора режима трансмиссии
    scaleTexture4 as wVector2f          'Масштаб текстуры индикатора режима трансмиссии

    arrowSpeedAngle as Float32          'Угол поворота стрелки спидометра
    arrowSpeedAngleCoeff as Float32     'Выравнивающий коэффициент для угла поворота стрелки спидометра

    arrowTahoAngle as Float32           'Угол поворота стрелки тахометра
    arrowTahoAngleCoeff as Float32      'Выравнивающий коэффициент для угла поворота стрелки тахометра
   
   
end type

'Функция создания авто
declare function CreatePhysAuto(byval vData as VehicleCreateData,_
                                byval position as wVector3f,_
                                byval angle as Float32,_
                                byval scale as Float32,_
                                byval rotateMesh as Boolean=false) as VehicleUpdateData

'Процедура обновления авто
declare sub UpdatePhysAuto(byref Car as VehicleUpdateData,_
                           byval font as wFont)

'Процедура удаления авто (если требуется)
declare sub DestroyPhysAuto(byref Car as VehicleUpdateData)

'Вабор режима трансмиссии текущего авто
declare sub SetPhysAutoDrivingMode(byref Car as VehicleUpdateData,_
                                    mode as VehicleDrivingMode)


'///Variables
Dim shared as wNode Camera          =0
Dim shared as wNode currentTargetNode=0

Dim as wTexture testTexture           =0
Dim as wTexture bulletTexture         =0
Dim as wMaterial material             =0

Dim as wFont Font                     =0

Dim as wVector3f vec1                  =wVECTOR3f_ZERO

Dim as wVector2i fromPos,toPos

Dim as VehicleCreateData buggyData
Dim as VehicleCreateData imprezaData

Dim shared as const Int32 numCars    =2
Dim as VehicleUpdateData Cars(numCars)
Dim as VehicleUpdateData currentCar

Dim as Int32 currentCarIndex           =0
Dim as VehicleDrivingMode currentMode

Dim as Int32 matGround                 =0
Dim as wSound v_g_Sound               =0
Dim as wSound v_v_Sound               =0

Dim as Boolean drawHelp               =false

Dim as string wndCaption             ="Example 129: Physics vehicle "

Dim as Int32 prevFPS                   =0
Dim shared as wVector2u screenSize            =(1024,768)

'///Start engine
Dim as Boolean init=wEngineStart(wDRT_OPENGL,screenSize,32,FALSE,TRUE,TRUE,FALSE)

if Not init then
    PrintWithColor("wEngineStart() failed!")
    end
endif

'///Show engine logo
wEngineShowLogo(true)

Dim as string fontPath="../../Assets/Fonts/Cyr.xml"
Dim as string bulletPath="../../Assets/Textures/lava0005.png"
Dim as string texPath="../../Assets/Textures/default_texture.png"
Dim as string soundPath="../../Assets/Sounds/sndBangMono.ogg"

'///Check resources
CheckFilePath(fontPath)
CheckFilePath(bulletPath)
CheckFilePath(texPath)
CheckFilePath(soundPath)

'///Start physic
wPhysStart()

'///Load resources
Font=wFontLoad(fontPath)
bulletTexture=wTextureLoad(bulletPath)
testTexture=wTextureLoad(texPath)
v_g_Sound=wSoundLoad(soundPath,false)
v_v_Sound=wSoundLoad(soundPath,false)
wSoundSetMaxVolume(v_g_Sound,1.f)
wSoundSetVolume(v_g_Sound,1.f)

wSoundSetMaxVolume(v_v_Sound,1.f)
wSoundSetVolume(v_v_Sound,1.f)
'//wSoundSetRelative(v_g_Sound,true)

'///Configure phys. world
vec1.x=15000: vec1.y=15000: vec1.z=15000
wPhysSetWorldSize(vec1)
wPhysSetSolverModel(wPSM_LINEAR2)

vec1.x=0: vec1.y=-20: vec1.z=0
wPhysSetGravity(vec1)

CreateGround(10)

'///Ищем физ. нод с именем "ground"
'///Нод с таким именем был создан в процедуре CreateGround()
Dim as wNode temp=0
temp=wPhysGetBodyByName("ground")
if temp<>0 then
     matGround=wPhysBodyGetMaterial(temp)
endif

'///Create camera
vec1.x=80: vec1.y=40: vec1.z=100
Camera = wCameraCreate(vec1,wVECTOR3f_ZERO)

wCameraSetClipDistance(Camera, 12000,1)

'///Создаем автомобиль Buggy
buggyData.carName=@"Buggy"
buggyData.carMesh=@"../../Assets/Models/Jeep/chassis.ms3d"

buggyData.tireCount=4

Dim as Zstring ptr tireInfo(buggyData.tireCount)
tireInfo(0)=@"../../Assets/Models/Jeep/FLWheel.ms3d"'///front left
tireInfo(1)=@"../../Assets/Models/Jeep/FRWheel.ms3d"'///front right
tireInfo(2)=@"../../Assets/Models/Jeep/BLWheel.ms3d"'///back left
tireInfo(3)=@"../../Assets/Models/Jeep/BRWheel.ms3d"'///back right
buggyData.tireMesh=@tireInfo(0)

Dim as wVector3f tirePosition(buggyData.tireCount)
tirePosition(0).x=11
tirePosition(0).y=-1.8
tirePosition(0).z=8.5'///front left

tirePosition(1).x=11
tirePosition(1).y=-1.8
tirePosition(1).z=-8.5'///front right

tirePosition(2).x=-10.5
tirePosition(2).y=-1.8
tirePosition(2).z=8.5'///back left

tirePosition(3).x=-10.5
tirePosition(3).y=-1.8
tirePosition(3).z=-8.5'///back right

buggyData.tirePosition=@tirePosition(0)

buggyData.carMass=1500.f
buggyData.tireMass=40.f

buggyData.motorForce=15.f
buggyData.brakeForce=20.f
buggyData.maxSpeed=140.f

buggyData.gearsCount=6
Dim as Float32 gearsBox(buggyData.gearsCount)
gearsBox(0)=0.f
gearsBox(1)=0.2f
gearsBox(2)=0.5f
gearsBox(3)=0.7f
gearsBox(4)=1.0f
gearsBox(5)=-0.3f

buggyData.gearsBox=@gearsBox(0)

buggyData.neutralGearIndex=0
buggyData.reverseGearIndex=5
buggyData.firstGearIndex=1
buggyData.lastGearIndex=4

Dim as ZString ptr gearsVisual(buggyData.gearsCount)
gearsVisual(0)=@"../../Assets/Sprites/gear_N.png"
gearsVisual(1)=@"../../Assets/Sprites/gear_1.png"
gearsVisual(2)=@"../../Assets/Sprites/gear_2.png"
gearsVisual(3)=@"../../Assets/Sprites/gear_3.png"
gearsVisual(4)=@"../../Assets/Sprites/gear_4.png"
gearsVisual(5)=@"../../Assets/Sprites/gear_R.png"

buggyData.gearsVisual=@gearsVisual(0)

buggyData.handBrakeTexture=@"../../Assets/Sprites/hand_brake.png"

buggyData.transTexture(0)=@"../../Assets/Sprites/transmission_front.png"
buggyData.transTexture(1)=@"../../Assets/Sprites/transmission_back.png"
buggyData.transTexture(2)=@"../../Assets/Sprites/transmission_full.png"

buggyData.tahoTexture=@"../../Assets/Textures/tahometr.png"
buggyData.speedTexture=@"../../Assets/Textures/spidometr.png"
buggyData.arrowTexture=@"../../Assets/Textures/needle2.png"

buggyData.soundEngine=@"../../Assets/Sounds/sndEngineMono.ogg"
buggyData.soundStart=@"../../Assets/Sounds/sndStarter.ogg"
'buggyData.soundBrake="../../Assets/Sounds/sndBrake.ogg"
buggyData.soundBrake=@"../../Assets/Sounds/sndStrafe.ogg"
buggyData.soundStrafe=@"../../Assets/Sounds/sndStrafe.ogg"

vec1.x=0: vec1.y=20: vec1.z=0
Cars(0)=CreatePhysAuto(buggyData,vec1,0,1.5f,true)

'///Устанавливаем поправочные коэффициенты для стрелок тахометра и спидометра
'///Это необходимо для адекватного подсчета углов наклона стрелок
Cars(0).arrowSpeedAngleCoeff=205.f
Cars(0).arrowTahoAngleCoeff=180.f

'///Устанавливаем режим трансмиии- полный привод
currentMode=FullDrive
SetPhysAutoDrivingMode(Cars(0),currentMode)
Cars(0).mode=currentMode

'///Делаем созданный автомобиль- текущим автомобилем для обновления.
currentCar=Cars(0)
currentCar.isCurrent=true
currentCarIndex=0

'///Создаем автомобиль Impreza
imprezaData.carName=@"Impreza"
imprezaData.carMesh=@"../../Assets/Models/Impreza/impreza1.3ds"

imprezaData.tireCount=4

Dim as ZString ptr tireInfo2(imprezaData.tireCount)

tireInfo2(0)=@"../../Assets/Models/Impreza/tire1.3ds"'front left
tireInfo2(1)=@"../../Assets/Models/Impreza/tire1.3ds"'///front right
tireInfo2(2)=@"../../Assets/Models/Impreza/tire1.3ds"'///back left
tireInfo2(3)=@"../../Assets/Models/Impreza/tire1.3ds"'///back right
imprezaData.tireMesh=@tireInfo2(0)

Dim as wVector3f tirePosition2(imprezaData.tireCount)
tirePosition2(0).x=11
tirePosition2(0).y=-3
tirePosition2(0).z=7'front left

tirePosition2(1).x=11
tirePosition2(1).y=-3
tirePosition2(1).z=-7'front right

tirePosition2(2).x=-11
tirePosition2(2).y=-3
tirePosition2(2).z=7'back left

tirePosition2(3).x=-11
tirePosition2(3).y=-3
tirePosition2(3).z=-7'back right

imprezaData.tirePosition=@tirePosition2(0)

imprezaData.carMass=1200.f
imprezaData.tireMass=40.f

imprezaData.motorForce=15.f
imprezaData.brakeForce=30.f

imprezaData.maxSpeed=190.f
imprezaData.maxRPM=8000.f

imprezaData.gearsCount=8
Dim as Float32 gearsBox2(imprezaData.gearsCount)
gearsBox2(0)=0.f
gearsBox2(1)=0.15f
gearsBox2(2)=0.3f
gearsBox2(3)=0.5f
gearsBox2(4)=0.7f
gearsBox2(5)=0.85f
gearsBox2(6)=1.0f
gearsBox2(7)=-0.5f

imprezaData.gearsBox=@gearsBox2(0)

imprezaData.neutralGearIndex=0
imprezaData.reverseGearIndex=7
imprezaData.firstGearIndex=1
imprezaData.lastGearIndex=6

Dim as ZString ptr gearsVisual2(imprezaData.gearsCount)
gearsVisual2(0)=@"../../Assets/Sprites/gear_N.png"
gearsVisual2(1)=@"../../Assets/Sprites/gear_1.png"
gearsVisual2(2)=@"../../Assets/Sprites/gear_2.png"
gearsVisual2(3)=@"../../Assets/Sprites/gear_3.png"
gearsVisual2(4)=@"../../Assets/Sprites/gear_4.png"
gearsVisual2(5)=@"../../Assets/Sprites/gear_5.png"
gearsVisual2(6)=@"../../Assets/Sprites/gear_6.png"
gearsVisual2(7)=@"../../Assets/Sprites/gear_R.png"

imprezaData.gearsVisual=@gearsVisual2(0)

imprezaData.soundEngine=@"../../Assets/Sounds/sndEngineMono2.ogg"

vec1.x=0: vec1.y=20: vec1.z=100
Cars(1)=CreatePhysAuto(imprezaData,vec1,0,1.5f,true)

Cars(1).arrowSpeedAngleCoeff=280.f
Cars(1).arrowTahoAngleCoeff=250.f

'///Скопируем часть настроек из предыдущего автомобиля
Cars(1).arrowTexture=Cars(0).arrowTexture
Cars(1).speedTexture=Cars(0).speedTexture
Cars(1).tahoTexture=Cars(0).tahoTexture
Cars(1).handBrakeTexture=Cars(0).handBrakeTexture

Cars(1).soundBrake=Cars(0).soundBrake
Cars(1).soundStart=Cars(0).soundStart
Cars(1).soundStrafe=Cars(0).soundStrafe

Cars(1).transTexture(0)=Cars(0).transTexture(0)
Cars(1).transTexture(1)=Cars(0).transTexture(1)
Cars(1).transTexture(2)=Cars(0).transTexture(2)

Cars(1).scaleTexture.x=Cars(0).scaleTexture.x
Cars(1).scaleTexture.y=Cars(0).scaleTexture.y

Cars(1).scaleTexture2.x=Cars(0).scaleTexture2.x
Cars(1).scaleTexture2.y=Cars(0).scaleTexture2.y

Cars(1).scaleTexture3.x=Cars(0).scaleTexture3.x
Cars(1).scaleTexture3.y=Cars(0).scaleTexture3.y

Cars(1).scaleTexture4.x=Cars(0).scaleTexture4.x
Cars(1).scaleTexture4.y=Cars(0).scaleTexture4.y

'///Устанавливаем режим трансмиии- полный привод
currentMode=FullDrive
SetPhysAutoDrivingMode(Cars(1),currentMode)
Cars(1).mode=currentMode

'///Устанавливаем звук удара корпуса автомобилей о преграды (пол и стены арены)
for i as Int32 =0 to numCars-1
    Dim as Int32 mat=wPhysBodyGetMaterial(Cars(i).vehicleBody)
    wPhysMaterialSetContactSound(mat,matGround,v_g_Sound)
next

'///Устанавливаем звук удара автомобилей между собой
for f as Int32 =0 to numCars-1
     Dim as Int32 mat_1=wPhysBodyGetMaterial(Cars(f).vehicleBody)
     for j as Int32=1 to numCars-1
         Dim as Int32 mat_2=wPhysBodyGetMaterial(Cars(j).vehicleBody)
         wPhysMaterialSetContactSound(mat_1,mat_2,v_v_Sound)
     next
next

'///Hide mouse cursor
'//wInputSetCursorVisible(false)

Dim as wColor4s backColor=(255,155, 155, 255)

while(wEngineRunning())
   
    wSceneBegin(backColor)
   
    wSceneDrawAll()

    wGuiDrawAll()
   
    '///Показываем/прячем справку
    if wInputIsKeyHit(wKC_F1) then
        drawHelp= not drawHelp
    endif

    '///Меняем текущий автомобиль
    if wInputIsKeyHit(wKC_TAB) then
         currentCar.isCurrent=false
         currentCar.currentGearIndex=currentCar.neutralGearIndex
         currentCar.handBrake=true
         currentCar.motorON=false
         
         if currentCar.soundEngine <>0 then
             wSoundStop(currentCar.soundEngine)
         endif
           
         currentCarIndex+=1
         if currentCarIndex>numCars-1 then
            currentCarIndex=0
         endif
         currentCar=Cars(currentCarIndex)
         currentCar.isCurrent=true
    endif

    '///Переключаем режим трансмиссии у текущего автомобиля
    if wInputIsKeyHit(wKC_F5) then
        Dim as UInt32 curMode=Cast(UInt32,currentMode)
        curMode+=1
        currentMode=Cast(VehicleDrivingMode,curMode)
       
        if currentMode=CountDrive then
             currentMode=FronDrive
        endif       
       
        SetPhysAutoDrivingMode(currentCar,currentMode)
        currentCar.mode=currentMode
    endif
   
    '///Переключение передач на повышенную
    if wInputIsKeyHit(wKC_KEY_Q) then
        '///Переходим на следующую передачу, если это возможно
        if currentCar.currentGearIndex < currentCar.lastGearIndex and currentCar.currentGearIndex <> currentCar.reverseGearIndex then
            currentCar.currentGearIndex+=1
        endif
       
        '///Если была включена задняя передача- включаем первую
        if currentCar.currentGearIndex=currentCar.reverseGearIndex then
             currentCar.currentGearIndex=currentCar.firstGearIndex
        endif
    endif

    '///Включение/отключение двигателя
    if wInputIsKeyHit(wKC_RETURN) then
        currentCar.motorON= not currentCar.motorON
       
        '///Если мотор заводится, включаем нейтраль
        if currentCar.motorON then
            if currentCar.currentGearIndex <> currentCar.neutralGearIndex then
                currentCar.currentGearIndex=currentCar.neutralGearIndex
            endif
        endif
       
        '///Запускаем звук стартера
        if currentCar.soundStart<>0 then
            if currentCar.motorON then
                wSoundPlay(currentCar.soundStart,false)
            endif
        endif

     endif

     '///Переключение передач на пониженную (до нейтрали)
     if wInputIsKeyHit(wKC_KEY_A) then
         if currentCar.currentGearIndex > currentCar.neutralGearIndex then
             currentCar.currentGearIndex-=1
         endif
     endif

     '///Включение нейтральной передачи
     if wInputIsKeyHit(wKC_KEY_N) then
         currentCar.currentGearIndex=currentCar.neutralGearIndex
     endif

     '///Задний ход
     if wInputIsKeyHit(wKC_KEY_R) then
         currentCar.currentGearIndex=currentCar.reverseGearIndex
     endif

     '///Включение отключение ручного тормоза (ручника)
     if wInputIsKeyHit(wKC_KEY_T) then
         currentCar.handBrake= not currentCar.handBrake
     endif

     '///Обновляем текущий автомобиль
     UpdatePhysAuto(currentCar,Font)

     '///Если в других машинах включен ручник- применяем эту настройку
     for i as Int32 =0 to numCars-1
         if Cars(i).vehicle <>0 then
             if (not Cars(i).isCurrent) and Cars(i).handBrake then
                wPhysVehicleSetBrake(Cars(i).vehicle,true)
             endif
         endif
     next

    '///Обновляем физику
    wPhysUpdate(0.5f)

    fromPos.x=20: fromPos.y=20
    toPos.x=250: toPos.y=40

    if drawHelp then
         wFontDraw(Font, "Light Mouse: Shot ball", fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "Right Mouse: Take body", fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "TAB: next AUTO", fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "F2: Restart current auto",fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "F5: Transmission mode (Front/Back/Full)", fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "Enter: Engine ON/OFF",fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "Q: Next gear",fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "A: Prev. gear",fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "R: Reverse gear",fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "N: Neutral gear",fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "Up: Forward",fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "Down: Brake",fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "Left: Steer left",fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "Right: Steer right",fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "T: Hand brake ON/OFF",fromPos,toPos)
     else
         wFontDraw(Font, "F1: HELP", fromPos,toPos)
         fromPos.y+=20: toPos.y+=20
         wFontDraw(Font, "ESC: Exit", fromPos,toPos)
     endif


    if wInputIsMouseHit(wMB_LEFT) then
         CreateBullet(150,bulletTexture)
    endif

    MousePick(wInputIsMousePressed(wMB_RIGHT))
   
    wSceneEnd()
   
    '///Close by ESC
    wEngineCloseByEsc()
   
    '///Update fps
    if prevFPS <> wEngineGetFPS() then
        prevFPS = wEngineGetFPS()
        wWindowSetCaption(wndCaption+str(prevFPS))
    endif
wend

'///Удаляем автомобили
for i as Int32 =0 to numCars-1
    if Cars(i).vehicle<>0 then
       DestroyPhysAuto(Cars(i))
    endif
next

wPhysStop()

'///Stop engine
wEngineStop()

end

'======================================='
'Функция создания авто
function CreatePhysAuto(byval vData as VehicleCreateData,_
                                byval position as wVector3f,_
                                byval angle as Float32,_
                                byval scale as Float32,_
                                byval rotateMesh as Boolean=false) as VehicleUpdateData

    Dim as wVector3f vec
   
    '///Загружаем меши кузова и колес, создаем ноды.
    Dim as wMesh carMesh=wMeshLoad(vData.carMesh)

    '///! Меняем ориентацию меша автомобиля
    if rotateMesh then
        vec.x=0: vec.y=90: vec.z=0
        wMeshSetRotation(carMesh,vec)
    endif

    Dim as wNode carNode=wNodeCreateFromMesh(carMesh)

    '///Настраиваем материалы
    Dim as wMaterial material=0
   
    for i as Int32 = 0 to wNodeGetMaterialsCount(carNode)-1
        material=wNodeGetMaterial(carNode,i)
        wMaterialSetFlag(material,wMF_LIGHTING,false)
    next

    wNodeSetName(carNode,vData.carName)
   
    vec.x=0: vec.y=90+angle: vec.z=0
    wNodeSetRotation(carNode,vec)
   
    vec.x=scale: vec.y=scale: vec.z=scale
    wNodeSetScale(carNode,vec)

    '/// Создаем выпуклый физ. объект- кузов будущего авто.
    Dim as wNode carBody=wPhysBodyCreateHull(carNode,vData.carMass)

    Dim as Int32 matId=wPhysMaterialCreate()
    wPhysBodySetMaterial(carBody,matId)

    wNodeSetParent(carBody,carNode)

    Dim as wMesh tireMesh(vData.tireCount)
    Dim as wNode tireNode(vData.tireCount)

    for i as Int32 =0 to vData.tireCount-1
        tireMesh(i)=wMeshLoad(vData.tireMesh[i])
        tireNode(i)=wNodeCreateFromMesh(tireMesh(i))
       
        vec.x=scale: vec.y=scale: vec.z=scale
        wNodeSetScale(tireNode(i),vec)
       
        for k as Int32 =0 to wNodeGetMaterialsCount(tireNode(i))-1
            material=wNodeGetMaterial(tireNode(i),k)
            wMaterialSetFlag(material,wMF_LIGHTING,false)
        next
       
    next

    '/// Вычисляем размеры будущих колес
    Dim as wVector3f tireMin,tireMax
    wNodeGetBoundingBox(tireNode(0),@tireMin,@tireMax)
    Dim as wVector3f tireSize=wMathVector3fSubstract(tireMax,tireMin)
    Dim as Float32 tireRadius=2*tireSize.y*scale

    Dim as Float32 tireWidth=wMathFloatMax2(tireSize.x,tireSize.z)*scale

    '/// Изменяем позиции будущих колес с учетом масштаба
    Dim as wVector3f tirePosition(vData.tireCount)

    for i as Int32 = 0 to vData.tireCount-1
        Dim as wVector3f p=vData.tirePosition[i]
        tirePosition(i).x = p.x * scale
        tirePosition(i).y = p.y* scale
        tirePosition(i).z = p.z * scale
    next

    Dim as VehicleUpdateData carData

    '/// Считываем настройки двигателя
    carData.motorForce=vData.motorForce
    carData.maxSpeed=vData.maxSpeed*carData.speedFactor
    carData.maxRPM=vData.maxRPM
    carData.idleRPM=vData.idleRPM
    carData.vehicleBody=carBody

    '/// Считываем настройки числа колес и рулевого управления
    carData.tireCount=vData.tireCount
    carData.steerSpeed=vData.steerSpeed

    '/// Считываем позицию и ориентацию рестарта
    carData.resetPosition=position
    carData.resetAngle=angle

    '/// Считываем настройки КПП
    carData.gearsBox=vData.gearsBox
    carData.gearsCount=vData.gearsCount
    carData.neutralGearIndex=vData.neutralGearIndex
    carData.reverseGearIndex=vData.reverseGearIndex
    carData.firstGearIndex=vData.firstGearIndex
    carData.lastGearIndex=vData.lastGearIndex
    carData.carName=vData.carName

    '/// Ставим авто на нейтраль
    carData.currentGearIndex=vData.neutralGearIndex

    '/// Создаем физ. автомобиль
    carData.vehicle=wPhysVehicleCreate(    vData.tireCount,_
                                        wPVT_RAYCAST_WORLD,_
                                        carBody)

    '/// Добавляем два передних поворотных колеса
    Dim as Int32 tireFrontLeft=wPhysVehicleAddTire(    carData.vehicle,_
                                                    tireNode(0),_
                                                    wPVTT_ACCEL_STEER,_
                                                    tirePosition(0),_
                                                    vData.tireMass,_
                                                    tireRadius,_
                                                    tireWidth,_
                                                    vData.SLenght,_
                                                    vData.SConst,_
                                                    vData.SDamper)

    Dim as Int32 tireFrontRight=wPhysVehicleAddTire(carData.vehicle,_
                                                    tireNode(1),_
                                                    wPVTT_ACCEL_STEER,_
                                                    tirePosition(1),_
                                                    vData.tireMass,_
                                                    tireRadius,_
                                                    tireWidth,_
                                                    vData.SLenght,_
                                                    vData.SConst,_
                                                    vData.SDamper)

    '/// Добавляем задние колеса
    Dim as Int32 tireBackLeft=wPhysVehicleAddTire(    carData.vehicle,_
                                                    tireNode(2),_
                                                    wPVTT_ACCEL,_
                                                    tirePosition(2),_
                                                    vData.tireMass,_
                                                    tireRadius,_
                                                    tireWidth,_
                                                    vData.SLenght,_
                                                    vData.SConst,_
                                                    vData.SDamper)

    Dim as Int32 tireBackRight=wPhysVehicleAddTire(carData.vehicle,_
                                                    tireNode(3),_
                                                    wPVTT_ACCEL,_
                                                    tirePosition(3),_
                                                    vData.tireMass,_
                                                    tireRadius,_
                                                    tireWidth,_
                                                    vData.SLenght,_
                                                    vData.SConst,_
                                                    vData.SDamper)

    '/// Устанавливаем максимальный угол поворота передних колес
    wPhysVehicleSetTireMaxSteerAngle(carData.vehicle,_
                                    tireFrontLeft,_
                                    vData.maxSteerAngle)
                                   
    wPhysVehicleSetTireMaxSteerAngle(carData.vehicle,_
                                    tireFrontRight,_
                                    vData.maxSteerAngle)

    '///Для задних- устанавливаем нули
    wPhysVehicleSetTireMaxSteerAngle(carData.vehicle,tireBackLeft,0)
    wPhysVehicleSetTireMaxSteerAngle(carData.vehicle,tireBackRight,0)

    '/// Настройка влияет на разворачиваемость автомобиля
    wPhysVehicleSetTireTurnForceHelper(    carData.vehicle,_
                                        tireFrontLeft,_
                                        vData.turnForceHelper)
                                       
    wPhysVehicleSetTireTurnForceHelper(    carData.vehicle,_
                                        tireFrontRight,_
                                        vData.turnForceHelper)
                                       
    wPhysVehicleSetTireTurnForceHelper(    carData.vehicle,_
                                        tireBackLeft,_
                                        0)
   
    wPhysVehicleSetTireTurnForceHelper(carData.vehicle,_
                                        tireBackLeft,_
                                        0)

    '/// Сила торможения колес
    wPhysVehicleSetTireBrakeForce(    carData.vehicle,_
                                    tireFrontLeft,_
                                    vData.brakeForce)
                                   
    wPhysVehicleSetTireBrakeForce(    carData.vehicle,_
                                    tireFrontRight,_
                                    vData.brakeForce)
                                   
    wPhysVehicleSetTireBrakeForce(    carData.vehicle,_
                                    tireBackLeft,_
                                    vData.brakeForce/2)
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Tiranas

  • Friends
  • Esquire
  • *
  • Posts: 75
  • Reputation 35
  • Совсем Тёмный.
Re: Пример 129: машинки (исправленный)
« Reply #1 on: May 08, 2019, 05:09:00 PM »
Посмотрел пример, камера следует за авто и смотрит на авто, но не смотрит всегда по ходу автомобиля при поворотах.

http://prntscr.com/nm194p
Покажи пожалуйста как сделать чтобы камера смотрела всегда вперёд походу автомобиля.

« Last Edit: May 08, 2019, 05:12:20 PM by Tiranas »
Людям с более широким кругозором ведомо, что четкой границы между реальным, действительным и ирреальным воображаемым не существует, что каждый из нас, благодаря тонким физиологическим и психологическим различиям, воспринимает все явления по-своему. (Говард Филлипс Лавкрафт)