Recent Posts

Pages: [1] 2 3 ... 10
1
WorldSim3D developing / WE ARE GOING TO MOVE!
« Last post by Alec - WS3D Developer on April 21, 2019, 01:25:39 PM »
Hello dear users of Worldsim3D!
We have some changes. WE ARE MOVING to another hosting. Why? Unfortunately, the current hosting has become fully paid (all tariffs), and even the basic tariff is not very cheap. Therefore, for such enthusiasts as the WorldSim3D team, hosting fees have become an unbearable burden. Let me remind that our project is non-profit. (True, the current hosting company offered to move to their child hosting, there is a free tariff, but it was rather difficult to move the forum there, I tried, the forum database import / export turned out to be so time consuming that I just didn?t spend many hours to figure it out, although I still killed a few hours for this).
In view of this, it was decided to move to yukoz. I have long been familiar with this hosting company. Yes, they, too, for enthusiasts has its drawbacks (advertising, for example), but with the current technology to cope with advertising, this is almost not a problem.
Please, if you need information from this forum, download it yourself. But if you do not succeed, do not worry, we have an offline copy of the forum. We will post it in a separate archive, so that you can safely use it. You yourself can easily do this, for example, with this program (I made a copy of the forum with it; everything works).

Officially, we are moving on May 1 of this year. Where, we will inform. As for the WorldSim3D engine itself, it lives and develops.
Enjoy your stay at your projects! :)
2
WorldSim3D - разработка / ПЕРЕЕЗЖАЕМ !
« Last post by Alec - WS3D Developer on April 21, 2019, 01:01:17 PM »
Здравствуйте уважаемые пользователи Worldsim3D!
У нас кое-какие изменения. МЫ ПЕРЕЕЗЖАЕМ на другой хостинг.Почему? К сожалению, текущий хостинг стал полностью платным (все тарифы), причём даже базовый тариф - не очень то дешевый. Поэтому для таких энтузиастов, как команда WorldSim3D плата за хостинг стала неподъёмным бременем. Напомню наш проект - пока некоммерческий. (Правда нынешняя компания-хостингер предлагала переехать на их дочерний хостинг, там есть бесплатный тариф, но перенести форум туда оказалось довольно трудно, я попробовал, импорт/экспорт базы данных форума оказался настолько трудоёмким, что я просто не стал тратить многие часы на то, чтобы в этом разобраться, хотя несколько часов я всё же убил на это).
В виду этого, решено переехать на юкоз (это пока временный сайт). Я давно знаком с этой хостинг-компанией. Да, у неё тоже для энтузиастов есть свои минусы (реклама, напр.), но при нынешних технологиях борьбы с рекламой, это почти не проблема.
Пожалуйста, если вам нужна информация с этого форума, скачайте её себе. Но если у вас это не получится, не беспокойтесь, у нас есть оффлайн-копия форума. Мы её выложим отдельным архивом, так что вы сможете спокойно ей пользоваться. Вы и сами это можете легко сделать, например вот этой программкой (я ей делал копию форума; всё работает).

Официально мы переезжаем 1 мая этого года. Куда, всё сообщим.Что касается самого движка WorldSim3D, он живёт и развивается.
Приятного отдыха за вашими проектами!  :)
3
Приятно видеть и слышать о прогрессе создания своего редактора сцен.
В общем, это инструмент, который будет делать (почти) всю грязную работу за вас.  :) Поверьте, я знаю о чём говорю. У меня есть с десяток проектов, в которых мне надо было всё это по много раз прописывать в коде. Я конечно со временем просто начал копировать из др. проектов функции. А потом мы даже немного автоматизировали процесс, создав шаблоны. Ну вот, теперь у нас возможно будет Редактор. А потом могут появиться конструкторы на основе редактора.
И это радует!  8) 
4
Проекты в разработке / Редактор сцен
« Last post by Nikolas - WS3D Developer on March 20, 2019, 07:10:11 PM »
Всем привет.

Давненько ничего не писали. Но это не значит, что проект заглох. Понемногу пилим редактор сцен, некий аналог irrEdit.
Он вырастает из редактора частиц, который был показан ранее.
Работа далека от стадии завершения, но пока не ясно, на каком этапе она вообще завершится. Скорее всего, основными операциями с объектами: масштабирование, вращение, расстановка, работа с материалами, просмотр анимации.
Полноценно реализована работа с партиклами, создание примитивов: куб, сфера, цилиндр, конус, плоскость. Загрузка статичных мешей как в обычном режиме, так и в octree.  Загрузка анимированных мешей с возможностью проигрывания и настройки анимации.
Источники света, скайбокс и небесная сфера.  Пока это все, но планируется:
-расширенная работа с каждым видом объектов-
-облака и слои облаков-
-вода в нескольких вариантов-
-ландшафт-
-растительность (генераторы травы и деревьев).
Всего более 30 разновидностей объектов сцены.   Все это сохраняется и грузится в файл сцены. Реализована возможность выбора Execution directory при сохранении и загрузке. Важный момент, потому как от него зависит правильность записи относительных путей к текстурам, мешам и пр.

На скрине: несколько граф. примитивов и статичный меш.  Материалы куба, цилиндров, сферы и плоскости настроены на parallax-mapping.
Есть идеи по поводу того, как прикрутить нормал/параллах-эффекты к анимированным моделям. Правда, пока без исп. шейдеров, т.е. не очень производительно. Для небольших сцен не критично пока.   
В тестовой сцене - один источник света.

Да, еще есть возможность подключения 5 видов аниматоров к любому объекту сцены (Fly circle, Fly Straight, Rotation, Spline, Follow camera).

Время от времени будем сообщать о продвижении работ.
5
Привет всем!
Как вы знаете в стандартных примерах 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)
6
Нашёл в примере кусок кода для камеры:
Code: [Select]
'/// Camera
Dim as wVector3f vec
Dim as wVector3f position=wNodeGetAbsolutePosition(wPhysVehicleGetBody(Car.vehicle))

vec.x=position.x: vec.y=position.y+10: vec.z=position.z
wCameraSetTarget (wSceneGetActiveCamera(),vec)

vec.x=position.x-70: vec.y=position.y+35: vec.z=position.z-35
wNodeSetPosition (wSceneGetActiveCamera(),vec)

Но это в функции. Надо теперь обратиться к этому коду в главном цикле.
Конечно, самое простое, просто привязать камеру к машинке, чтобы камера копировала все векторы машинки.
7
Да, и это тоже надо.
8
А как делают плавно останавливающиеся камеры в стратегиях? Там изначально скорость есть у камеры... Как только камера перестаёт двигаться - эта скорость начинает уменьшаться и постепенно останавливается камера ))) Все просто
9
Привет всем.
Как в 129-м примере (машинки) сделать так, чтобы камера плавно, в течение 2-3 секунд поворачивалась в ту сторону, куда едет машинка? (Я не силён в вышней математике  :D ).
10
Спасибо за тестирование, Alec. Да, я уже начал работу над WorldEditor.
В нем будет все то, чего нет в IrrEdit: шейдерная вода, генератор деревьев, SkyDome, возможно, даже расстановка источников звука.
Самую большую проблему пока вижу с такими вещами:
-редактор вейпойнтов, а лучше AI (в движке уже заложены исходники irrAI, но не разработано пока)
-LightMapper. Просто пока не знаю, как его правильно сделать.  Пока и без этого хватит с головой.
Еще в CooperCube мне понравился инструмент создания 3D-комнат из 2D-тайлов.
Ну и тени- самое больное место. В irrlicht они просто ужасны, особенно стенсильные, да и тормозные.
Посмотрим, что из этого выйдет...

Кстати, в CopperCube Нико изрядно обрезал редактирование частиц: там остались только кубический эмиттер и из аффекторов только FadeOut, Scale и Gravity.
Впрочем, в IrrEdit было не боле того...
Pages: [1] 2 3 ... 10