forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   помогите новечку (http://forum.boolean.name/showthread.php?t=815)

AdomaX 28.03.2006 03:30

Цитата:

Graphics 800,600
SetBuffer BackBuffer()

;physics variables
Global delta_t# = 0.01
Global M_PI# = 3.1415926
Global DRAG# = 5.0
Global RESISTANCE# = 30.0
Global CA_R# = -5.20
Global CA_F# = -5.0
Global MAX_GRIP# = 2.0* *
Global MULT# = 57
Global MULT2# = 0.01745

Global CAR1_cartype = 1
Global CAR1_cartype_b# = 1.0
Global CAR1_cartype_c# = 1.0
Global CAR1_cartype_wheelbase# = CAR1_cartype_b# + CAR1_cartype_c#
Global CAR1_cartype_h# = 1.0
Global CAR1_cartype_mass# = 1500
Global CAR1_cartype_inertia# = 1500
Global CAR1_cartype_width# = 1.5
Global CAR1_cartype_length# = 3.0
Global CAR1_cartype_wheellength# = 0.7
Global CAR1_cartype_wheelwidth# = 0.3
Global CAR1_car_position_wc_x# = 400.0
Global CAR1_car_position_wc_y# = 300.0
Global CAR1_car_velocity_wc_x# = 0
Global CAR1_car_velocity_wc_y# = 0
Global CAR1_car_angle# = 0
Global CAR1_car_angularvelocity# = 0
Global CAR1_car_steerangle# = 0
Global CAR1_car_throttle# = 0
Global CAR1_car_brake# = 0

Global front_slip = 0
Global rear_slip = 0

Global velocity_x#
Global velocity_y#
Global yawspeed#
Global sn#, cs#
Global xpos#, ypos#
Global rot_angle#
Global sideslip#
Global slipanglefront#
Global slipanglerear#
Global flatf_x#, flatf_y#
Global flatr_x#, flatr_y#
Global weight#
Global ftraction_x#, ftraction_y#
Global resistance_x#, resistance_y#
Global force_x#, force_y#
Global torque#
Global acceleration_x#, acceleration_y#, angular_acceleration#
Global acceleration_wc_x#, acceleration_wc_y#


;main loop
While ( KeyHit(1)=0 )

* * Cls

* * FUNC_do_input()
* *
* * FUNC_do_physics()
* * * *
* * Flip
* *
Wend

End




;input routine from joystick/pad/wheel
Function FUNC_do_input()

* * If ( KeyDown(200)) CAR1_car_throttle# = 2000.0
* * If ( KeyDown(208)) CAR1_car_throttle# = 0.0
* * If ( KeyDown(57))
* * * * CAR1_car_throttle# = 0.0
* * * * CAR1_car_brake# = 100.0
* * Else
* * * * CAR1_car_brake# = 0.0
* * EndIf

* * CAR1_car_steerangle# = 0.0
* * If ( KeyDown(205)) CAR1_car_steerangle# = (-M_PI# / 4.0) * 0.15;* MULT2#
* * If ( KeyDown(203)) CAR1_car_steerangle# = (M_PI# / 4.0) * 0.15; MULT2#

* * rear_slip = 0;
* * If ( KeyDown(57) ) rear_slip = 1;
* *
* * ;temp display of vars
* * Text 0,0,Str(CAR1_car_position_wc_x#)
* * Text 0,12,Str(CAR1_car_position_wc_y#)
* * Text 0,24,Str(CAR1_car_steerangle#)

* * CAR1_car_angle#=CAR1_car_angle#+CAR1_car_steerangl e#

* * xpos# = CAR1_car_position_wc_x#
* * ypos# = CAR1_car_position_wc_y#

* * ;render a small moving car rep.
* * renda1# =( -CAR1_car_angle# * MULT# ) - 60
* * If (renda1#<0.0) Then renda1#=360.0+renda1#
* * renda2# =( -CAR1_car_angle# * MULT# ) + 60
* * If (renda2#>359.0) Then renda2#=renda2#-360.0
* * renda3# =( -CAR1_car_angle# * MULT# ) - 120
* * If (renda3#<0.0) Then renda3#=360.0+renda3#
* * renda4# =( -CAR1_car_angle# * MULT# ) + 120
* * If (renda4#>359.0) Then renda4#=renda4#-360.0

* * rendx1#=25*Cos(renda1#) : rendy1#=25*Sin(renda1#)
* * rendx2#=25*Cos(renda2#) : rendy2#=25*Sin(renda2#)
* * rendx3#=25*Cos(renda3#) : rendy3#=25*Sin(renda3#)
* * rendx4#=25*Cos(renda4#) : rendy4#=25*Sin(renda4#)

* * Color 255,255,255
* * Line rendx1#+xpos#,rendy1#+ypos#,rendx2#+xpos#,rendy2#+ ypos#
* * Line rendx2#+xpos#,rendy2#+ypos#,rendx4#+xpos#,rendy4#+ ypos#
* * Line rendx4#+xpos#,rendy4#+ypos#,rendx3#+xpos#,rendy3#+ ypos#
* * Line rendx3#+xpos#,rendy3#+ypos#,rendx1#+xpos#,rendy1#+ ypos#

End Function






;type of car - 1=rear 2=front 3=four
Global CAR1_car_drivetype = 3




Function FUNC_do_physics()

* * ; SAE convention: x is To the front of the car, y is To the Right, z is down



* * ;--------------------------
* * ; TRANSFORM VELOCITY
* * ;--------------------------
* * * * ; transform velocity in world reference frame To velocity in car reference frame
* * * * sn# = Sin(CAR1_car_angle# * MULT#); * MULT2#
* * * * cs# = Cos(CAR1_car_angle# * MULT#) ;* MULT2#
* * * * velocity_x# = cs# * CAR1_car_velocity_wc_y# + sn# * CAR1_car_velocity_wc_x#
* * * * velocity_y# = -sn# * CAR1_car_velocity_wc_y# + cs# * CAR1_car_velocity_wc_x#


* * ;--------------------------
* * ; LATERAL FORCES ON WHEELS
* * ;--------------------------
* * * * ; Resulting velocity of the wheels as result of the yaw rate of the car body
* * * * ; v = yawrate * r where r is distance of wheel To CG (approx. half wheel base)
* * * * ; yawrate (ang.velocity) must be in rad/s

* * * * ; 0.5 in this line becomes front/rear pos of COG - alter this later
* * * * yawspeed# = CAR1_cartype_wheelbase# * 0.5 * CAR1_car_angularvelocity#
* * * * If( velocity_x# = 0 )
* * * * * * rot_angle# = 0
* * * * Else
* * * * * * rot_angle# = ATan2( (yawspeed# ) , (velocity_x#) ) * MULT2#
* * * * EndIf


* * ;-------------------------
* * ; SIDESLIP ANGLE
* * ;-------------------------
* * * * ; Calculate the side slip angle of the car (a.k.a. beta)
* * * * If( velocity_x# = 0 )
* * * * * * sideslip# = 0.0
* * * * Else
* * * * * * sideslip# = ATan2( (velocity_y# ) , (velocity_x#) )* * * MULT2#* *
* * * * EndIf


* * ;-------------------------
* * ; SLIP ANGLES FRONT/REAR
* * ;-------------------------
* * * * ; Calculate slip angles For front And rear wheels (a.k.a. alpha)
* * * * slipanglefront# = sideslip# + rot_angle# - CAR1_car_steerangle#
* * * * slipanglerear# = (sideslip# - rot_angle#)


* * ;-------------------------
* * ; WEIGHT PER AXLE
* * ;-------------------------
* * * * ; weight per axle = half car mass times 1G (=9.8m/s^2)
* * * * ; need to split this into front and rear masses - according to position of COG
* * * * weight# = CAR1_cartype_mass# * 9.8 * 0.5


* * ;--------------------------
* * ; LATERAL FORCES ON WHEELS
* * ;--------------------------
* * * * ; (Ca * slip angle) capped To friction circle * load
* * * * flatf_x# = 0.0
* * * * flatr_x# = 0.0

* * * * ;check for front / rear / 4 wheel drive
* * * * If ( CAR1_car_drivetype = 1 )

* * * * * * ;rear wheel drive
* * * * * * flatr_y# = CA_R# * slipanglerear# / ((CAR1_car_throttle# / 5000.0)+1)
* * * * * * flatf_y# = CA_F# * slipanglefront#

* * * * Else If ( CAR1_car_drivetype = 2 )

* * * * * * ;front wheel drive
* * * * * * flatr_y# = CA_R# * slipanglerear#
* * * * * * flatf_y# = CA_F# * slipanglefront# / ((CAR1_car_throttle# / 5000.0)+1)

* * * * Else If ( CAR1_car_drivetype = 3 )
* *
* * * * * * ;4 wheel drive
* * * * * * flatr_y# = CA_R# * slipanglerear# / ((CAR1_car_throttle# / 5000.0)+1)
* * * * * * flatf_y# = CA_F# * slipanglefront# / ((CAR1_car_throttle# / 5000.0)+1)
* * * *
* * * * EndIf
* * * * * *
* * * * flatf_y# = flatf_y# * weight#
* * * * flatr_y# = flatr_y# * weight#

* * * * ; allow for handbrake / reduced grip levels - use this for different surfaces later* *
* * * * If(front_slip=1) flatf_y# = flatf_y# * 0.5
* * * * If(rear_slip = 1) flatr_y# = flatr_y# * 0.5


* * ;-----------------------------
* * ; LONGITUDINAL FORCES
* * ;-----------------------------
* * * * ; longtitudinal force on rear wheels - very simple traction model
* * * * ftraction_x# = 100.0 * (CAR1_car_throttle# - CAR1_car_brake# * Sgn(velocity_x#))
* * * * ftraction_y# = 0.0

* * * * ; allow for handbrake
* * * * If(rear_slip = 1) ftraction_x# = ftraction_x# * 0.5



* * ;-------------------------------
* * ; SUM FORCES AND TORQUE ON BODY
* * ;-------------------------------
* * * * ; drag And rolling resistance
* * * * resistance_x# = -( RESISTANCE# * velocity_x# + DRAG# * velocity_x# * Abs( velocity_x# ) )
* * * * resistance_y# = -( RESISTANCE# * velocity_y# + DRAG# * velocity_y# * Abs( velocity_y# ) )

* * * * ; sum forces
* * * * force_x# = ftraction_x# + (Sin( CAR1_car_steerangle# * MULT# )) * flatf_x# + flatr_x# + resistance_x#
* * * * force_y# = ftraction_y# + (Cos( CAR1_car_steerangle# * MULT# )) * flatf_y# + flatr_y# + resistance_y#* *

* * * *
* * * * ; torque on body from lateral forces
* * * * torque# = CAR1_cartype_b# * flatf_y# - CAR1_cartype_c# * flatr_y#

* * * * ; Acceleration - Newton F = m.a, therefore a = F/m
* * * * acceleration_x# = force_x# / CAR1_cartype_mass#
* * * * acceleration_y# = force_y# / CAR1_cartype_mass#
* *
* * * * ; angular acceleration around COG
* * * * angular_acceleration# = torque# / CAR1_cartype_inertia#

* * * * ; Velocity And position
* * * * ; transform acceleration from car reference frame To world reference frame
* * * * acceleration_wc_x# = cs# * acceleration_y# + sn# * acceleration_x#
* * * * acceleration_wc_y# = -sn# * acceleration_y# + cs# * acceleration_x#

* * * * ; velocity is integrated acceleration
* * * * CAR1_car_velocity_wc_x# = CAR1_car_velocity_wc_x# + (delta_t# * acceleration_wc_x#)
* * * * CAR1_car_velocity_wc_y# = CAR1_car_velocity_wc_y# + (delta_t# * acceleration_wc_y#)

* * * * ; position is integrated velocity
* * * * CAR1_car_position_wc_x# = CAR1_car_position_wc_x# + (delta_t# * CAR1_car_velocity_wc_x#)
* * * * CAR1_car_position_wc_y# = CAR1_car_position_wc_y# + (delta_t# * CAR1_car_velocity_wc_y#)

* * * * ; Angular velocity And heading
* * * * ; integrate angular acceleration To get angular velocity
* * * * CAR1_car_angularvelocity# = CAR1_car_angularvelocity# + (delta_t# * angular_acceleration#)

* * * * ; move COG left / right according to body's angular rotation
* * * * CAR1_car_COGx# = (CAR1_car_angularvelocity# * 10.0)
* * * * CAR1_car_COGy# = CAR1_car_throttle# / 100.0
* * * *
* * * * ; integrate angular velocity To get angular orientation
* * * * CAR1_car_angle# = CAR1_car_angle# + (delta_t# * CAR1_car_angularvelocity#)





* * ;TEMP - SCREEN LIMITS
* * If ( CAR1_car_position_wc_x# < 0.0 ) CAR1_car_position_wc_x# = 800.0
* * If ( CAR1_car_position_wc_x# > 800.0 ) CAR1_car_position_wc_x# = 0.0
* * If ( CAR1_car_position_wc_y# < 0.0 ) CAR1_car_position_wc_y# = 600.0
* * If ( CAR1_car_position_wc_y# > 600.0 ) CAR1_car_position_wc_y# = 0.0
* *
End Function


Вот физика а как ее приделать к модели машины?
если можно с примером очень прошу..

tormoz 28.03.2006 04:10

Я дико извиняюсь. но вопрос из серии - сделайте мне игру.
Тут полдня нужно сидеть.
Народ. у кого есть лишние 4-5 часов на отладку ?
ИМХО, не можеш сделать сейчас - делай что попроще. Или трахайся.
Например я пару недель назад на физику авто почти три дня убил. Но сделал сам, кода ни у кого не просил.
А ты хоть пытался что то сделать ?
То что показал - это чужой исходник-заготовка.

Вотъ :o''

Хотя тут где то бегали добрые дяди с кучей времени... :P

AdomaX 28.03.2006 12:30

Цитата:

Originally posted by tormoz@28.3.2006, 0:10
Я дико извиняюсь. но вопрос из серии - сделайте мне игру.
Тут полдня нужно сидеть.
Народ. у кого есть лишние 4-5 часов на отладку ?
ИМХО, не можеш сделать сейчас - делай что попроще. Или трахайся.
Например я пару недель назад на физику авто почти три дня убил. Но сделал сам, кода ни у кого не просил.
А ты хоть пытался что то сделать ?
То что показал - это чужой исходник-заготовка.

Вотъ :o''

Хотя тут где то бегали добрые дяди с кучей времени... :P

Не ето я показал как пример вы скажите как мне сделать чтобы все ети параметры машина использывала

jimon 28.03.2006 21:52

думаю что такая физика врятли подойдет для машини

Diplomat 28.03.2006 23:52

Гм-м-м, что это все новЕчки вдруг решили написать по рейсингу? Вот уже третья тема, и всё с одним и тем же вопросом... Как правило такой ажиотаж вызывается выходом новой версии NFS, но сейчас вроде бы ничего такого не выходило. Может это кто-то один клонируется и надеется взять количеством?

На всякий случай, ответ класса "а вдруг?!".
AdomaX! Представь себе, что такое ускорение. Это когда некая переменная "скорость" изменяется со временем под воздействием силы. Например, нажал ты клавишу "вперед"- и скорость машины растет: V=V+A. Но при этом есть еще и трение: V=V/K. Когда-нибудь трение станет равно силе и скорость перестанет расти. А если сила перестала действовать- трение погасит скорость. Заведи себе три переменных скорости для трех координатных осей- и думай дальше, как их изменять в зависимости от сил. И просто сдвигай модельку машины по соответствующей оси каждый проход цикла на величину скорости. Это основа. Как сделать так, чтоб при нажатии клавиши поворота машина не сразу крутилась, а разворачивалась иннерционно ты, взглянув на текст выше, догадаешься? А как сделать, чтоб когда машина падала и касалась земли, скорость падения "отражалась" в результате появления силы реакции опоры? О, как здорово! А как сделать так, чтоб машина не скользила, как кирпич, заколизившись с землей, а ехала на колесах? Что, и это, если подумать и трезво с долей скепсиса взглянуть на стандартные примеры, не трудно? Ну что-ж тогда осталось сделать немного: сделать реалистичную физику аммортизаторов, что тоже решаемо легко, если взглянуть с высоты накопленного тобой в проделанной работе опыта...
Вот и всё. Ты создал физику автомобиля. :)
Если у тебя возникнут вопросы по какой-нибудь детали- без проблемм с радостью поможем. Но писать за тебя код- хоть и вовсе не трудно, как говорит дядя Тормоз (у каждого тут есть свои наработки в этом плане и писать просто уже не нужно)- но это просто педагогически бессмыссленно.

P.P.S. Да, SubZero, я знаю, что я злой и мерзкий тип, что я был резок с новеньким и что сейчас месагу мою сотрут... но в самом деле, человек ведь ДЕЙСТВИТЕЛЬНО не задал корректного вопроса на который можно было бы хотя бы попытаться ответить, и ДЕЙСТВИТЕЛЬНО не удосужился прочитать живущие рядышком две темы, содержащие тот же неотвечабельный вопрос в несколько иной вариации, и ДЕЙСТВИТЕЛЬНО не попытался что-то сделать сам...

impersonalis 29.03.2006 00:15

Diplomat прав

alcoSHoLiK 29.03.2006 00:54

Цитата:

Originally posted by Diplomat@28.3.2006, 20:52
Как правило такой ажиотаж вызывается выходом новой версии NFS, но сейчас вроде бы ничего такого не выходило.
NFS: Most Wanted и NFS: Most Wanted | Black Edition ;)

Diplomat 29.03.2006 01:20

Тьфу, и правда! Ну что-ж, дичайше извиняюсь, потому как был не правый. :)

ZanoZa 29.03.2006 10:49

А чё исходник Dirver уже не прокатит?

jimon 29.03.2006 22:20

ZanoZa нам же потом понадобится МеГа Физика :)
так что лутче показать легкий с тяжолый путь... чтобы догадками потом себя немучить

ZanoZa 30.03.2006 11:14

Adomax поучи пока основы.Не делай супер мега игры, оставь их напотом, когда появится опыт. Иначе куча нервов и времени.


Часовой пояс GMT +4, время: 20:09.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot