Arvutiteaduse liikumise modelleerimise diskretiseerimise praktika. Isetasakaalustava jalgratta liikumise simulatsioon. Juhised ülesande täitmiseks

Jätkame artiklite sarja, mis käsitleb vigurlendude sooritamise automatiseerimist väikestel droonidel. Sellel artiklil on ennekõike hariv eesmärk: siin näitame, kuidas saate luua lihtsa automaatse juhtimissüsteemi (ACS), kasutades ülesande "tünn" vigurlennu manöövri sooritamise näitel lennuki juhtimisel ainult aileronidega. Artikkel on teine ​​väljaannete sarjast “Aerobatic UAV”, mis räägib iseliikuvate relvade riist- ja tarkvaraosade ehitamise protsessist õppevormis.

Sissejuhatus

Niisiis otsustasime "tünni" rakendada automaatrežiimis. Ilmselt on joonise automaatseks täitmiseks vaja sõnastada vastav juhtimisseadus. Leiutamisprotsess on palju valutu ja kiirem, kui kasutate lennuki liikumise matemaatilist mudelit. Kontrolliseaduse testimine lennueksperimendis, kuigi võimalik, nõuab palju rohkem aega ja võib seadme kadumise või kahjustamise korral olla ka palju kulukam.

Kuna õhusõiduki väikeste ründe- ja libisemisnurkade korral ei ole selle veere liikumine praktiliselt seotud liikumisega kahes teises kanalis: rööbas- ja pikisuunas - lihtsa "tünni" tegemiseks piisab, kui ehitada liikumismudel ainult ümber. üks telg - telg Oh seotud SC. Samal põhjusel ei muutu eleoni juhtimisseadus oluliselt tervikliku juhtimissüsteemi loomisel.

Liikumismudel

Õhusõiduki liikumise võrrand ümber pikitelje Oh seotud SC on äärmiselt lihtne:

Kus on inertsimoment telje suhtes Oh, ja hetk koosneb mitmest komponendist, millest meie lennuki liikumise realistlikuks kirjeldamiseks piisab ainult kahest:

Kus on hetk, mis on põhjustatud lennuki pöörlemisest ümber oma telje Oh(summutusmoment), - sirgendite läbipainest põhjustatud moment (juhtmoment). Viimane avaldis on kirjutatud lineariseeritud kujul: rullumismoment sõltub lineaarselt nurkkiirusest ja telje läbipaindenurgast vastavalt konstantsete pja.

Nagu teada (näiteks Wikist), on lineaarne diferentsiaalvõrrand

Vastab esimest järku perioodilisele lingile

Kus on ülekandefunktsioon, diferentseerimisoperaator, ajakonstant ja võimendus.

Kuidas minna diferentsiaalvõrrandilt ülekandefunktsioonile?

Meie puhul saame liikuda võrrandi parameetritelt ülekandefunktsiooni parameetritele järgmiselt (teades, et tuletis on negatiivne):




Perioodilise lingi korral on ajakonstant võrdne ajaga, mille jooksul väljundväärtus sisendväärtuse ühe astmelise toimingu korral omandab väärtuse, mis erineb püsiseisundi väärtusest ~5% ja võimendustegurist on arvuliselt võrdne väljundväärtuse püsiseisundi väärtusega ühe astmelise toimingu korral:


Konstrueeritud liikumismudelis on kaks tundmatut parameetrit: võimendus ja ajakonstant. Neid parameetreid väljendatakse füüsikalise süsteemi omaduste kaudu: inertsimoment, samuti veeremomendi tuletised ja:

Seega, kui inertsimoment on teada, siis pärast mudeli parameetrite kindlaksmääramist on võimalik süsteemi parameetrid nendest taastada.

Mudeli parameetrid. Inertsimoment

Meie lennuk koosneb järgmistest osadest: tiib, kere koos sabaga, mootor, aku (aku) ja avioonika:

Avioonika sisaldab: autopiloodi plaati, SNS-vastuvõtja plaati, raadiomodemi plaati, juhtimisseadmete signaalivastuvõtja plaati, kahte pingeregulaatorit, mootori pöörlemiskiiruse regulaatorit ja ühendusjuhtmeid.

Avioonika kerge kaalu tõttu võib selle panuse kogu inertsmomendisse tähelepanuta jätta.

Kuidas hinnati inertsmomendi suurust?

Inertsmomenti saab hinnata järgmiselt. Vaatame tasapinda piki selle telge Oh:

Ja siis esitame selle järgmise lihtsustatud mudeli kujul:


Inertsmomendi arvutamise skeem. Üleval vasakul on aku, all paremal on mootor. Mootor ja aku asuvad kere teljel

On näha, et mudeli loomiseks jäeti kõrvale: kiil, horisontaalne saba, propeller ja avioonika. Samal ajal jäid alles: kere, tiib, aku, mootor. Mõõtes iga osa masse ja iseloomulikke mõõtmeid, on võimalik arvutada iga detaili inertsmomendid kere pikitelje suhtes:


Õhusõiduki inertsmomendi koguväärtus telje suhtes Oh saame osade inertsimomentide liitmisel:

Olles hinnanud iga õhusõiduki osa panust kogu inertsmomenti, saadi:

  • tiib - 96,3%,
  • kere - 1,6%,
  • mootor ja aku - 2%,
On näha, et peamise panuse kogu inertsmomenti annab tiib. Selle põhjuseks on asjaolu, et tiival on üsna suur põikimõõt (tiivaulatus - 1 m):

Seetõttu on tiival vaatamata oma tagasihoidlikule kaalule (umbes 20% kogu lennuki stardimassist) märkimisväärne inertsimoment.

Mudeli parameetrid. Veeremomendi tuletised ja

Veeremomendi tuletiste arvutamine on üsna keeruline ülesanne, mis on seotud lennuki aerodünaamiliste omaduste arvutamisega numbriliste meetodite või inseneritehnikate abil. Esimese ja teise kasutamine nõuab märkimisväärseid aja-, intellektuaalseid ja arvutuskulusid, mis on õigustatud suurte lennukite juhtimissüsteemide väljatöötamisel, kus vea maksumus ületab siiski hea mudeli ehitamise maksumust. Mehitamata õhusõiduki juhtimiseks, mille mass ei ületa 2 kg, on see lähenemisviis vaevalt õigustatud. Teine võimalus nende tuletisinstrumentide arvutamiseks on lennueksperiment. Arvestades meie lennuki madalat hinda, aga ka sellise katse läbiviimiseks sobiva põllu lähedust, oli valik meie jaoks enesestmõistetav.

Pärast autopiloodi käsitsi juhtimise ja parameetrite salvestamise püsivara kirjutamist panime lennuki kokku ja valmistasime selle katsetamiseks ette:

Lennukatses õnnestus saada andmeid iileronide läbipaindenurga ja lennuki pöörlemise nurkkiiruse kohta. Piloot juhtis lennukit käsitsi, tehes ringe, pöördeid ja veere ning pardaseadmed salvestasid ja saatsid maapealsele jaamale vajaliku teabe. Selle tulemusena saadi vajalikud sõltuvused: (deg/s) ja (b/r). Väärtus tähistab normaliseeritud tüüri läbipaindenurka: väärtus 1 vastab maksimaalsele läbipaindele ja väärtus −1 vastab miinimumile:

Kuidas saame nüüd saadud andmete põhjal kindlaks teha? Vastus on siirdeprotsessi parameetrite mõõtmine, kasutades graafikuid ja .

Kuidas määrati koefitsiendid k ja T?

Võimenduse määramiseks seostati püsiseisundi nurkkiiruse väärtus tiiburi läbipainde väärtusega:


Lennukatses saadud tire läbipaindenurga ja veeremise nurkkiiruse sõltuvused ajast

Eelmisel joonisel vastavad nurkkiiruse püsiväärtuse lõigud ligikaudu näiteks lõikudele, mis on aegade 422, 425 ja 438 s lähedal (joonisel märgitud tumepunasega).
Ajakonstant määrati samade graafikute järgi. Selleks leiti tiileroni läbipaindenurga järsu muutuse alad ning seejärel mõõdeti aega, mille jooksul nurkkiirus omandas väärtuse, mis erines püsiseisundi väärtusest 5% võrra.


Ajakonstandi ja võimenduse väärtuste määramise tulemus on järgmine: , . Need teadaoleva inertsimomendi väärtusega koefitsientide väärtused vastavad järgmistele veeremomendi tuletise väärtustele:

Mudeli kontrollimine

Niisiis, olles ehitanud mudeli, mis põhineb perioodilisel lingil

Seda saab kontrollida, rakendades sisendisse lennueksperimendist saadud signaali ja võrreldes mudeli väljundsignaali samuti katses saadud väärtusega.

Kuidas simulatsioon läbi viidi?

Valisime simulatsiooni läbiviimiseks tööriista, lähtudes eelkõige võimalusest korrata tulemusi paljude lugejate poolt: see tähendab ennekõike seda, et programm peaks olema üldkasutatav. Põhimõtteliselt saab esimest järku perioodilise lingi käitumise modelleerimise probleemi lahendada, luues oma tööriista nullist. Kuid kuna mudel muutub tulevikus keerukamaks, võib oma tööriista loomine häirida peamist ülesannet - vigurlennukite iseliikuvate juhtimissüsteemide loomist. Võttes arvesse tööriista avatuse põhimõtet, valisime JSBsim.

Eelmises osas saime koefitsientide väärtused ja . Me kasutame neid lennuki liikumise simuleerimiseks. Eelmisest artiklist mäletame, et lennukimudeli konfiguratsioon sisse JSBsim on määratud kasutades XML faili. Loome oma mudeli:
0.2 1.0 0.2 0.03 0.5 0.03 0.5 -0.025 0 0.05 0.018 0.018 0.018 1.2 0 0 0 fcs/aileron-cmd-norm -1 1 Roll_moment_toe_to_roll_rate kiirused/p-aero-rad_sec -0.24 Roll_moment_dee_to_aileron fcs/aileron-cmd-norm 2.4 Kiirused/vc-kts Aero/alphadot-deg_sec Aero/betadot-deg_sec Fcs/throttle-cmd-norm VÄLJAS VÄLJAS VÄLJAS PEAL PEAL PEAL VÄLJAS VÄLJAS PEAL VÄLJAS VÄLJAS PEAL VÄLJAS
Kuna me koostame sõiduki liikumise mudelit ainult veeres, jätame faili paljud jaotised tühjaks. Järgmised omadused on mudelifailis järjestikku määratud.

Geomeetrilised mõõtmedõhusõidukid on täpsustatud jaotises mõõdikud: tiiva pindala, siruulatus, keskmine aerodünaamilise kõõlu pikkus, horisontaalne saba pindala, horisontaalne saba õlg, vertikaalne saba piirkond, vertikaalne saba õlg, aerodünaamiline fookusasend.

Massi omadusedõhusõidukid on täpsustatud jaotises massi_bilanss: õhusõiduki inertsi tensor, tühja lennuki kaal, massikeskme asend.

Tasub teada, et lennuki aerodünaamilise fookuse ja massikeskme absoluutsed asukohad ei ole sõiduki dünaamika arvutamisel kaasatud, oluline on nende suhteline asukoht.
Sellele järgnevad osad, mis kirjeldavad lennuki teliku ja selle elektrijaama omadusi.

Järgmises jaotises vastutab kontrollsüsteem, täidame veeremise juhtimise eest vastutava kanali: märkige ainus sisend fcs/aileron-cmd-norm, mille väärtus normaliseeritakse -1-lt 1-le.

Aerodünaamilised omadused on jaotises täpsustatud aerodünaamika: jõud on määratud kiiruse koordinaatsüsteemis, momendid - seotud. Oleme huvitatud rullimise hetkest. Jaotises telje nimi = "ROLL" täpsustatakse funktsioone, mis määravad aerodünaamiliste jõudude momendi teljele projektsiooni erinevate komponentide jõudude momendi HÄRG seotud koordinaatsüsteem. Meie mudelis on kaks sellist komponenti. Esimene komponent on summutusmoment, mis võrdub nurkkiiruse ja eelnevalt määratud koefitsiendi korrutisega. Teiseks komponendiks on hetk eleronidest fikseeritud lennukiirusel: see on võrdne eelnevalt määratud koefitsiendi korrutisega telje läbipainde summaga.

Väärib märkimist, et koefitsiendi määramisel kasutati mõõtmete väärtust. Meie lennuandmetes mõõdeti nurkkiirust kraadides sekundis, samas kui aastal JSBSim kasutatakse radiaane sekundis, seega tuleb koefitsienti vähendada meile vajaliku mõõtmeni, st jagada 180 kraadiga ja korrutada radiaaniga. Kirjutame need aerodünaamiliste jõudude momendi komponendid toote funktsioonide sees üles toode. Modelleerimisel summeeritakse kõigi funktsioonide täitmise tulemus ja saadakse aerodünaamilise momendi projektsiooni väärtus vastavale teljele.

Loodud mudelit saab kontrollida lennukatsete käigus saadud eksperimentaalsete andmete abil. Selleks looge järgmise sisuga skript:
sim-time-sec ge 0,0 Sisestage aileroni jaoks ajaajaloo sisend SIM-aeg-sek 0

sim-aeg-sek 0 0.00075 0.1 0.00374 0.2 -0.00075 0.3 -0.00075 0.4 -0.00075 0.5 -0.00075 0.6 0.00075 0.7 0.00075 ... 48.8 -0.00075 48.9 0.00000 49 -0.00075

kus punktid näitavad puuduvaid andmeid. Meile eelmisest artiklist tuttavas skriptifailis on ilmunud uus sündmuse tüüp ( "Ajaline teade"), mis võimaldab määrata parameetri pideva muutumise aja jooksul. Parameetri sõltuvus ajast määratakse tabelifunktsiooniga. JSBSim Lineaarselt interpoleerib funktsiooni väärtuse tabeliandmete vahel. Rolli liikumise mudeli kontrollimise protseduur seisneb selle skripti täitmises loodud mudelil ja tulemuste võrdlemises eksperimentaalsetega.


Kontrolli tulemus on näidatud joonisel:


Nagu jooniselt näha, on mudeli ja tegelikkuse vaheline kokkulepe veidi väiksem kui täielik.

Juhtsüntees "tünni" sooritamiseks

Pärast mudeli kättesaamist on lihtne kindlaks teha, kui palju ja kui kaua on vaja veere tegemiseks siivereid kõrvale pöörata. Üks võimalus on järgmine tagasilükkamise algoritm:



0,1 sekundit kestvate segmentide olemasolu tiibe läbipainde algoritmi alguses ja lõpus simuleerib servoajami inertsust, mis ei suuda pindu koheselt kõrvale juhtida. Mudel näitab, et sellise silindri läbipaindeseaduse korral peab lennuk sooritama ühe täispöörde ümber oma telje Oh, kas me kontrollime?

Lennukatse

Saadud aileroni juhtimise seadus programmeeriti lennukile paigaldatud autopiloodi. Katse idee on lihtne: viige lennuk horisontaallennule ja seejärel kasutage sellest tulenevat juhtimisseadust. Kui lennuki tegelik veeremisliikumine vastab loodud mudelile, siis peab lennuk sooritama “tünnirulli” – ühe täispöörde 360 ​​kraadi.

Eriti täname meie ustavat pilooti tema töö, professionaalsuse ja mugava pagasiruumi eest tema Priore universaalil!

Katse käigus selgus, et rullumismudeli konstrueerimine õnnestus - lennuk sooritas ühe "tünni" teise järel, niipea kui piloot aktiveeris programmeeritud juhtimisseaduse. Järgmisel joonisel on näidatud katse käigus registreeritud ja simulatsioonitulemuste põhjal saadud nurkkiirus, samuti lennukatse kalde- ja kaldenurk:


Järgmisel joonisel on näidatud signaale, mis registreeriti lennueksperimendis eleronide, lifti (ER) ja rooli (RU) jaoks:


Vertikaalsed jooned näitavad tünni täitmise alguse ja lõpu hetki. Joonistelt on selgelt näha, et "tünni veeremise" ajal ei sega piloot lifti ja rooli juhtimist, samuti on selge, et kaldenurk kipub "tünni veeremise" ajal alati vähenema - lennukit tõmmatakse. sukeldumisse, nagu simulatsiooni tulemuste põhjal ennustati lennusimulaatoris (vt artiklit “Aerobatic UAV. Kuidas õigesti tünni veereda”). Kui uurite hoolikalt eelmisi graafikuid, näete, et kolmas "tünn" ei saanud isegi valmis, kuna piloot sekkus juhtimisse, et lennuk sukeldumisest välja tuua: kaldenurk muutub "tünni" sooritamisel nii palju. ainult aileronidega.

Märkmed

järeldused

Läbiviidud töö tulemusena näitasime üht võimalust UAV liikumise mudeli loomiseks nurkkiiruse alusel. Lennukatses tõestati, et loodud liikumismudel vastab täielikult simuleeritud objektile. Väljatöötatud mudeli põhjal saadi programmijuhtimise seadus, mis võimaldab teostada “tünni” automaatrežiimis. Samuti veendusime, et ainuüksi elerone kasutades ei oleks võimalik korrektset “rulli” sooritada ja seda ka ilmekalt demonstreerisime.

Järgmine etapp on kontrolliseaduse täpsustamine tagasiside lisamise teel, samuti lifti kaasamine juhtimisse. Viimase jaoks on vaja luua meie lennuki pikisuunalise liikumise mudel. Töö tulemuste põhjal ilmub järgmine väljaanne.

Selle õpetusega on kaasas 3D-stseen.

Lühike sissejuhatus

Tegelikult mainiti juba eelmistes tundides Cinema 4D füüsika teatud aspekte: näiteks selle saidi kõige esimeses tunnis kukutasime palli tasasele pinnale, hiljem peeti Cinema 4D füüsikalist mudelit. üks lõpmatu liikumise generaatori simuleerimise viise . Kuid siiani olid need füüsika ainult osalised, äärmiselt pealiskaudsed ja kõige primitiivsemad aspektid.

Selles õppetükis liigume edasi kõige huvitavama juurde: Cinema 4D füüsika süvendatud uurimine konkreetse näite põhjal - proovime luua ja konfigureerida (vähemalt kõige primitiivsemas versioonis) täisfunktsionaalset. auto liikumise füüsiline mudel ebatasasel maastikul, simuleerides üldiselt samu põhimõtteid, mille järgi auto reaalses maailmas liigub.

Sõidukite liikumise füüsilise mudeli kasutamise vajadus peitub sõnades "üle ebatasasel maastikul". Enamasti ei ole autoliikluse modelleerimisel vaja kasutada füüsilist mudelit: autod liiguvad ühtlaselt mööda trajektoori (täpselt sellist liiklusvoogu õppisime looma ühest automudelist, mäletate?), visuaalselt suheldes praktiliselt mitte mingil juhul keskkonnaga ning seda on lihtne ja lihtne kujutada lihtsate vahenditega, ilma füüsikat kasutamata. Kuid niipea, kui me räägime keerulisest maastikust, millel auto sõidab, või auto enda erakordsest käitumisest (triivimine, libisemine või kokkupõrked) - see on koht, kus füüsika pööre saabub, kui teie ja mina ei taha asetage käsitsi tohutul hulgal võtmeid ja redigeerige kolmemõõtmelise mudeli käitumiskõveraid viimase käitumise iga sekundi kohta (ja seda ilma lõpliku renderduse visuaalset usutavust tagamata).

Eesmärgid

Esiteks määratleme oma eesmärgid ja eesmärgid. Selles õppetükis on meie eesmärk kujutada auto enam-vähem usutavat käitumist ebatasasel pinnal sõitmisel. Täpsemalt: auto peaks põrgatama ja veerema põrgatamisega põrgatades, samuti riputama rattad aukude kohale. Ja loomulikult peaks ta närvilisusest ülesaamisel hoogu maha võtma ja tasastel aladel kiirendama.

Kui see poleks auto kiirendamine ja aeglustamine sõltuvalt maastikust, siis võib-olla lihtsustaksime oma ülesannet, "peatades" auto etteantud trajektoori mööda liikuvale nähtamatule "juhile" - sel juhul oleks auto nagu lastekelk, mille kiirus ei sõltu jooksjate all olevate lumehangede kõrgusest ja poega kelgul lohiseva isa sammu kiirusest. Meie puhul ei sobi see probleemi lahendus teile ja mulle, see tähendab, et me peame varustama automudeli kõige töötavama mootoriga. Maksimaalse efekti saavutamiseks muudame oma autost tagaveolise linnamaasturi.

Alustame?

Alustame auto välimuse (nimelt välimuse, mitte füüsilise mudeli – see pole sama asi!) modelleerimisest. Meie auto hakkab koosnema vaid viiest kolmemõõtmelisest elemendist: kerest ja neljast rattast. Loodan, et saate aru, et iga ratas peaks olema mudeli eraldi element. Lisaks on soovitatav teha kõik rattad tahkeks (monoliitseks), st koosnema ühest elemendist, mitte elementide komplektist, vastasel juhul tekib hiljem palju raskusi - peate kokku kinnitama. kõik ratta elemendid, kasutades füüsilisi modifikaatoreid, mis minu arvates oleks täiesti tarbetu ajaraiskamine. Põhiprintsiip, mille alusel mudeli elemendid jagasime, on elementide hilisema visuaalse nihutamise võimalus maasturi liikumise ajal üksteise suhtes.

Pange tähele, et linnamaasturi kere põhjas on väljalõiked rataste jaoks - broneerin kohe, et nende puudumine meie tulevase füüsilise mudeli tööd ei segaks (hiljem näete ise), küll aga vaatamise ajal. Animatsioonil oleks võimalik näha rattaid, mis läbivad otse põhja, mis oleks muidugi jäme visuaalne viga.

Liigume nüüd kõige olulisema juurde: maasturi tegeliku füüsilise mudeli loomine. Võiks kohe eeldada, et on aeg rattad kere külge kinnitada. Mitte mingil juhul! Ei praegu ega hiljem. Ja sellepärast. Fakt on see, et kui kinnitaksite rattad otse kere külge, oleks teil jällegi palju raskusi: Cinema 4D füüsiline mudel tajuks rattaid kui keha sees(st nagu oleks selle sees kinni) ja püüaks iga hinna eest neid vabastada, mille tulemusena näeksite rataste enam-vähem usutava käitumise asemel peamiselt nende väikest, lakkamatut vibratsiooni ja minimaalne reaktsioon füüsilisele suhtlemisele teiste maasturit ümbritsevate objektidega. Loomulikult saab selle probleemi täielikult lahendada stseeni ja mudelite dünaamika väärtuste peenhäälestuse ja aeganõudva reguleerimisega, näiteks intervallidega, mille saavutamisel algab kolmemõõtmeliste elementide interaktsioon, kuid me valib lihtsama tee.

Võtame ette lihtsama marsruudi – ja seekord loome mitte visuaalse, vaid füüsilise auto kere mudeli. Autori kavandatud kujul on see kõige tavalisem hulknurkne kuup. Sinu omas võib selleks olla ükskõik milline muu hulknurkne objekt – peaasi, et seda maasturi kere alt näha poleks ja et tegemist oleks hulknurkse mudeliga, mille servad on ratastest piisavalt kaugel. Tavapäraselt kutsume seda elementi kaalukeskuseks.

Miks see nii on, küsite? Miks ei võiks see olla NULL-objekt või splain?

Sest meie loodud kaalukeskus on definitsiooni ja nime tõttu mõeldud aktiivselt osalema maasturi füüsilises mudelis. Ei splainid ega NULL-objektid, millel on füüsikalised omadused, ei kasuta viimast, kuna neil puudub füüsiline pind.

Niisiis, maasturi kaalukeskus on loodud. Liigume edasi rataste kinnitamise juurde. Füüsilise mudeli puudumisel allutaksime nad objektihalduris lihtsalt kuubile (või isegi kehale) ja sellest piisaks. Meie puhul ei tohiks rattad kinnitada jäigalt, vaid võttes arvesse teatud füüsilist vabadust, st võimalust kaalukeskuse suhtes veidi nihkuda, kui füüsiline suhtlus toimub stseenis teiste objektidega (näiteks ebaühtlasega). teekatted).

Just seda tüüpi kinnituste jaoks pakub Cinema 4D "Connector" tüüpi objekte (inglise keelest "connect" - "to connect"). Minge ülemisse menüüsse, otsige üles üksus "Simulatsioon", valige rippmenüüst alamüksus "Dünaamika" ja klõpsake rippmenüüs "Connektor".

Näeme, et tööaknas on ilmunud uus objekt ja selle nimi on ilmunud objektihaldurisse. Alustame parempoolse esirattaga. Asetame pistiku kohta, kus asub ratta geomeetriline keskpunkt, mis kinnitatakse pistiku abil kere külge - samas kui ratta enda geomeetriline keskpunkt peaks asuma kohas, kus asub ratta rummu keskpunkt. asub roolis.

Nüüd peate konnektori konfigureerima. Valige objektihalduris selle nimi ja vaadake allpool avanevat omaduste akent.

Esimene parameeter, mille väärtust peaksime muutma, on ühenduse tüüp (parameeter “Tüüp”), see määrab, kuidas ratas keha suhtes liigub. Ilmselt on meie puhul kõige sobivam ühenduse tüüp "Rattavedrustus". Sõnade "Objekt A" vastas olevale väljale lohistage objektihaldurist kaalukeskuse nimi; alloleval pildil on see tähistatud kui "Base" - see on objekt millele Kinnitame ratta. Lohistage sõnade "Objekt B" vastas olevale väljale ratta nimi (pildil, mis on tähistatud kui "Wheel_FR", lühendist "Wheel Front Right") - see on selle vastu me kinnitame selle teile. Me ei puuduta parameetreid "Attachment A" ja "Attachment B" - need näitavad, kus asuvad objektide massikeskmed ja vaikeväärtused sobivad meile sel juhul üsna hästi.

Liigume edasi pistiku peenhäälestamise juurde.

Seade "Ignoreeri kokkupõrkeid" on mõeldud siis, kui soovite vältida ratta ja kaalukeskuse vahelist füüsilist suhtlust – näiteks kui konnektori seaded lubavad rattal kuni 45 kraadi kõrvale kalduda, kuid ratas toetub siiski objektile, puudutades. kinnitatud ja ei saa kalduda maksimaalse lubatud nurga alla, siis võib see säte aidata. Parameeter "Roolinurk" on ratta maksimaalne lubatud kõrvalekalle algsest asendist. Parameeter "Vedrustuse puhkeasend" määrab ratta vertikaalse nihke puhkeasendis (st nendel hetkedel, kui ratas ei suhtle millegagi). Meie puhul on väärtus -15 cm. - kui muudate selle -25-ks, siis tõstetakse maasturi kere rataste suhtes veelgi kõrgemale kui hetkel ja kliirens suureneb, kuid kl. samal ajal väheneb ka maasturi stabiilsus, kuna kaalukeskus on kõrgem - kas pole, see meenutab juba autode stabiilsuse tasakaalu reaalses maailmas? Vedrustuse pehmus sõltub parameetri "Vedrustuse jäikus" väärtusest. Mida madalam väärtus, seda pehmem on vedrustus. Parameeter „Vedrustuse heitmine” määrab vedrustuse „põrge”. Ja lõpuks saate soovi korral aktiveerida parameetrid "Alumine piir Y" ja "Ülemine piir Y" ning määrata neile kauguse väärtused, millest ratas ei saa kõrvale kalduda.

Pärast pistiku seadistamise lõpetamist kordame sama toimingut - alustades uue pistiku loomisest - teise esiratta jaoks, seekord vasakpoolse. Selle asemel, et liikuda ülemise menüü kaudu, nagu te ilmselt juba aru saite, võite lihtsalt leida parema esiratta pistiku, mille me varem lõime, ja vajutades ja hoides all klaviatuuril klahvi "Ctrl" kogu jõust, lohistage konnektori nimi tühjale kohale objektihalduris – pärast selle toimingu sooritamist saame teiega ja minule konnektori uue koopia, mis pärib ka kõik sätted oma algselt. Peaasi on meeles pidada uue konnektori omaduste väljal “Objekt B” parempoolse ratta nime muutmist vasaku nimeks.

Esirattad on viimistletud. Liigume edasi taha.

Ja otsekohe seisame silmitsi küsimusega, mis on esmapilgul veidi arusaamatu: mitu mootorit peaks meie maasturil olema? Kui imelik küsimus, ütlete – üks, muidugi.

Lubage mul selgitada, millega see küsimus on seotud. Päris automehhanismis edastatakse pöördemoment mõlemale veorattale üheaegselt üsna keerulise mehaaniliste ajamite süsteemi kaudu. Teil ja minul pole mõtet seda ajamisüsteemi modelleerida, kuna meil pole ülesannet visualiseerida maasturi sisemist struktuuri, mis tähendab, et mootori täieliku töötamise asemel saame endale lubada mis tahes lihtsustatud füüsilist jäljendamist. seda seni, kuni veorattad pöörlevad ja autot edasi lükkavad.

Seega on teil ja minul kaks alternatiivset lahendust: kui meil on hädasti vaja kujutada kahe veoratta eraldi veojõud, saame virtuaalsele kujundusele lisada kaks eraldi mootorit, millest igaüks keerutab oma ratast. Kui meil pole vaja eraldi veojõudu modelleerida, siis kõige tõhusam ja lihtsaim viis auto liikuma panemiseks on luua nn "rattapaar" - kaks tihedalt kokku tsementeeritud ratast, mida veab üks mootor.

Selles õppetükis valime teise, lihtsama meetodi - rattapaari loomine ja selle pööramine ühe mootoriga. Selle mööndusega, et põhimõtteliselt saate selle meetodi soovi korral keerulisemaks muuta - näiteks keerake mitte rattapaari, vaid telge koos selle külge kinnitatud veoratastega konnektorite abil, nii et viimased kõikuvad vabalt edasi-tagasi, nagu oleme juba esirataste rattad jaoks seadistanud Siiski ei tee me selles tunnis oma ülesannet asjatult keeruliseks, soovi korral katsetage omal käel selle tunni juurde lisatud stseeni põhjal, lingi sellele leiate tunni algusest.

Niisiis, on otsustatud - loome rattapaari: valige kaks tagumist ratast - saate tööaknas, võite minna objektihaldurisse, kus see on teile mugavam - seejärel teeme objektihalduris paremklõpsu mis tahes neist ja rippmenüüst otsime üksuse "Ühenda" + Kustuta" ("Ühenda ja kustuta"). Samas kontekstimenüüs üleval real on üksus "Ühenda" - elementide kombineerimisel loob see uue objekti, jättes liidetud mudelite originaalid puutumata; me ei vaja eraldi tagarataste originaale.

Näeme, et linnamaasturi tagarattad on muutunud üheks kolmemõõtmeliseks elemendiks – seda me vajasimegi.

Loome teise pistiku - seekord tagumise rattapaari jaoks ja arvestades selle monoliitsust, on neid ainult üks ja seejärel konfigureerime selle. Asetame selle loomulikult rattapaari keskele.

Nüüd loome mootori: ülemine menüü, jälle üksus "Simulatsioon", rippmenüü, alamelement "Dünaamika", rippmenüüs "Mootor".

Asetame loodud mootori samasse kohta, kus on rattapaari pistik - keskele tagarataste vahele (või teaduslikult öeldes tagumise rattapaari geomeetrilisse keskossa), seejärel valime objektihalduris selle nime, liigume sujuvalt meie pilk mootori omaduste aknale, mis avaneb allpool ja liigub edasi ehitusplatsile.

Sõna “Objekt A” kõrval olevale väljale lohista objektihaldurist tagumise rattapaari nimi (pildil on see märgitud kui “Tagarattad”). Sõna “Objekt B” kõrval olevale väljale me midagi ei lohista. Parameetri "Tüüp" jaoks valige väärtus "Nurk" - kõik on õige, sest maasturi liikumiseks peab meie loodud mootor veorattapaari pidevalt teatud nurga alla pöörama. Seadke parameeter "Mode" väärtusele "Reguleerige kiirust". Ja lõpuks näitame parameetrite "Angular Target Speed" ja "Pöördemoment" arvväärtusi.

Tõenäoliselt olete valmis animatsiooni käivitama ja tulemusi kontrollima. Kui jah, siis on see veidi vara: lõppude lõpuks oleme lõpetanud vaid ühe osa tööst - oleme seadnud objektidele füüsilise mõju, samas kui füüsilised objektid endid meil veel puuduvad. Ja rattad, te ütlete, ja kere ja kaalukuubik? Tõsi, hulknurkseid mudeleid on loodud, kuid füüsiliselt pole mõjujõudude jaoks ei rattaid, kere ega kaalukuubikut veel olemas – kuni ratastele, kerele ja kaalukuubikule pole määratud dünaamika silti. Sest just kolmemõõtmelise stseeni hulknurksele elemendile määratud dünaamika silt näitab, et see element osaleb koostoimes teiste dünaamiliste omadustega elementidega.

Alustame maasturi füüsiliste omaduste seadistamist. Ja samal ajal ehitame hierarhilise struktuuri elementidest, millest see koosneb. Kõigepealt loome rühma, kuhu kogutakse kõik auto elemendid (kui seda pole veel tehtud) - seda saab teha, ühendades paar esimest käepärast elementi, kasutades klahvikombinatsiooni Alt + G (Tuletan meelde, et erinevalt Cinema 4D järjestikuste eraldi klahvivajutuste üldtunnustatud meetodist vajutatakse seda kombinatsiooni üheaegselt!) või NULL-objekti loomisega.

Järgmiseks nimetame loodud rühma mõneks unikaalseks, jäljendamatuks ja unustamatuks sõnaks (näiteks autor nimetas seda “CAR”) ning topime sinna kõik maasturiga seotud elemendid: kere, rattad, pistikud, kaalukuubik ja mootor.

Nüüd määrame rühma elemendid ümbritseva füüsilise mudeliga füüsilises suhtluses osalejateks: valige rühma nimi, paremklõpsake seda rippmenüüs, viige hiirekursor üksuse "Dünaamilised sildid" kohale. ja valige viimase alammenüü rippmenüüst ainus üksus - "Dynamics Body".

Kui olete seda õppetundi seni tähelepanelikult lugenud, võite küsida: kuidas saab rühm "CAR", olles NULL-objekt, füüsilises mudelis füüsiliselt suhelda? See on õige, objekt NULL ise ei tööta. Kuid dünaamika omadused võivad sellelt pärida kõik sellele alluvad elemendid ja igale elemendile pole vaja eraldi dünaamika silti määrata. Peaasi on rühma dünaamika silt õigesti seadistada. Konfigureerige: valige silt ja valige allpool avanevas atribuutide aknas vahekaart "Dünaamika", kus aktiveerime parameetri "Lubatud" (sealhulgas interaktsioonifüüsika) ja valige parameetri "Dünaamiline" väärtus "Sees" ( näidates sellega grupi osalemist kõigis tavalistes füüsiliste reeglite jaoks, nagu gravitatsioon jne).

Seejärel minge samas atribuutide aknas vahekaardile "Kokkupõrge" ja määrake väärtused, mis sunnivad rühmaelemente dünaamikareegleid pärima: "Rakenda silt lastele" parameetrile "Pärimine" ("Pärimine"), "Kõik" on "Individual Elements", linnuke "Self Collisions" ja "Automatic (MoDynamics)" jaoks "Shape" ("Circuit"). Ülejäänud parameetrid seadistame teie maitse järgi.

Siin oleks paslik lõpuks meenutada maasturi kere kohta. Meie idee kohaselt peaks see suhtlema ka kolmemõõtmelist stseeni ümbritseva füüsilise mudeliga - näiteks viskama ninaga pappkastidest seina -, kuid samal ajal ei tohiks see suhelda oma rühma teiste elementidega. - kaalukuubiku ja ratastega. Selle tulemuse saavutamiseks allutame selle kaalukuubile ja määrame kerele individuaalse dünaamika sildi - täpselt nagu autoelementide rühma -, kuid keredünaamika sildis lülitame välja parameetri "Dünaamiline" (määrake väärtus "Väljas") vahekaardil "Dünaamika" (pange tähele, et parameeter "Lubatud" jääb aktiveerituks, vastasel juhul lõpetab keha stseeni füüsilises mudelis osalemise täielikult ja kõik takistused, mis maasturi teele jäävad, vabalt läbi keha!). Kehale määratud dünaamikasildi vahekaardil "Kokkupõrge" saate määrata parameetrite "Pärimine silt" ja "Üksikud elemendid" jaoks vastavalt "Puudub" ja "Väljas" - kehal ei ole alluvaid elemente, millele keha dünaamilised omadused tuleks üle kanda.

Jääb üle vaid lisada kolmemõõtmelisele stseenile eelpool korduvalt mainitud ümbritsev füüsiline mudel – mõningane ebaühtlane reljeef, mis viimases animatsioonis paljastaks auto füüsiliselt usutava reaktsiooni löökaukudega suhtlemisele. Tunni juurde lisatud stseenis on tegemist mingisuguse areeni jämeda muljega, mille südamik on täpiline küngastega.

Lõpuks

Selles õppetükis uurisime auto liikumise lihtsaima füüsilise mudeli loomist - ilma täiendavate pistikprogrammide ja mooduliteta, kasutades standardseid Cinema 4D tööriistu. Tunnis, nagu märkasite, ei räägita pöörete modelleerimisest, meie loodud mudel on võimeline liikuma ainult sirgjooneliselt - muidugi juhul, kui rataste all olev ebatasane maastik liikumistrajektoori ei muuda (mis juhtubki). allolevas videos). Muide, autor kohandas teadlikult kolmemõõtmelise stseeni füüsilise mudeli parameetreid nii, et maasturi liikumine oli justkui liialdatud, et selgelt näidata rataste ja auto kere koostoimet ebakorrapärasused. Lisaks sisaldab tunnile lisatud stseen muidki tunnis mainimata elemente, mis on mõeldud pildistamiseks ja valgustamiseks. Seejärel kaalutakse saidil võib-olla keerukamaid füüsilisi mudeleid.

Lõpptulemus on animatsiooni kujul.


Liikumise modelleerimine seisneb liikumisprotsessi kunstlikus reprodutseerimises füüsiliste või matemaatiliste meetodite abil, näiteks arvuti abil.

Füüsikaliste modelleerimismeetodite näideteks on liikumise uuringud erinevatel teeelementide makettidel või välikatsed, kus luuakse kunstlikud tingimused, mis simuleerivad sõidukite reaalset liikumist. Füüsilise modelleerimise lihtsaim näide on levinud meetod erinevate sõidukite manööverdamis- ja parkimisvõime testimiseks, kasutades nende mudeleid antud piirkonnas, mis on näidatud vähendatud skaalal.

Suurima tähtsusega on matemaatiline modelleerimine (arvutuslik eksperiment), mis põhineb liiklusvoogude matemaatilisel kirjeldusel. Tänu arvutite kiirusele, millel sellist modelleerimist tehakse, on võimalik minimaalse ajaga uurida paljude tegurite mõju erinevate parameetrite ja nende kombinatsioonide muutustele ning saada andmeid liikluskorralduse optimeerimiseks (näiteks reguleerimiseks). ristmikul), mida täismahus uuringud ei võimalda.

Arvuti abil tehtud arvutuskatse aluseks oli objektmudeli kontseptsioon ehk matemaatiline kirjeldus, mis vastab antud konkreetsele süsteemile ja kajastab selle käitumist reaalsetes tingimustes vajaliku täpsusega. Arvutuskatse on odavam, lihtsam kui looduslik eksperiment ja seda on lihtne juhtida. See avab tee suurte keeruliste probleemide lahendamisele ja transpordisüsteemide optimaalsele arvutamisele, teaduslikult põhjendatud uuringute planeerimisele. Arvutusliku eksperimendi puuduseks on see, et selle tulemuste rakendatavust piirab vastuvõetud matemaatilise mudeli raamistik, mis on üles ehitatud loodusliku katse abil tuvastatud mustrite põhjal.

Täismastaabis katse tulemuste uurimine võimaldab saada funktsionaalseid seoseid ja teoreetilisi jaotusi, mille põhjal ehitatakse matemaatiline mudel. Arvutuskatses on soovitatav jagada matemaatiline modelleerimine analüütiliseks ja simulatsiooniks. Süsteemi toimimise protsesse analüütilise modelleerimise käigus kirjeldatakse teatud funktsionaalsete seoste või loogiliste tingimuste abil. Arvestades maanteeliiklusprotsessi keerukust, tuleb selle lihtsustamiseks rakendada tõsiseid piiranguid. Kuid vaatamata sellele võimaldab analüütiline mudel leida probleemile ligikaudse lahenduse. Kui analüütiliselt ei ole võimalik lahendust saada, saab mudelit uurida numbriliste meetoditega, mis võimaldavad leida tulemusi konkreetsete lähteandmete jaoks. Sel juhul on soovitav kasutada simulatsioonimodelleerimist, mis hõlmab arvuti kasutamist ja protsessi algoritmilist kirjeldust analüütilise kirjelduse asemel.

Simulatsioonimodelleerimist saab laialdaselt kasutada nii liikluskorralduse kvaliteedi hindamiseks kui ka erinevate automaatsete liikluskorraldussüsteemide projekteerimisega seotud probleemide lahendamisel, näiteks süsteemi optimaalse ülesehituse üle otsustamisel. Simulatsiooni miinusteks on nii saadud lahenduste osalisus kui ka suur arvutiaja kulu staatiliselt töökindla lahenduse saamiseks.

Tuleb märkida, et praegu on liiklusvoogude modelleerimise valdkond lapsekingades. MADI, VNIIBD, NIIAT ja teistes organisatsioonides uuritakse modelleerimise erinevaid aspekte.

Liiklusvoos liigub iga auto kas teiste liiklejate mõju all või nende mõju puudumisel. Auto liikumist nimetame vabaks juhul, kui keegi liiklejatest ei mõjuta selle auto liikumist, samuti juhi arvamust liiklusolukorrast, mille tulemusena võib ta oma auto liikumisviisi muuta. Sellise auto kiirust nimetatakse sellel teelõigul vaba liikumise kiiruseks.

Auto vaba liikumise modelleerimise aluseks oli:

Auto jõudlusomaduste teooria võrrandid:

a) auto veojõud, kiirus ja pidurdusomadused;

b) auto kõverjoonelise liikumise ja stabiilsuse võrrandid.

Sõidukite liiklusparameetrite välivaatlused kaherealistel teedel.

Auto vaba liikumise matemaatilisel mudelil on järgmine kontseptuaalne alus:

Mõju määr sõiduki juhtseadistele ja juhi arvamus DTS-i kohta võivad muutuda ainult siis, kui esineb üks allpool loetletud olukordadest.

Igal teelõigul püüab juht säilitada enda seisukohast optimaalset (põhi)kiirust, mis sõltub reisi eesmärgist ja vahemaast, veetava kauba tüübist (reisijate arv), tervislikust seisundist. ning juhi väsimusaste ja muud tegurid. Baaskiirus mudelis määratakse välivaatluste tulemusel saadud juhusliku jaotuse seadusega.

Kui auto baaskiirus järgmisel teelõigul erineb praeguse lõigu baaskiirusest, muudab juht auto kiirust eelnevalt nii, et uuele lõigule sisenedes saavutaks kiirus baaskiirus uuel lõigul.

Juht saab kasutada sõiduki juhtseadiseid sõiduparameetrite mõjutamiseks järgmistel viisidel:

a) muuta kiirust ja kiirendust, vajutades piduripedaali või gaasipedaali (resti pikendades);

b) muuta käigukasti ülekandearvu, mis võimaldab muuta sõiduki kiiruste vahemikku;

c) muuta auto liikumissuunda rooli keerates.

Lisaks ülaltoodud toimingutele saab juht sisse lülitada pidurituled (piduripedaalile vajutades) või suunatuled, mille tõttu võivad teised sõidukid oma sõidurežiimi muuta.

Sõiduki põhikiiruse tagamise seisukohalt konkreetsetes teeoludes võivad ilmneda järgmised iseloomulikud asjaolud:

juhi võimet suurendada sõiduki kiirust baaskiiruseni piiravad sõiduki veojõud ja dünaamilised omadused;

juhi võimet vähendada sõiduki kiirust pidurdusrežiimil (hädapidurdus) piirab rehvi haardetegur teega ja/või sõiduki pidurdusomadused;

Juhi võimet muuta sõiduki kiirust baaskiiruseks ei piira ei sõiduki veojõud, dünaamilised või pidurdusomadused ega teekatte haarduvus.

Vaatame lähemalt, kuidas modelleeritakse auto liikumist ülaltoodud juhtudel.

Esimesel juhul modelleeritakse auto liikumist auto teoorias tuntud diferentsiaalvõrrandite alusel, mis saadakse auto võimsusbilansi võrrandi alusel:

P t = P p + P kuni + P in + P u, (2.5)

kus P t on veojõud sõiduki püsikiirusel;

P p - tõstetakistusjõud;

P k - veeretakistusjõud;

P in - õhutakistusjõud;

P ja on kiirenduse takistusjõud (vähendatud inertsiaaljõud).

Mootori välistele omadustele ligikaudsed sõltuvused on erinevad. Vaadeldavas mudelis saadakse sõiduki liikumise diferentsiaalvõrrandid töös antud mootori väliskarakteristikute lähenduse põhjal:

kus N e , N max on vastavalt mootori võimsus ja maksimaalne võimsus, kW;

M k - mootori pöördemoment, Nm;

M kN - mootori pöördemoment, maksimaalsel võimsusel, Nm;

a, b, c - antud mootori konstantsed koefitsiendid;

n on mootori väntvõlli nurkkiirus, p/min;

n N - väntvõlli nurkkiirus maksimaalsel mootori võimsusel, p/min.

Pärast võrrandi (2.5) kõigi liikmete asendamist vastavate väärtustega ja mõnede teisendustega saame:

kus m a on auto mass, kg;

m 0 - sõiduki kaal nimikoormusega, kg;

u k i - käigukasti suhe;

v - sõiduki kiirus, m/s;

tr - ülekande efektiivsus;

k p - mootori parandustegur;

Sõiduki nimikiirus i-ndal käigul, m/s;

G a on autole mõjuv gravitatsioonijõud N;

k f on parameeter, mis võtab arvesse sõidukiiruse mõju ratta veeretakistustegurile;

W - sõiduki voolutegur, kg/m;

f 0 - veeretakistuse koefitsient madalal kiirusel;

b - tee pikisuunaline kalle.

Võrrand (2.8) määrab auto kiirenduse sõltuvalt liikumiskiirusest. Vaadeldava simulatsioonimudeli jaoks ei sobi sõltuvused kujul "kiirendus - kiirus", "kiirenduse tee - kiirus" jne, kuna autode koordinaatvektorite ümberarvutamisel pärast ajavahemikku t min (vt plokk 12 joonisel fig. 2.16), on vaja need parameetrid määrata sõltuvalt ajast.

Täieliku kütusevarustuse kiiruse sõltuvuse aja määramiseks saame integreerida avaldise (2.8). Olgu algtingimus v = v 0, kui t=0. Pärast integreerimist saame:

Integreerime uuesti (2.13), algtingimustel t=0 ja s=s 0 . Saame:

kus v 0 on auto algkiirus;

s 0 - auto esialgne asend;

v 1 ja v 2 on võrrandi juured.

Sõltuvuse a = a(t) saamiseks on vaja leida avaldise (2.13) tuletis aja suhtes. Saame:

Avaldised (2.13) - (2.15) võimaldavad ümber arvutada sõiduki liikumisparameetrid suvalise ajaperioodi t min järel, kui liikumisparameetreid piiratakse sõiduki veojõu dünaamiliste omadustega.

Teisel juhul tehakse sõiduki liikumise modelleerimine järgmistel eeldustel:

reaktsioonijõud R x saavutavad maksimaalse väärtuse samaaegselt kõigi rataste puhul;

kõigi rataste haardetegurid x teega ja seetõttu ka auto kiirendus j z jäävad muutumatuks kogu ühtlase aeglustuse perioodi jooksul.

Selliste eelduste korral saab pidurdusprotsessi kirjeldada pidurdusdiagrammiga j з = j(t) (joonis 2.3). Kogu pidurdusprotsess alates ohu tuvastamise hetkest kuni sõiduki täieliku seiskumiseni koosneb järgmistest etappidest:

juhi reaktsiooniaeg t rv;

viivitusaeg t z;

pidurdusjõu tõusuaeg t n;

ühtlane aeglustusaeg t suu;

vabastamise aeg t r.

Haardumisjõudude täieliku kasutamisega pidurdamisel (hädapidurdus) sõltub j suu ainult rehvide haardumistegurist teega ja tee pikikaldest ning kiirenduse väärtust võib pidada konstantseks:

Liikumiskiirus ja auto läbitud teepikkus suvalisel ajahetkel t on kergesti määratavad avaldiste (2.16) ja (2.17) integreerimisega:

Riis. 2.3 Auto pidurigraafik

Ja lõpuks, kolmandal juhul on juhil võimalus anda autole sõidurežiim, mis on tema hinnangul praeguses liiklusolukorras kõige turvalisem ja sobivaim. Sel juhul on kiirenduse väärtus vahemikus

j suu< a < a max , (2. 20)

ja selle määrab juht.

Arvutuste lihtsustamiseks eeldatakse, et selles režiimis liigub auto ühtlaselt kiirendatult kuni järgmise eriolekuni. Liikumiskiirus ja auto läbitud vahemaa pärast ajavahemikku t määratakse sel juhul järgmiselt:

Nüüd kaaluge auto liikumist suunamuutuse tingimustes.

Mudel pakub järgmist tüüpi sõidukite trajektoore:

sirge liikumine;

ringliikumine (juhitavate rataste pöördenurk ei muutu);

kõverjooneline liikumine juhitavate rataste pöörlemise konstantsel nurkkiirusel;

Manööverdavad sõidukid (möödasõidud, rea vahetamine, pööramine jne) on ohtlikud, kuid samas sõiduki liikumise lahutamatud elemendid. Arvukad konfliktsituatsioonid ja õnnetused on seotud autode liikumissuuna muutumisega, kuna sellised, sageli teistele liiklejatele ootamatult sooritatud manöövrid tekitavad liikluse häireid. Vaatamata sellele lihtsustavad erinevate kodu- ja välismaiste teadlaste olemasolevad liiklussimulatsioonimudelid liikumissuuna muutmisel auto liikumist ja selle üksikute punktide trajektoore. Tihti määrab auto asukoha teel vaid pikikoordinaat; see tähendab, et auto ei liigu põikisuunas ja ümbersõidul või reavahetusel toimub reavahetus järsult. Nendes mudelites, mis võtavad arvesse külgliikumist, käsitletakse auto liikumist parimal juhul tasapinnalise paralleelse liikumisena, mille puhul auto pikitelg jääb paralleelseks tee pikiteljega. Selline lihtsustus on põhjendatud mõne probleemi lahendamisel, näiteks sidekiiruse määramisel, teelõigu läbilaskevõime määramisel, keskkonnaprobleemide lahendamisel jne, kuna see lihtsustab oluliselt mudelit ja vähendab arvutuste mahtu. Liiklusohutuse taseme hindamise probleemide lahendamisel ei ole aga selline lihtsustus põhjendatud.

Auto kõverjoonelise liikumise vaadeldavas simulatsioonimudelis määrab:

auto arvutatud punkti koordinaadid fikseeritud koordinaatsüsteemi suhtes;

sõiduki suunanurk;

sõiduki juhitavate rataste pöördenurk;

juhitavate rataste pöörlemise nurkkiirus.

Projekteerimispunktiks, mille suhtes tehakse kõik arvutused auto koordinaatide määramiseks, võetakse mudelis auto tagatelje keskpunkt. Sel juhul on koordinaate defineerivatel võrranditel kõige vähem tülikas vorm.

Mudelis käsitletakse auto liikumist sirgjoonelise liikumise, ringliikumise ja muutuva raadiusega kõverjoonelise liikumise vaheldumisena. Kaks esimest on suhteliselt lihtsate analüütiliste väljenditega üsna hästi kirjeldatavad. Vaatame lähemalt kõverjoonelist liikumist (joonis 2.4). Järgnevalt teeme järgmised eeldused:

auto mõlema juhitava ratta pöördenurgad on üksteisega võrdsed;

auto ratastel puudub külglibisemine;

juhitavate rataste pöörlemise nurkkiirus on konstantne;

auto arvutatud punkt liigub pideva kiirendusega;

auto liigub tasapinnal (tasapinnaline liikumine);

rataste libisemine puudub;

Auto veeremine trajektoori ei mõjuta.

Liiklusohutuse taseme hindamiseks on kahel esimesel eeldusel vähe tähtsust. Kui liikumise ajal muutub oluliselt juhitavate rataste pöörlemise nurkkiiruse väärtus või auto konstruktsioonipunkti kiirendus, siis on auto trajektoor katki.

mitmeks osaks, millest igaühe puhul eeldatakse, et näidatud koguste väärtused on konstantsed.

Riis. 2.4

Seega lihtsustavad ülaltoodud eeldused vastuvõetava täpsuse piires arvutusi oluliselt.

Tööd pakuvad võrrandeid, mis võimaldavad määrata auto trajektoori. Seega annab töö järgmised valemid, mis määravad auto tagatelje keskkoha suunanurga ja liikumise koordinaadid:

kus x in, y in on auto tagatelje keskkoha koordinaadid;

C 1 ja C 2 on algtingimustega määratud konstandid;

auto roolirataste pöördenurk;

v o - sõiduki kiirus;

k on sõiduki juhitavate rataste pöörlemise nurkkiirus;

L 0 - autobaas;

k p - kõverjoonelise liikumise režiimi iseloomustav režiimi parameeter:

Sarnased valemid, kuid võrreldes auto massikeskme liikumisega, on antud töös:

kus x c.m. , y c.m. - auto massikeskme koordinaadid;

C 1, C 2, C 3 - algtingimustega määratud konstandid;

v a - sõiduki kiirus;

v y - auto massikeskme külgnihke kiirus;

a on auto pikitelje nurkkiirus horisontaaltasandil.

Auto pikiteljel paiknevate punktide trajektoore saab täpsustada selle kõveruse sõltuvuse ajast. Kuid auto kõverjoonelise liikumise modelleerimine fikseeritud koordinaatsüsteemis läbi x in ja y in, samuti nurga on palju mugavam.

Valemites (2.23) - (2.26) eeldatakse, et auto kiirus on konstantne. Reaalses auto liikumise protsessis liiklusvoos kombineeritakse kõverjoonelist liikumist sageli kiiruse muutumisega. See juhtub eelkõige järgmistes olukordades:

enne peatumist vähendab auto samaaegselt kiirust ja läheneb kõvera liikumisega sõidutee paremale servale;

pärast peatusest startimist suurendab auto kiirust ja läheneb kõverat teed pidi sõiduraja keskele;

möödasõidul, eriti möödasõidu esimeses faasis koos ootamisega, vahetab auto rada ja samal ajal suurendab kiirust;

ristmikel, pärast keelavat foorisignaali või pärast paremalt takistusest möödasõitu pööravad autod liiguvad kõverjooneliselt ja kiirendusega jne.

Kurvijoonelise liikumise kombinatsioon kiiruse muutumisega on potentsiaalne konfliktsituatsioonide allikas, sest sageli sunnib see teisi liiklejaid sõidurežiimi muutma. Auto kõverjoonelist liikumist tuleb modelleerida võttes arvesse kiirendust.

Erinevates uuringutes antud võrrandid kõverjoonelise liikumise trajektoori määramiseks väljendavad sõiduki liikumise parameetreid kõige sagedamini diferentsiaalvõrrandite või integraalide kujul. Integrandid on reeglina keerulise analüütilise vormiga ja neid ei integreerita otseselt. Seetõttu lahendatakse sellised võrrandid kas arvuliste, ligikaudsete meetoditega arvutite abil või konstrueeritakse liikumise trajektoor graafilise või graafilis-analüütilise meetodiga. Paljude konkreetsete ülesannete lahendamisel osutuvad need meetodid sobivaks, eriti esimene neist, mille abil saate peaaegu igasuguse täpsusega arvutada liikumistrajektoori. See saavutatakse aga suure arvutusaja arvelt. Simulatsioonikatsete käigus võivad antud teelõigul korraga viibida sadu autosid, millest igaüks sooritab erinevaid manöövreid, sealhulgas kõverjoonelist liikumist koos kiirendusega. Iteratiivsete meetodite kasutamisel liikumistrajektoori arvutamiseks on suur arvutiaega vältimatu. See aeglustab järsult reaalajas simulatsioonimudelit. Seetõttu tundub siinkohal sobivam laiendada integrandid vajaliku täpsusega astmereaks. Lisaks saab pärast saadud polünoomide integreerimist soovitud kõverjoonelise liikumise parameetrid saada analüütilisel kujul.

Laske autol liikuda pideva kiirendusega a. Siis saab avaldis (2.23) järgmise kuju:

Laiendame (2.30) paremal pool sisalduvat integrandi astmereaks ja võtame vajaliku täpsuse tagamiseks nii palju liikmeid, kui on vaja. Tähistame

Seejärel saab (2.30) ümber kirjutada järgmiselt:

Samuti otsime võrrandite (2.24) ja (2.25) ligikaudseid analüütilisi lahendusi, laiendades funktsioonid f()=cos(()) ja g()=sin(()) astmereaks, kus suunanurk on määratud avaldisega (2.31). Mitme esimese järgu nimetatud funktsioonide tuletised on toodud tabelis. 2.1.

Olgu kõverjoonelise liikumise alguses auto kursinurk 0 =0. Seejärel:

Nüüd saate määrata auto punkti B trajektoori (joonis 2.4). Avaldised (2.24) ja (2.32) võimaldavad pärast integreerimist (2.24) saada

Samamoodi saame avaldistest (2.25) ja (2.33) pärast integreerimist (2.25)

Avaldised (2.34) ja (2.35) on täiesti vastuvõetavad auto trajektoori arvutamisel, kui kõverjoonelise liikumise ajal muutub auto kursinurk mitte rohkem kui 90°. Reaalsetes teeoludes ei ületa selline muutus peaaegu kunagi

Tabel 2.1

Funktsioonide tuletised f(s) Ja g(s) paar esimest tellimust

Tuletise järjekord n

f(n)(u), kui u = 0

g(n)(u), kus u=0

105 B4-588 B2-896 D2

420 B3-272 B+1120 B D2

2520 B3 D+8160 B D

8064 B2 D-2240 D3+2176 D

6300 B4-18960 B2+25200 B2 D2-31104 D2

945 B5+16380 B3-7936 B+57120 B D2

Tabel 2.2

Funktsioonide f(i) ja g(i) väärtused, mis kirjeldavad auto GAZ-24 pööramise protsessi kiirusel v 0 =10 m/s, k = 0,05 rad/s, L 0 =2,8 m, 45°.

g(i), vastavalt valemile (2.23), deg

f(u), vastavalt valemile (2.23)

f(u), vastavalt valemile (2.32)

g(u), vastavalt valemile (2.23)

g(u), vastavalt valemile (2.33)

Tabelis 2.2 näitab funktsioonide f() ja g() väärtusi, mis kirjeldavad auto GAZ-24 pööramise protsessi kiirusel v 0 =10 m/s, k = 0,05 rad/s, L 0 =2,8 m. Arvutused viidi läbi ühe poolega, kasutades avaldisi (2.23) ja teisel poolel avaldisi (2.32) ja (2.33). Kell<90° расхождения в значениях функций не превышает 0,1%, что вполне обеспечивает требуемую точность вычислений.

Auto mis tahes muu punkti E koordinaadid (joonis 2.4), mis asuvad punktist B kaugustel a ja b, vastavalt piki auto piki- ja põiktelge, saab määrata järgmiselt:

Vaatleme, kuidas toimub pööramise protsess simulatsioonimudelis vaba liikumise režiimis. Enne kõvera liikumise algust vähendab juht kiirust pöördelõigu vaba liikumise baaskiiruse v st väärtuseni. Selle kiirusega lõpetab ta pöörde ja pärast pööret vajadusel suurendab taas kiirust. Liikumiskiiruse vst väärtus määratakse välivaatluste põhjal.

Pööramisprotsessi mudel koosneb kolmest etapist (joonis 2.5):

Juht pöörab konstantse nurkkiirusega p1 parem-/vasakpöörde sooritamisel rooli päri-/vastupäeva. Juhtrattad teevad pöörde nurkkiirusega k1. Auto liigub kõveras suunas. Liikumistrajektoori kõverusraadius väheneb +-lt R p-ni (lõik E 1);

Juht hoiab rooli paigal. Auto liigub mööda ringteed konstantse pöörderaadiusega R p pöördekeskme C suhtes. See etapp võib pöördeprotsessi ajal puududa (jaotis E 2);

juht pöörab rooli konstantse nurkkiirusega p2 vastassuunas. Juhtrattad pöörlevad nurkkiirusega k2. Auto liigub jälle mööda kõverat rada. Liikumistrajektoori kõverusraadius suureneb R p-lt +ni (lõik E 3).

Ebavõrdsuse esimene osa (2,38) on seletatav juhi sooviga hoida autot oma sõidurajal. Kell< S 0min водитель не в состоянии предотвратить выезд автомобиля за пределы своей полосы движения, если ускорение не изменять (если ускорение изменится, то S 0min тоже изменится).

Riis. 2.5 Auto pööramisprotsessi mudeli kirjeldamise skeem

Ebavõrdsuse teine ​​osa on seletatav sellega, et kui pöörde alguses > S 0max ja edaspidi juht auto liikumisparameetreid (k ja a) ei muuda, siis auto kas lahkub teelt. või risti nurga κ poolitaja OC teravnurga all , s.o. tulevikus lahkub see jälle sõidurajalt. Seetõttu on juht selle vältimiseks sunnitud lähenema pöördele, kuni on täidetud teine ​​ebavõrdsuse tingimus (2,38) ja alles siis alustama pööret.

Juht hakkab pöörama mõnda aega enne ristmiku keskpunkti O. on juhuslik muutuja. Ülaltoodud piirangutega jääb koguse väärtus piiridesse:

S 0 min< < S 0max (2.38)

Juhtrataste pöörlemise nurkkiirust k, mis on määratletud rooliratta pöörlemisnurkkiiruse p suhtena rooli ülekandearvusse, loetakse juhuslikuks suuruseks ja määratakse järgmiselt:

määratakse juhitavate rataste pöörlemisnurkkiiruse minimaalne väärtus kmmin, mille juures auto pöörde ajal ei lahku pöörde keskpunkti C vastasküljel olevalt rajalt (joonis 2.6a);

määratakse juhitavate rataste pöörlemise nurkkiiruse maksimaalne väärtus kmax, mille juures auto pöörde ajal ei lahku pöörde keskpunkti küljelt rajalt (joonis 2.6b);

määratakse kindlaks rooliratta pöörlemisnurkkiiruse р min ja р max väärtused, mis vastavad kmin ja kmax väärtustele;

Väärtuste p min ja p max vahel mängib juhuslike arvude generaator vastavalt etteantud jaotusseadusele juhuslikku arvu k ", mis on juhitavate rataste pöörlemise nurkkiiruse väärtus ratta esimeses etapis. keerata.

Riis. 2.6 Skeem auto juhitavate rataste pöörlemise nurkkiiruse arvutamiseks pöörde ajal

Juhusliku suuruse k " jaotusseadus määratakse välivaatluste tulemusel (vt lõik 3.2, joonis 3.12). Kolmandas etapis määratakse juhitavate rataste pöörlemise nurkkiiruse väärtus k "" sarnaselt. .

Artikli lühendatud tõlge-ümberjutustus: .

Sissejuhatus

Artiklis kirjeldatakse esemete liikumise modelleerimise lähenemisviisi põhitõdesid, mida on mugav arvutimängudes kasutada. See lähenemine on lihtne, seda rakendavad programmid töötavad kiiresti ja on üsna stabiilsed. Lisaks ei ole selle põhitõdede mõistmiseks vaja erilisi matemaatilisi teadmisi (kuigi lähenemisel endal on kindlad matemaatilised alused). Selle abil saate simuleerida kudede, pehmete ja kõvade kehade liikumist, samuti kehade liikumist, võttes arvesse seoseid.

Füüsikalist modelleerimist ehk tegelaste liikumise modelleerimist füüsika (õigemini mehaanika) seadustest lähtuvalt on uuritud päris pikka aega. Kirjanduses on välja pakutud erinevaid lähenemisviise (vt jm) ning täpsete ja usaldusväärsete algoritmide loomiseks on palju vaeva nähtud. Täpsed meetodid liikumise modelleerimiseks on füüsikas tuntud juba pikka aega. Mängude ja virtuaalreaalsussüsteemide puhul pole aga täpsus kõige olulisem eelis (kuigi see on hea, kui see on). Palju olulisemad on usutavus (programmeerija võib tegelikkuse mudelit moonutada nii palju kui tahab, seni kuni tal õnnestub mängijat köita) ja täitmise kiirus (teostamiseks eraldatakse vaid osa ajast, mis animatsioonikaader kestab. arvutused liikumise modelleerimiseks). Füüsilise modelleerimise puhul viitab termin "usutavus" ka stabiilsusele: edukaks ei saa pidada modelleerimismeetodit, mille puhul kehad läbivad takistusi või põrkavad, kui nad peaksid paigal lamama. Käesolevas töös kirjeldatud meetodid töötati välja eeskätt arvutamise usutavuse ja kiiruse saavutamiseks. Neil on kõrge jõudlus ja neid on üsna lihtne rakendada (vähemalt võrreldes teiste samu probleeme lahendavate meetoditega).

Vaadeldav meetod on iteratiivne, nii et alates teatud sammust saab selle igal ajal peatada. See võimaldab kompromissi arvutuste täpsuse ja ajakulu vahel: kui teatud viga peetakse vastuvõetavaks, võib lubada koodil kiiremini töötada; Veelgi enam, vea suurust saab täitmise ajal adaptiivselt valida. Meetod käsitleb ka kokkupõrkeid ja puhkekontakte ning tuleb toime üksteise peale laotud kehade virna modelleerimisega, mis on paljude füüsikamootorite probleem.

Meetodi edu sõltub mitme tehnika õigest kombinatsioonist ja eeliste kasutamisest:

  • Verlet' numbrilise integreerimise meetod;
  • kokkupõrgete ja keha läbitungimise käsitlemine projektsiooni abil;
  • lihtne piirangute lahendaja, kasutades lõõgastumist;
  • ruutjuure lähendamine, mis suurendab arvutuste kiirust;
  • tahkete ainete modelleerimine sidemetega ühendatud osakestena.

Anname iga sellise tehnika kohta lühikese selgituse. Selle dokumendi kirjutamisel püüdis autor teha selle kättesaadavaks võimalikult laiale publikule, kaotamata seejuures rakendamiseks vajalikku olulist teavet. See tähendab, et matemaatilised selgitused ja põhjendused on viidud miinimumini, välja arvatud juhul, kui need on teema mõistmiseks üliolulised. Töö eesmärk on demonstreerida võimalust rakendada üsna arenenud ja robustset füüsilise modelleerimise meetodit ilma matemaatilistesse peensustesse takerdumata.

Sisu on korraldatud järgmiselt. Jaotis 2 kirjeldab osakeste süsteemi esitust ilma kiirust kasutamata. Sellel esitusviisil on mitmeid eeliseid, millest olulisemad on ühenduste stabiilsus ja lihtsus ning muud piirangud. Jaotis 3 kirjeldab, kuidas kokkupõrke käsitlemine toimub. Seejärel, jaotises 4, täiendatakse osakeste süsteemi ühendustega, mis võimaldavad kanga liikumist simuleerida. 5. osas selgitatakse, kuidas luua omavahel ühendatud osakeste süsteem jäika keha modelleerimiseks. Järgmisena näitame jaotises 6, kuidas rakendada kehade (eriti hingede) vahelisi ühendusi. Jaotis 7 sisaldab erinevaid lühimärkusi ja mõningaid kogemusi hõõrdumise rakendamisel.

Järgnevalt on vektorid tähistatud nooltega tähtedega ja nende komponendid alaindeksitega: \(\vec(x)=(x_1,x_2,x_3)\) .

Verleti integratsioonimeetod

Simulatsiooni (s.o füüsilise protsessi simuleerimise arvutisüsteemi abil) süda on osakeste süsteem. Tavaliselt eeldatakse sellise süsteemi rakendamisel, et igal osakesel on kaks põhitunnust: koordinaat (positsioon) \(\vec(x)\) ja kiirus \(\vec(v)\) . Seejärel arvutatakse valemite abil koordinaatide \(\vec(x)^\prime\) ja kiiruse \(\vec(v)^\prime\) uued väärtused

$$ \begin(joondatud) \vec(x)^\prime &= \vec(x) + \vec(v) \Delta t, \\ \vec(v)^\prime &= \vec(v) + \vec(a) \Delta t, \end(joondatud) $$

kus \(\Delta t\) on ajasamm, \(\vec(a)\) on kiirendus, mis on arvutatud vastavalt Newtoni 2. seadusele \(\vec(f)=m \vec(a)\) (kus \(\vec(f)\) on osakesele mõjuv kogujõud). Antud valemid rakendavad kõige lihtsamat numbrilise integreerimise meetodit – Euleri meetodit.

Vaatleme veel üht osakese kirjeldust, mille puhul kiirust ei kasutata: iga osakese asukoha ja kiiruse salvestamise asemel salvestame osakese praeguse asukoha \(\vec(x)\) ja selle asukoha eelmises kohas. integreerimise samm \(\vec(x)^ (*)\) . Eeldusel, et integreerimise samm on konstantne, saame uute väärtuste arvutamiseks järgmised valemid:

$$ \begin(joondatud) \vec(x)^\prime &= 2\vec(x) - \vec(x)^(*) + \vec(a) \Delta t^2, \\ \vec( x)^(*) &= \vec(x). \end(joondatud) $$

Seda numbrilise integreerimise meetodit nimetatakse Verleti meetodiks (vt) ja seda kasutatakse aktiivselt molekulaardünaamikas.

Verleti meetod põhineb teise tuletise arvutamise ligikaudsel valemil

$$ \frac(\Delta^2 \vec(x))(\Delta t^2) = \frac( \frac(\vec(x)^\prime - \vec(x))(\Delta t) - \frac(\vec(x) - \vec(x)^(*))(\Delta t) )(\Delta t) = \frac(\vec(x)^\prime - 2\vec(x) + \vec(x)^(*))(\Delta t^2) = \vec(a) $$

See lähendus ei ole kõige täpsem (arvuliseks integreerimiseks on täiustatud meetodeid), kuid see on stabiilne ja töötab kiiresti. Vähendades teguri 2 näiteks 1,99-ni, juurutame sellega tõmbejõu, mis hajutab süsteemi energiat. Pange tähele ka seda, et \(\vec(x)-\vec(x)^(*)\) on viimase integreerimisetapi jooksul läbitud vahemaa (\(\vec(v)\Delta t\) ).

Integreerimisetapi lõpus salvestatakse iga osakese \(\vec(x)\) praegune asukoht vastavasse muutujasse \(\vec(x)^(*)\) järgmises etapis kasutamiseks. Kui süsteemis on palju osakesi, siis on nende koordinaatide kopeerimise asemel mugav kasutada osuti ümbersuunamist.

Ülalkirjeldatud ideid rakendav kood võib välja näha selline (klass Vector3 sisaldab kõiki vajalikke toiminguid vektoritega)

klass ParticleSystem ( Vector3 m_x [ NUM_PARTICLES ]; // Praegune positsioon Vector3 m_oldx [ NUM_PARTICLES ]; // Eelmine positsioon Vector3 m_a [ NUM_PARTICLES ]; // Kogu jõud (kiirendus) Vector3 m_vGravitatsioon ; // Gravitatsiooni ujuk m_fTimeStep ; public : void TimeStep(); privaatne : void Verlet(); void SatisfyConstraints(); void AccumulateForces(); // (jätame välja konstruktorid, välja lähtestamise jne) }; // integreerimise samm Verleti meetodi järgi void ParticleSystem::Verlet() ( for (int i = 0 ; i< NUM_PARTICLES ; i ++ ) { Vector3 & x = m_x [ i ]; Vector3 temp = x ; Vector3 & oldx = m_oldx [ i ]; Vector3 & a = m_a [ i ]; x += x - oldx + a * fTimeStep * fTimeStep ; oldx = temp ; } } // igale osakesele mõjuvate jõudude liitmine void ParticleSystem::AccumulateForces() ( // Kõik osakesed on gravitatsiooni mõju all jaoks (int i = 0 ; i< NUM_PARTICLES ; i ++ ) m_a [ i ] = m_vGravity ; } // kattuvate ühenduste vastavuse kontrollimine void ParticleSystem::SatisfyConstraints() ( // Nüüd ei huvita meid, kuidas seda rakendatakse.) // arvutamise samm void ParticleSystem :: TimeStep () ( AccumulateForces (); Verlet (); SatisfyConstraints (); )

Siiani ei tundu kõik ülalkirjeldatud eriti muljetavaldav. Selle lähenemisviisi eelised saavad selgeks, kui liigume edasi piirangute kasutamise ja jäikade kehade kirjeldamise juurde.

Proovige määrata \(\vec(a)=(0,0,1)\) ja algtingimused \(\vec(x)=(1,0,0)\) , \(\vec(x)^*= (0,0,0)\) . Arvutage käsitsi paar sammu ja vaadake, mis juhtub.

Kokkupõrked ja kontaktide käsitlemine projektsiooni abil

Kehadevaheliste kontaktide töötlemise meetodid, mis põhinevad karistusfunktsioonide kasutamisel (trahvipõhised skeemid), viitavad sellele, et kokkupuutepunktis, kus on võimalik kehade tungimine üksteisesse, tuleb selle kontakti simuleerimiseks sisestada vedru. Seda lähenemisviisi on lihtne rakendada, kuid see toob kaasa mitmeid tõsiseid probleeme. Eelkõige on väga raske valida vedru jäikust nii, et ühelt poolt ei tungiks esemed üksteisesse liiga sügavale ja teiselt poolt, et süsteem ei kaotaks vedru jäikuse tõttu stabiilsust. olles liiga kõrge. Teine lähenemine kokkupõrke töötlemisele on see, et kokkupõrke tuvastamisel "keritakse" aeg tagasi, kuni kehade täpse kokkupuute hetkeni (näiteks kasutades binaarset otsingut), seejärel korrigeeritakse kehade asukohti ja kiirusi. (kasutades füüsika kursusest tuntud kokkupõrgete valemeid), misjärel algab arvutamine uuesti sellest ajahetkest. Ja nii – igaks kokkupõrkeks. Mitte eriti ökonoomne lähenemine, kui plaanite paljude kehade liikumist reaalajas simuleerida.

Siin vaatleme teistsugust lähenemist. Takistuse sisse tunginud osakesed projitseerime väljaspool takistust. Projektsiooni all peame silmas osakese liikumist, mis on piisavalt väike, et see lihtsalt takistusest vabastada. Tavaliselt hõlmab see osakese liigutamist kontaktpinnaga (takistusega) normaalses suunas – siit tuleneb ka mõiste "projektsioon".

Mõelge järgmisele näitele. Olgu meie “maailm” (0,0,0)--(1000,1000,1000) suuruse kuubi sisemus ja lisaks on osakeste taastamiskoefitsient null (st osakesed põrkuvad kokku kuubi pinnaga kuubik sellest ei kajastu). Tagamaks, et osakeste koordinaadid jääksid kuubi sisse, kirjutame järgmise projektsiooni rakendava koodi:

// Sunnib osakesi kuubi sisse jääma void ParticleSystem :: SatisfyConstraints () ( for (int i = 0 ; i< NUM_PARTICLES ; i ++ ) { // Kõigi osakeste jaoks Vektor3 & x = m_x [ i ]; x = vmin(vmax(x, Vektor3(0, 0, 0)), Vektor3(1000, 1000, 1000)); ) )

(vmax on maksimumi arvutamise komponentide kaupa ja vmin on miinimumi samaväärne arvutamine). See kood käsitleb nii kokkupõrkeid kui ka puhkekontakte (st juhtumeid, kus punkt asub kuubi pinnal) ja salvestab kõigi kuubis olevate osakeste asukoha. Verleti meetodi ilu seisneb selles, et vastavad muudatused kiiruse väärtustes tehakse automaatselt. Järgmistes TimeStep() väljakutsetes reguleeritakse kiirust nii, et see ei sisaldaks kuubi pinnaga risti olevat komponenti (mis vastab nulli taastetegurile). Vaata joonist 1.

Proovige neid arvutusi ise teha - ja näete, et pole vaja kiirust kuubi seinaga risti olevas suunas nullida - see juhtub "iseenesest". See võib tunduda triviaalne, kui piirduda osakeste modelleerimisega, kuid Verlet' meetodi peamised eelised ilmnevad kohe, kui liigume edasi sidemete ja ühendatud jäikade kehade käsitlemisele. See tähendab, et kohe.

Mitme samaaegselt pealepandud ühenduse töötlemine lõdvestusmeetodil

Kangamudel on tavaliselt vedrudega ühendatud osakeste süsteem. Sellise süsteemi jaoks pole keeruline diferentsiaalvõrrandeid koostada. Kuid üks asi on ehitada ja hoopis teine ​​asi lahendada. Samas kerkivad esile kõik probleemid, mis meil karistusfunktsioonide kasutamisel tekkisid: liiga jäigad vedrud viivad selleni, et võrrandisüsteem ise muutub “jäigaks süsteemiks” ja see toob kaasa ebastabiilsuse, kui kasutada lihtsamaid arvulise integreerimise meetodeid või aeglane töö, kui kasutada arenenumaid meetodeid, on mõlemal juhul peavalu garanteeritud. Ja vastupidi, liiga pehmed vedrud muudavad kanga ebareaalselt vetruvaks.

Kõige huvitavam juhtub aga siis, kui vedru jäikus on suunatud lõpmatuseni: süsteem muutub ühtäkki lahendatavaks isegi väga lihtsa (ja kiire) integreerimismeetodi puhul, jäädes samas stabiilseks. Kuid enne kui jätkame kangast rääkimist, pöördume tagasi eelmise näite juurde. Kuubi, millega me tegeleme, võib vaadelda kui ühepoolsete piirangute kogumit (st piiranguid, mis on kirjutatud ebavõrdsuse kujul) – üks kuubi kummalegi poolele –, mida tuleb kogu simulatsiooni jooksul läbi viia.

\begin(võrrand) x_i \geq 0 \ \text(and)\ x_i \leq 1000 \quad (i=1,2,3). \label(eq:C1) \end(võrrand)

Vaadeldavas näites piisab sidemete poolt seatud piirangutest kinnipidamiseks (et osakesed jääksid kuubi sisse), kui lihtsalt projitseerida “välja ronitud” osakeste koordinaadid kuubi pinnale. Seda ideed kirjeldatakse järgmises pseudokoodis:

// Pseudokood piirangute jõustamiseks (1) i = 1 , 2 , 3 puhul komplekt xi = min ( max ( xi , 0 ), 1000 )

Seda võib ette kujutada nii, nagu oleks osakest ja takistuse pinda ühendanud lõpmata jäik vedru, mis pikenedes naaseb hetkega oma normaalpikkusele, mis on võrdne nulliga.

Laiendame oma mudelit, lisades sellele varda pikkusega 100. Selleks peame defineerima kaks osakest (\(\vec(x)_1\) ja \(\vec(x)_2\) ) ning nõudma, et nendevaheline kaugus on alati 100. Selle kahepoolse seose matemaatiline tähistus on järgmine:

\begin(võrrand) |\vec(x)_2-\vec(x)_1| = 100. \label(eq:C2) \end(võrrand)

Isegi kui algsel ajahetkel vastavad osakeste asukohad tingimustele \eqref(eq:C2), siis järgmisel hetkel need tingimused suure tõenäosusega ei täitu. Õige kauguse väärtuse saamiseks liigutame osakesi, projitseerides need \eqref(eq:C2) poolt kirjeldatud lahenduste hulgale. Selleks osakesed kas eemalduvad üksteisest või tõmmatakse neid lähemale, olenevalt sellest, kas numbrilise integreerimise teel saadud kaugus on väike või suur. Vaata joonist 2.

Osakeste liigutamine, et korrigeerida kaugust, mis ei vasta piirangule \eqref(eq:C2)

Pseudokood, mis rakendab tingimusi \eqref(eq:C2):

Delta = x2 - x1 ; deltapikkus = sqrt(delta * delta); diff = (deltalength - restlength ) / deltapikkus ; x1 -= delta * 0,5 * erinevus; x2 += delta * 0,5 * diff ;

Pange tähele, et delta on vektor ja delta*delta on skalaarkorrutis. See pseudokood liigutab osakesed üksteisest lahku või liigutab neid, et saavutada nende vahel vajalik kaugus. Jällegi võime mõelda sellele kui lõpmatult jäigale vedrule, mis naaseb koheselt oma tavapärase pikkuseni 100.

Oletame nüüd, et lisaks tingimusele \eqref(eq:C2) peab olema täidetud ka tingimus \eqref(eq:C1) (osakesed peavad olema kuubi sees). Võib selguda, et tingimuse \eqref(eq:C2) täitmisel rikuvad mõned varda osakesed \eqref(eq:C1) nõudeid (varras torkab kuubist välja). Muidugi saab rikkuva osakese uuesti kuubi pinnale projitseerida, käivitades käsu \eqref(eq:C1), kuid siis \eqref(eq:C2) katkeb.

Nõuete \eqref(eq:C1) ja \eqref(eq:C2) üheaegseks täitmiseks peame lahendama võrrandisüsteemi. Teeme seda, kuid mitte otse: kordame lihtsalt kahte pseudokoodi fragmenti üksteise järel teatud arv kordi, lootuses, et tulemus on kasulik. Seda lähenemisviisi rakendatakse järgmises koodis:

//kuubi sees varda modelleerimise teostus void ParticleSystem :: SatisfyConstraints () ( for (int j = 0 ; j< NUM_ITERATIONS ; j ++ ) { // Esmalt täidame tingimused (1) jaoks (int i = 0 ; i< NUM_PARTICLES ; i ++ ) { // Kõigi osakeste jaoks Vektor3 & x = m_x [ i ]; x = vmin(vmax(x, Vektor3(0, 0, 0)), Vektor3(1000, 1000, 1000)); ) // Nüüd rahuldame (2) Vector3 & x1 = m_x [0]; Vector3 & x2 = m_x [1]; Vector3 delta = x2 - x1 ; ujuki deltapikkus = sqrt(delta * delta); float diff = (deltalength - restlength ) / deltalength ; x1 -= delta * 0,5 * erinevus; x2 += delta * 0,5 * diff ; ) )

(osakeste lähtestamine on siin välja jäetud). Kuigi see "rumala" kordamise meetod võib tunduda mõnevõrra naiivne, läheneb see siiski otsitavale lahendusele! Matemaatikas nimetatakse seda lõõgastusmeetod(või Jacobi või Gauss-Seidel - oleneb, kuidas täpselt seda teete, vaata). See toimib, täites individuaalseid piiranguid järjestikku ja läheneb globaalsele konfiguratsioonile, mis vastab kõigile piirangutele üheaegselt. See meetod on väga kasulik olukordades, kus korraga tuleb täita mitu sõltumatut piirangut.

Vajalike iteratsioonide arv sõltub modelleeritavast süsteemist ja liikumise olemusest. Saate muuta selle arvu valiku kohandatavaks, mõõtes eelmise iteratsiooniga võrreldes toimunud muutust. Kui lõpetame iteratsioonid liiga vara, ei ole tulemus piisavalt täpne, kuid tänu Verlet' meetodile on see tõenäoliselt järgmises kaadris veidi parem, järgmises kaadris veelgi parem jne. See tähendab, et ka lõõgastumise peatamine varakult ei hävita animatsiooni täielikult, vaid muudab pildi tõmblevamaks.

Kanga modelleerimine

Asjaolu, et varda tüüpi piirangut võib pidada väga jäigaks vedruks, võimaldab seda tüüpi piirangut kasutada kudede modelleerimiseks. Oletame näiteks, et kangast kujutab kuusnurkne võrk, mis koosneb kolmnurkadest. Iga võrgusõlm tähistab osakest ja iga tahk on osakesi ühendav varda tüüpi ühendus (varda normaalne pikkus võrdub selle ühendatavate sõlmede vahelise kaugusega).

Funktsioon HandleConstraints(), mis vastutab piirangute töötlemise eest, kasutab kõikide piirangute üle lõdvestumist. Lõõgastustsüklit saab korrata mitu korda. Kuid enamikul juhtudel piisab vaid ühest iteratsioonist, et saada hea välimusega animatsioon. See tähendab, et kanga simulatsiooni ajakulu sõltub peamiselt sellest, kui kaua kulub \(N\) ruutjuure ja \(N\) jagamisoperatsioonide sooritamiseks (kus \(N\) on servade arv simuleerivas võrgus kangast). Allpool näitame teile nippi ruutjuure arvutamisest vabanemiseks. Kuid kõigepealt vaatame, kuidas piirangute töötlemine välja näeb.

// Kanga modelleerimise rakendamine struct Piirang ( int particleA , particleB ; float restlength ; ); // Oletame, et massiiv m_constraints on juba olemas void ParticleSystem :: SatisfyConstraints () ( for (int j = 0 ; j< NUM_ITERATIONS ; j ++ ) { for (int i = 0 ; i < NUM_CONSTRAINTS ; i ++ ) { Constraint & c = m_constraints [ i ]; Vector3 & x1 = m_x [ c . particleA ]; Vector3 & x2 = m_x [ c . particleB ]; Vector3 delta = x2 - x1 ; float deltalength = sqrt (delta * delta ); float diff = (deltalength - c . restlength ) / deltalength ; x1 -= delta * 0.5 * diff ; x2 += delta * 0.5 * diff ; } // Kinnitage üks kangast moodustavatest osakestest päritolu külge m_x [0] = Vektor3 (0, 0, 0); ) )

Nüüd arutame, kuidas ruutjuure arvutamisest lahti saada. Kui kõik piirangud on täidetud (hästi või peaaegu täidetud), siis, nagu me juba teame, kipub ruutjuure arvutamise tulemus olema \(r\) - ühenduse (varda) normaalne pikkus. Kasutame seda fakti ruutjuure funktsiooni ligikaudse avaldise saamiseks. Asendame funktsiooni \(\sqrt(x)\) selle Taylori seeria laienduse esimest järku liikmega pikkuse \(r\) läheduses (see võrdub Newtoni-Raphsoni meetodi ühe iteratsiooniga esialgne lähendus \(r\)). Pärast mõningaid teisendusi saame järgmise pseudokoodi:

// Pseudokood piirangute (2) jõustamiseks, kasutades sqrt lähendust delta = x2 - x1 ; delta *= puhkepikkus * puhkepikkus / (delta * delta + puhkepikkus * puhkepikkus ) - 0,5 ; x1 -= delta; x2 += delta ;

Pange tähele, et kui kaugus juba täidab piiranguid (st kui |delta|=restlength), saame delta väärtuseks (0,0,0) ja muutust ei toimu.

Nüüd ei kasuta me enam iga suhte töötlemisel ruutjuuri. Lisaks saab eelnevalt välja arvutada puhkepikkuse * puhkepikkuse ruudu. Aeganõudvad toimingud taanduvad \(N\) jaotuste tegemisele kaadri kohta (ja vastavale mälule ligipääsule) – raske on välja mõelda midagi, mis töötaks oluliselt kiiremini.

Piirangud ei pruugi olla täidetud ühe iteratsiooniga, kuid tänu Verleti meetodile läheneb süsteem kiiresti õigesse olekusse (kui kõik piirangud on täidetud) - sõna otseses mõttes mõne kaadri jooksul. Tegelikult välistab ainult ühe iteratsiooni ja ruutjuure lähenduse kasutamine võrrandisüsteemi jäikuse probleemi, mis ilmneks tingimata absoluutselt jäikade varrastega süsteemis.

Paigutades pin linke külgnevate tippude paaride vahele, saab kudede modelleerimise algoritmi laiendada taimede modelleerimisele.

Selles jaotises käsitletud kood ja võrrandid eeldavad, et kõigil osakestel on sama mass. Erineva massiga osakesi saab modelleerida samal viisil, kuid saadud võrrandid on veidi keerulisemad.

Seega on erineva massiga osakeste piirangu \eqref(eq:C2) järgimine rakendatud järgmise pseudokoodiga:

// Pseudokood piirangute jõustamiseks (2) delta = x2 - x1 ; deltapikkus = sqrt(delta * delta); diff = (deltalength - restlength ) / (deltalength * (invmass1 + invmass2 )); x1 -= invmass1 * delta * diff ; x2 += invmass2 * delta * diff ;

Siin salvestavad invmass1 ja invmass2 osakeste \(\vec(x)_1\) ja \(\vec(x)_2\) pöördmassid. Kui tahame, et osake jääks paigale, peame selle seadma väärtusele invmass = 0, mis vastab lõpmatule massile. Nagu eespool, saab arvutuste kiirendamiseks kasutada ligikaudseid ruutjuure arvutusi.

Tahked ained

Jäikade kehade liikumisvõrrandid pakuti välja ammu enne kaasaegsete arvutite leiutamist. Tollel ajal kasulike tulemuste saamiseks pidid matemaatikud tegema valemite teisendusi. See tõi kaasa selliste kasulike mõistete ja tööriistade tekkimise nagu inertstensor, nurkimpulss, jõumoment, orientatsiooni tähistavad kvaternoonid jne. Samal ajal võimaldab nüüd arvutusi teha tohutute andmemahtude digitaalsel kujul töötlemise võimalus. lihtsamate elementide jaoks ja mõnel juhul isegi muuta sellised arvutused kasumlikumaks. Kolmemõõtmeliste tahkete ainete puhul tähendab see, et võib olla mugav modelleerida tahket nelja osakese ja kuue sidemega (andes õige arvu vabadusastmeid: \(4\cdot 3 - 6 = 6\)). See lihtsustab paljusid asju ja seda me järgmisena teeme.

Vaatleme tetraeedrit, mille igas neljas tipus on osake. Lisaks tähistab iga tetraeedri kuus serva eelmises jaotises käsitletud riba tüüpi piirangut. See on täiesti piisav tahke keha simuleerimiseks. Tetraeedri saab paigutada ülalpool käsitletud kuubi sisse ja Verleti integraator tagab selle õige liikumise. Funktsioon SatisfyConstraints() peab hoolitsema kahe asja eest: 1) et osakesed jääksid kuubi sisse ja 2) et järgitaks kuut tüvepiirangut. Seda saab teha nagu varemgi, kasutades lõõgastust: tavaliselt piisab 3-4 iteratsioonist. Ärge unustage ka tõhusaid ruutjuure arvutamist.

Siiski on selge, et kokkupõrgete ajal käituvad tahked kehad erinevalt "skeleti" tetraeedritest. On veel üks probleem: seni tuvastasime jäiga keha ja ümbritseva “maailma” kokkupõrke fakti vaid tippude info põhjal: kui tipp oli kuubist väljas, siis projitseeriti see jälle sisse. See toimib suurepäraselt seni, kuni "maailma" sisemus on kumer. Kui see nii ei ole, suudab tetraeeder läbida “maailma” piiri ka siis, kui ükski selle tipp ei ületanud seda piiri (vt joonis 3, kus kolmnurk on tetraeedri lame analoog). Vaatame, kuidas see probleem lahendatakse.

Kõigepealt vaatame probleemi lihtsamat versiooni. Võtame varda, asetame selle kuubikujulisse "maailma" ja eeldame, et kuubil on väike sissepoole suunatud eend. Nüüd võib varras ületada “maailma” piire, kuigi mõlemad selle otstes olevad osakesed jäävad kuubi sisse (joonis 4). Me ei lasku kokkupõrke tuvastamise mehhanismi väljatöötamise keerukustesse, kuna see on täiesti omaette teadus. Oletame selle asemel, et kokkupõrke tuvastamise alamsüsteem on juba olemas ja teeb oma tööd: määrab iga kahe põrkuva objekti läbitungimissügavuse ja läbitungimispunktide koordinaadid. Üks läbitungimispunktide ja läbitungimissügavuse määratlus on järgmine: läbitungimissügavus \(d_p\) on lühim vahemaa, mille jooksul kaks objekti tuleb üksteisest sobivas suunas eraldada, et vältida nende kokkupõrget. Läbistuspunktid on punktid igal objektil, kus objektid pärast ülalnimetatud ülekande toimumist teineteist puudutavad.

Vaadake veelkord joonist 4. Siin, pärast numbrilise integreerimise etappi, tungis varras läbi piiri. Kokkupõrkeandur tuvastas kaks läbitungimispunkti: \(\vec(p)\) ja \(\vec(q)\) . Joonisel 4a langeb punkt \(\vec(p)\) tegelikult kokku ühe otsosakesega: \(\vec(p)=\vec(x)_1\) . Joonisel 4b asub \(\vec(p)\) väärtuste \(\vec(x)_1\) ja \(\vec(x)_2\) vahel 1/4 varda pikkusest punktist \ (\vec( x)_1\) . Mõlemal juhul asub punkt \(\vec(p)\) vardal ja seetõttu saab selle koordinaate väljendada punktide \(\vec(x)_1\) ja \ koordinaatide lineaarse kombinatsioonina. (\vec(x) _2\) : \(\vec(p) = c_1\vec(x)_1 + c_2\vec(x)_2\) nii, et \(c_1 + c_2 = 1\) . Esimesel juhul \(c_1 = 1\) , \(c_2 = 0\) ja teisel juhul - \(c_1 = 0,75\) ja \(c_2 = 0,25\) . Need väärtused näitavad meile, kui kaugele vastavaid osakesi tuleb liigutada.

Varda asukoha parandamiseks liigutage seda nii, et punkt \(\vec(p)\) langeks kokku punktiga \(\vec(q)\) . Selleks liigutame osakesed \(\vec(x)_1\) ja \(\vec(x)_2\) \(\vec(p)\) ja \(\) ühendava vektoriga määratud suunas vec(q)\ ): .

Esimesel juhul (joonis 4a) projitseerime lihtsalt \(\vec(x)_1\) väljaspool piirkonda, kus see on "keelatud" olla, täpselt nagu varem (suunas \(\vec(q) )\) ). Sellest piisab ja koordinaate \(\vec(x)_2\) ei pea üldse muutma. Teisel juhul (joonis 4b) tuleb punkt \(\vec(x)_1\) samuti nihutada suuremale kaugusele kui \(\vec(x)_2\) , kuna punkt \(\vec (p)\) asub üksusele \(\vec(x)_1\) lähemal (tõepoolest, kuna \(\vec(p) = 0,75\vec(x)_1 + 0,25\vec(x)_2\), siis iga kord, kui liigutame \(\vec(x)_1\) 0,75 võrra, liigume \(\vec(x)_2\) ainult 0,25 võrra). Teisisõnu, osakeste \(\vec(x)_1^\prime\) ja \(\vec(x)_2^\prime\) uued asukohad on antud seostega

\begin(võrrand) \begin(joondatud) \vec(x)_1^\prime &= \vec(x)_1 + 0,75\lambda\cdot\vec(\Delta), \\ \vec(x)_2^\ prime &= \vec(x)_2 + 0,25\lambda\cdot\vec(\Delta), \end(joondatud) \label(eq:x_new) \end(võrrand)

kus \(\lambda\) on tundmatu suurus. Osakese \(\vec(p)\) - \(\vec(p)^\prime\) - uus asukoht arvutatakse valemiga

$$ \vec(p)^\prime = c_1\vec(x)_1^\prime + c_2\vec(x)_2^\prime . $$

Pidagem meeles, et tahame saavutada \(\vec(p)^\prime = \vec(q)\) , st peame valima \(\lambda\) täpselt sellise, et \(\vec(p ) ^\prime\) langes kokku \(\vec(q)\) . Kuna me liigutame osakesi ainult suunas \(\vec(\Delta)\) , siis \(\vec(p)\) liigub ka suunas \(\vec(\Delta)\) ja siit ka lahendus võrrandi \ (\vec(p)^\prime = \vec(q)\) saab leida, kui väljendada \(\lambda\)

\begin(võrrand) \vec(p)^\prime\cdot\vec(\Delta) = \vec(q)\cdot\vec(\Delta) . \label(eq:pq) \end(võrrand)

Kirjutades välja avaldise võrdsuse vasakul küljel, saame

$$ \begin(joondatud) \vec(p)^\prime\cdot\vec(\Delta) &= (0,75\vec(x)_1^\prime + 0,25\vec(x)_2^\prime) \cdot \vec(\Delta) \\ &= (0,75 (\vec(x)_1 + 0,75\lambda\cdot\vec(\Delta)) + 0,25 (\vec(x)_2 + 0,25\lambda\cdot\vec( \Delta))) \cdot\vec(\Delta) \\ &= ((0,75\vec(x)_1 + 0,25\vec(x)_2)\cdot\vec(\Delta) + \lambda(0,75^2 + 0,25^2)\cdot\Delta^2 \\ &= \vec(p) \cdot\vec(\Delta) + \lambda(0,75^2 + 0,25^2)\cdot\Delta^2, \end( joondatud) $$

mis, võttes arvesse paremat poolt \eqref(eq:pq), annab

$$ \lambda = \frac((\vec(p)-\vec(q)) \cdot\vec(\Delta))((0,75^2 + 0,25^2)\cdot\Delta^2) . $$

Asendades leitud \(\lambda\) väärtusega \eqref(eq:x_new), saame osakeste \(\vec(x)_1\) ja \(\vec(x)_2\) parandatud asukohad, kus \( \vec( p)^\prime\) vastab \(\vec(q)\) .

Joonis 5 näitab asendit, mis tekib pärast osakeste liikumist. Enam ei toimu vastastikust esemete läbitungimist, kuid rikutud on varda pikkuse muutumatuks jäämise nõuet. Selle parandamiseks teeme veel ühe lõdvestustsükli iteratsiooni (või isegi mitu), mille järel lõpetame osakeste positsioonide korrigeerimise tsükli.

Tetraeedri puhul töötab ülalkirjeldatud strateegia sarnaselt. Esiteks leitakse läbimispunktid \(\vec(p)\) ja \(\vec(q)\) (need võivad asuda ka kolmnurga sees) ja \(\vec(p)\) esitatakse kui nelja osakese lineaarne kombinatsioon \(\vec(p)=c_1\vec(x)_1+c_2\vec(x)_2+c_3\vec(x)_3+c_4\vec(x)_4\) nii, et \(c_1+c_2+c_3+c_4=1\) (see nõuab väikese lineaarvõrrandisüsteemi lahendamist). Kord leitud \(\vec(\Delta) = \vec(q)-\vec(p)\), on valemi abil võimalik leida väärtus \(\lambda\).

$$ \lambda = \frac((\vec(p)-\vec(q)) \cdot\vec(\Delta))((c_1^2 + c_2^2 + c_3^2 + c_4^2)\cdot \Delta^2) , $$

ja korrigeeritud osakeste positsioonid on määratletud kui

$$ \begin(align*) \vec(x)_1^\prime &= \vec(x)_1 + c_1\lambda\cdot\vec(\Delta), \\ \vec(x)_2^\prime & = \vec(x)_2 + c_2\lambda\cdot\vec(\Delta), \\ \vec(x)_3^\prime &= \vec(x)_3 + c_3\lambda\cdot\vec(\Delta ), \\ \vec(x)_4^\prime &= \vec(x)_4 + c_4\lambda\cdot\vec(\Delta). \end(joonda*) $$

Niisiis, oleme kaalunud ühe jäiga keha kokkupõrget liikumatu "maailmaga". Ülalkirjeldatud meetodit saab hõlpsasti üldistada mitme jäiga keha kokkupõrgete käsitlemiseks. Sel juhul töödeldakse kokkupõrkeid ühe kehapaari puhul korraga ja selle asemel, et liigutada ainult \(\vec(p)\) , peate liigutama \(\vec(p)\) ja \(\vec (q)\ ) üksteise suhtes.

Ja jällegi, pärast osakeste positsioonide reguleerimist, et vältida kehade vastastikust läbitungimist, on vaja hoolitseda veel kuue piirangu täitmise eest - tahke keha moodustavate osakeste vahekauguste muutumatuse eest. Seda meetodit kasutades saab tetraeedri pesastada isegi teise objekti sisse, mida on kokkupõrgete käsitlemisel mugavam kasutada tetraeedri enda asemel. Joonisel 6 on kujutatud kuubi sisse asetatud tetraeedrit.

Esiteks tuleb kuubik kuidagi tetraeedri külge kinnitada. Üks võimalus on valida kuubi keskpunktiks tetraeedri massikese \(0,25\cdot (\vec(x)_1 + \vec(x)_2 + \vec(x)_3 + \vec(x)_4)\), ja seejärel tetraeedri praeguste koordinaatide abil arvutada kuubi tippude koordinaadid. Kui avastatakse kokkupõrge, töödeldakse kontaktpunkti \(\vec(p)\) (mis asub nüüd kuubil) samamoodi nagu ülal. Uuendatud osakeste koordinaadid arvutatakse samal viisil. Arvutuste kiirendamiseks saate eelnevalt välja arvutada koefitsiendid \(c_1\) -\(c_4\) kuubi kõigi tippude jaoks. Kui \(\vec(p)\) on tipp, saab väärtused \(c_1\) -\(c_4\) leida ja kasutada otse. Vastasel juhul asub \(\vec(p)\) kolmnurga sees või selle ühel küljel ja \(c_1\)-\(c_4\) väärtused saab saada kolmnurga eelarvutatud väärtustest. kolmnurga tipud interpolatsiooni abil.

Kokkupõrgete käsitlemiseks piisab reeglina 3-4 iteratsioonist. Kui lõdvestumine lõpetatakse liiga vara, ei käitu kehad täiesti tahkena. Aga see on isegi hea, sest absoluutselt tahkeid kehasid looduses ei eksisteeri. Lisaks muudab see süsteemi stabiilsemaks.

Tetraeedrit moodustavate osakeste asukohtade ümberkorraldamisel tuleb vastavalt muuta keha füüsikalisi omadusi (matemaatiliselt tähendab see, et keha inertsi tensor muutub, olenevalt osakeste asenditest ja massidest).

Kasutades sama põhimõtet nagu tetraeeder, saate määrata teise sarnase osakeste ja sidemete konfiguratsiooni, asetades osakesed punktidesse koordinaatidega \((0,0,0)\), \((1,0,0)\), \( (0,1,0)\) ja \((0,0,1)\) . Olgu \(\vec(a)\) , \(\vec(b)\) ja \(\vec(c)\) vektorid, mis on suunatud osakeselt 1 vastavalt osakestesse 2, 3 ja 4. Me piirame osakeste asukohti nõudega, et vektoritel \(\vec(a)\) , \(\vec(b)\) ja \(\vec(c)\) oleks ühikuline pikkus ja nurk iga kolme vektoripaari vahel oli võrdne \(90^\circ\) (vastav skalaarkorrutis peab olema võrdne nulliga). Pange tähele, et see annab jällegi, nagu tetraeedri puhul, 4 osakest ja 6 sidet.

Liigendatud kehad

Nüüd saame hingede abil ühendada mitu jäika korpust (silindrilised, sfäärilised jne). Eeldades, et kahel kehal on üks ühine osake, saame sfäärilise hinge (tihvtliigendi) ja kui kaks osakest on ühised, siis silindrilise hinge (hinge) (joon. 7). Samamoodi saate ühendada kaks keha varda või mis tahes muud tüüpi ühenduse abil - peate lihtsalt meeles pidama koodi lisamist, et käsitleda uut tüüpi ühendusi lõõgastusahelas.

See lähenemine võimaldab meil luua liigendatud inimkeha tervikliku mudeli. Realism suureneb, kui rakendate lisaks hingede nurkliikumiste piiranguid. Selliste piirangute rakendamiseks on mitu võimalust. Lihtsaim meetod hõlmab varda tüüpi piirangu kasutamist, mis käivitub ainult siis, kui kahe osakese vaheline kaugus langeb alla teatud läviväärtuse (sel juhul on tegemist vormi ühesuunalise sidumisega \(|\vec(x)_2 - \vec(x)_1| > 100\)). Selle tulemusena ei saa mõlemad osakesed kunagi üksteisele liiga lähedale sattuda (joonis 8).

Teine meetod nurkliikumiste piirangute loomiseks nõuab punktkorrutise täitmiseks järgmist tingimust:

$$ (\vec(x)_2 - \vec(x)_0)\cdot (\vec(x)_1 - \vec(x)_0)< \alpha . $$

Samuti saate piirata osakeste liikumist kindlale tasapinnale. Jällegi tuleb korrigeerida osakeste positsioone, mis ei vasta antud piirangutele. Seda tehakse sarnaselt varda puhul, kuigi vastavad valemid on veidi keerulisemad.