Tämä on videopelifysiikan kolmiosaisen sarjan osa I. Katso tämän sarjan loput:
Osa II: Törmäystunnistus kiinteille esineille
Osa III: Rajoitettu jäykkä kehon simulointi
Fysiikan simulointi on tietojenkäsittelytieteen ala, jonka tarkoituksena on tuottaa fyysisiä ilmiöitä tietokoneella. Yleensä nämä simulaatiot käyttävät numeerisia menetelmiä olemassa oleviin teorioihin saadakseen tuloksia, jotka ovat mahdollisimman lähellä todellisessa maailmassa havaitsemiamme tuloksia. Tämä antaa meille mahdollisuuden edistyneitä pelikehittäjiä , ennustaa ja analysoida huolellisesti, miten joku käyttäytyisi, ennen kuin se todella rakennetaan, mikä on melkein aina yksinkertaisempaa ja halvempaa tehdä.
Fysiikan simulaatioiden sovellusalue on valtava. Varhaisimpia tietokoneita käytettiin jo fysiikkasimulaatioiden suorittamiseen - esimerkiksi armeijan ammusten ballistisen liikkeen ennustamiseen. Se on myös olennainen työkalu maa- ja autoteollisuudessa, mikä valaisee kuinka tietyt rakenteet käyttäytyisivät esimerkiksi maanjäristyksen tai auto-onnettomuuden yhteydessä. Ja se ei lopu tähän. Voimme simuloida asioita, kuten astrofysiikkaa, suhteellisuusteoriaa ja paljon muuta mieletöntä, mitä voimme havaita luonnon ihmeiden joukossa.
Fysiikan simulointi videopeleissä on hyvin yleistä, koska useimmat pelit ovat innoittamana asioista, joita meillä on todellisessa maailmassa . Monet pelit luottavat pelkästään fysiikan simulointiin hauskaksi. Tämä tarkoittaa, että nämä pelit vaativat vakaan simulaation, joka ei hajoa tai hidasta, ja tämä ei yleensä ole triviaali saavuttaa.
Kaikissa peleissä kiinnostavat vain tietyt fyysiset vaikutukset. Jäykkä kehodynamiikka - kiinteiden, joustamattomien esineiden liike ja vuorovaikutus - on ylivoimaisesti suosituin tyyli, jota simuloidaan peleissä. Tämä johtuu siitä, että suurin osa esineistä, joiden kanssa olemme tekemisissä tosielämässä, ovat melko jäykkiä, ja jäykkien kappaleiden simulointi on suhteellisen yksinkertaista (vaikka kuten näemme, se ei tarkoita, että se olisi kakkukävely). Muutama muu peli vaatii kuitenkin monimutkaisempien kokonaisuuksien simulointia, kuten muotoaan muuttavia kappaleita, nesteitä, magneettisia esineitä jne.
Tässä videopelifysiikan opetusohjelmassa tutkitaan jäykkää kehon simulointia alkaen tämän artikkelin yksinkertaisesta jäykästä rungon liikkeestä ja kattamalla sitten kappaleiden välinen vuorovaikutus törmäysten ja rajoitusten kautta seuraavissa erissä. Yleisimmät yhtälöt, joita käytetään nykyaikaisissa pelifysiikkamoottoreissa, kuten Box2D , Luodin fysiikka ja Maaoravat fysiikka esitellään ja selitetään.
Videopelifysiikassa haluamme animoida näytöllä olevat kohteet ja antaa heille realistisen fyysisen käyttäytymisen. Tämä saavutetaan fysiikkaan perustuvalla animaatiolla, joka on fysiikan teoreettisiin laeihin sovellettavien numeeristen laskelmien tuottama animaatio.
Animaatiot tuotetaan näyttämällä kuvasarja peräkkäin, jolloin objektit liikkuvat hiukan kuvasta toiseen. Kun kuvat näytetään nopeasti peräkkäin, vaikutus on ilmeinen esineiden sujuva ja jatkuva liike. Siksi fysiikan simulaation kohteiden animoimiseksi meidän on päivitettävä esineiden fyysinen tila (esim. Sijainti ja suunta) fysiikan lakien mukaisesti useita kertoja sekunnissa ja piirrettävä ruutu jokaisen päivityksen jälkeen.
fysiikan moottori on ohjelmistokomponentti, joka suorittaa fysiikan simulaation. Se vastaanottaa spesifikaation simuloitavista kappaleista sekä joitain konfigurointiparametreja, ja sitten simulaatio voi olla astui . Jokainen vaihe siirtää simulaatiota eteenpäin muutamalla sekunnin murto-osalla, ja tulokset voidaan näyttää ruudulla sen jälkeen. Huomaa, että fysiikkamoottorit suorittavat vain numeerisen simulaation. Tulosten tekeminen voi riippua pelin vaatimuksista. Ei aina ole, että jokaisen vaiheen tulokset haluavat vetää näyttöön.
Jäykkien kappaleiden liike voidaan mallintaa käyttämällä Newtonin mekaniikka , joka perustuu Isaac Newtonin kuuluisaan Kolme liikelakia :
Inertia : Jos esineeseen ei kohdistu voimaa, sen nopeus (nopeus ja liikesuunta) ei saa muuttua.
Voima, massa ja kiihtyvyys : Kohteeseen vaikuttava voima on yhtä suuri kuin kohteen massa kerrottuna sen kiihtyvyydellä (nopeuden muutosnopeudella). Tämän antaa kaava F = ma .
Toiminta ja reaktio : 'Jokaiselle toiminnalle on sama ja vastakkainen reaktio.' Toisin sanoen aina, kun yksi runko kohdistaa voiman toiseen, toinen runko kohdistaa ensimmäiseen voimaan saman suuruuden ja vastakkaisen suunnan.
Näiden kolmen lain perusteella voimme tehdä fysiikkamoottorin, joka pystyy toistamaan meille tutun dynaamisen käyttäytymisen ja luomaan siten pelaajalle mukaansatempaavan kokemuksen.
Seuraava kaavio näyttää korkean tason yleiskatsauksen fysiikkamoottorin yleisestä menettelystä:
Fysiikan simulaatioiden toiminnan ymmärtämiseksi on välttämätöntä saada perustiedot vektoreista ja niiden toiminnasta. Jos olet jo perehtynyt vektorimatematiikkaan, lue lisää. Mutta jos et ole tai haluat hioa, ota minuutti aikaa tarkistaa liite tämän artikkelin lopussa.
Hyvä askel kiven jäykän simuloinnin ymmärtämiseen on aloittaa hiukkasilla. Hiukkasten simulointi on yksinkertaisempaa kuin jäykkien kappaleiden simulointi, ja voimme simuloida jälkimmäisiä käyttäen samoja periaatteita, mutta lisäämällä hiukkasiin tilavuutta ja muotoa.
Hiukkanen on vain avaruuspiste, jolla on sijaintivektori, nopeusvektori ja massa. Newtonin ensimmäisen lain mukaan sen nopeus muuttuu vasta, kun siihen kohdistetaan voima. Kun sen nopeusvektorin pituus ei ole nolla, sen sijainti muuttuu ajan myötä.
Hiukkassysteemin simuloimiseksi meidän on ensin luotava joukko partikkeleita, joilla on alkutila. Jokaisella hiukkasella on oltava kiinteä massa, alkuasento avaruudessa ja alkunopeus. Sitten meidän on aloitettava simulaation pääpiiri, jossa jokaiselle hiukkaselle on laskettava siihen vaikuttava voima, päivitettävä sen nopeus voiman tuottamasta kiihtyvyydestä ja päivitettävä sen jälkeen sijainti nopeuden perusteella me vain laskimme.
Voima voi tulla eri lähteistä simulaation tyypistä riippuen. Se voi olla muun muassa painovoima, tuuli tai magnetismi - tai se voi olla näiden yhdistelmä. Se voi olla globaali voima, kuten jatkuva painovoima, tai se voi olla voima hiukkasten välillä, kuten vetovoima tai hylkääminen.
Simulaation ajamiseksi realistisessa tahdissa 'simuloidun' aikavaiheen tulisi olla sama kuin viimeisen simulointivaiheen jälkeen kulunut todellinen aika. Tätä aikavaihetta voidaan kuitenkin suurentaa, jotta simulaatio käy nopeammin, tai pienentää, jotta se toimisi hidastettuna.
Oletetaan, että meillä on yksi massainen hiukkanen m , sijainti s ( t i)ja nopeus v ( t i)hetkessä t i. Voima f ( t i)levitetään kyseiseen hiukkaseen tuolloin. Tämän hiukkasen sijainti ja nopeus tulevaisuudessa t i + 1, s ( t i + 1)ja v ( t i + 1)vastaavasti voidaan laskea:
Teknisesti termi on, että integroimme numeerisesti hiukkasen tavanomaisen differentiaaliliikkeen yhtälön käyttämällä osittain implisiittistä Euler-menetelmää, jota useimmat pelifysiikkamoottorit käyttävät yksinkertaisen ja hyväksyttävän tarkkuuden vuoksi pienille ajanjakso, DT . Differential Equation Basics luennot muistiinpanoja hämmästyttävästä Fyysisesti perustuva mallinnus: periaatteet ja käytäntö kurssi, kirjoittanut Dr. Andy Witkin ja David Baraff, on mukava artikkeli saadaksesi syvällisemmän kuvan tämän menetelmän numeerisesta metodologiasta.
Seuraava on esimerkki hiukkassimulaatiosta C-kielellä.
#define NUM_PARTICLES 1 // Two dimensional vector. typedef struct { float x; float y; } Vector2; // Two dimensional particle. typedef struct { Vector2 position; Vector2 velocity; float mass; } Particle; // Global array of particles. Particle particles[NUM_PARTICLES]; // Prints all particles' position to the output. We could instead draw them on screen // in a more interesting application. void PrintParticles() { for (int i = 0; i position.x, particle->position.y); } } // Initializes all particles with random positions, zero velocities and 1kg mass. void InitializeParticles() { for (int i = 0; i mass * -9.81}; } void RunSimulation() { float totalSimulationTime = 10; // The simulation will run for 10 seconds. float currentTime = 0; // This accumulates the time that has passed. float dt = 1; // Each step will take one second. InitializeParticles(); PrintParticles(); while (currentTime mass}; particle->velocity.x += acceleration.x * dt; particle->velocity.y += acceleration.y * dt; particle->position.x += particle->velocity.x * dt; particle->position.y += particle->velocity.y * dt; } PrintParticles(); currentTime += dt; } }
Jos soitat RunSimulation
toiminto (yhdelle hiukkaselle) se tulostaa jotain:
particle[0] (-8.00, 57.00) particle[0] (-8.00, 47.19) particle[0] (-8.00, 27.57) particle[0] (-8.00, -1.86) particle[0] (-8.00, -41.10) particle[0] (-8.00, -90.15) particle[0] (-8.00, -149.01) particle[0] (-8.00, -217.68) particle[0] (-8.00, -296.16) particle[0] (-8.00, -384.45) particle[0] (-8.00, -482.55)
Kuten näette, hiukkanen alkoi kohdasta (-8, 57)
ja sitten sen y
koordinaatti alkoi laskea yhä nopeammin, koska se kiihtyi alaspäin painovoiman vaikutuksesta.
Seuraava animaatio antaa visuaalisen esityksen yhden simuloidun hiukkasen kolmen vaiheen sarjasta:
Aluksi klo t = 0, hiukkanen on s 0. Vaiheen jälkeen se liikkuu nopeusvektorinsa suuntaan v 0osoitti. Seuraavassa vaiheessa voima f yksikohdistetaan siihen, ja nopeusvektori alkaa muuttua ikään kuin sitä vedettäisiin voimavektorin suuntaan. Seuraavissa kahdessa vaiheessa voimavektori muuttaa suuntaa, mutta jatkaa hiukkasen vetämistä ylöspäin.
TO jäykkä runko on kiinteä aine, joka ei voi deformoitua. Tällaisia kiintoaineita ei ole todellisessa maailmassa - jopa kovimmatkin materiaalit deformoivat ainakin hyvin pienen määrän, kun niihin kohdistuu jonkin verran voimaa - mutta jäykkä runko on hyödyllinen fysiikan malli pelinkehittäjille, joka yksinkertaistaa materiaalien dynamiikan tutkimista. kiinteät aineet, joissa voimme unohtaa muodonmuutokset.
Jäykkä runko on kuin hiukkasen jatke, koska sillä on myös massa, sijainti ja nopeus. Lisäksi sillä on tilavuus ja muoto, joten se voi pyöriä. Se lisää monimutkaisuutta kuin miltä se kuulostaa, etenkin kolmessa ulottuvuudessa.
Jäykkä runko pyörii luonnollisesti sen ympärillä massan keskipiste ja jäykän rungon sijaintia pidetään sen massakeskipisteen sijaintina. Määritämme jäykän rungon alkutilan, jonka massakeskus on alkupuolella ja kiertokulma nolla. Sen sijainti ja kierto milloin tahansa t tulee olemaan alkutilan siirtymä.
Massakeskus on ruumiin massajakauman keskipiste. Jos luulet jäykän rungon, jolla on massa M on tehty N pieniä hiukkasia, joista jokaisella on massa m ija sijainti r ikehon sisällä massakeskus voidaan laskea seuraavasti:
Tämä kaava osoittaa, että massakeskus on niiden massalla painotettujen hiukkasten sijaintien keskiarvo. Jos rungon tiheys on tasainen kaikkialla, painopiste on sama kuin kehon muodon geometrinen keskipiste, joka tunnetaan myös nimellä sentroidi . Pelifysiikkamoottorit tukevat yleensä vain tasaista tiheyttä, joten geometrista keskusta voidaan käyttää massakeskuksena.
Jäykät kappaleet eivät kuitenkaan koostu lopullisesta määrästä erillisiä hiukkasia jatkuva . Siksi meidän pitäisi laskea se käyttämällä olennainen osa lopullisen summan sijaan, kuten tämä:
missä r on kunkin pisteen sijaintivektori ja(rho) on funktio, joka antaa tiheyden kehon jokaisessa kohdassa. Pohjimmiltaan tämä integraali tekee saman asian kuin rajallinen summa, mutta se tekee sen jatkuvana volyymina V .
Koska jäykkä runko voi pyöriä, meidän on esiteltävä se kulmikas ominaisuudet, jotka ovat analogisia hiukkasen lineaaristen ominaisuuksien kanssa. Kahdessa ulottuvuudessa jäykkä runko voi kiertää vain näytöstä ulos osoittavan akselin ympäri, joten tarvitsemme vain yhden skalaarin edustamaan sen suuntaa. Käytämme yleensä radiaaneja (jotka vaihtelevat 0: sta 2: eenPitäysi ympyrä) yksikkönä tässä kulmien sijaan (jotka menevät 0: sta 360: een täydelle ympyrälle), koska tämä yksinkertaistaa laskutoimituksia.
Jäykkä runko tarvitsee pyörimiseksi kulmanopeus , joka on skalaari yksikön kanssa radiaania sekunnissa ja jota yleisesti edustaa kreikkalainen kirjain ω (omega). Kulmanopeuden saavuttamiseksi kehon on kuitenkin vastaanotettava jonkin verran pyörimisvoimaa, jota kutsumme vääntömomentti , jota edustaa kreikkalainen kirje τ (tau). Niinpä Newtonin toinen kiertoon sovellettava laki on:
missä a (alfa) on kulmakiihtyvyys ja Minä on hitausmomentti .
Pyörimistä varten hitausmomentti on analoginen lineaarisen liikkeen massan kanssa. Se määrittelee kuinka vaikeaa on muuttaa jäykän rungon kulmanopeutta. Kahdessa ulottuvuudessa se on skalaari ja määritellään seuraavasti:
missä V tarkoittaa, että tämä integraali tulisi suorittaa kaikille pisteille koko ruumiin tilavuudessa, r on kunkin pisteen sijaintivektori suhteessa pyörintäakseliin, r 2on oikeastaan pisteen tulo r itsensä kanssa, jaon funktio, joka antaa tiheyden kehon jokaisessa kohdassa.
Esimerkiksi 2-ulotteisen massan laatikon hitausmomentti m , leveys sisään ja korkeus h sen centroidista on:
Tässä löydät luettelon kaavoista, joilla lasketaan hitausmomentti joukolle eri akseleita olevia muotoja.
Kun voima kohdistetaan jäykän rungon pisteeseen, se voi tuottaa vääntömomentin. Kahdessa mitassa vääntömomentti on skalaari ja vääntömomentti τ syntyy voimalla f käytetään kehon pisteessä, jolla on offset-vektori r massan keskustasta on:
missä θ (theta) on pienin kulma välillä f ja r .
Edellinen kaava on täsmälleen kaava välisen ristitulon pituudelle r ja f . Näin voimme tehdä tämän kolmessa ulottuvuudessa:
Kaksiulotteinen simulaatio voidaan nähdä kolmiulotteisena simulaationa, jossa kaikki jäykät kappaleet ovat ohuita ja tasaisia, ja kaikki tapahtuu xy -taso, eli siinä ei ole liikettä kanssa -akseli. Se tarkoittaa, että f ja r ovat aina xy kone ja niin τ on aina nolla x ja Y komponentit, koska ristituote on aina kohtisuorassa xy -taso. Tämä puolestaan tarkoittaa, että se on aina yhdensuuntainen kanssa -akseli. Siten vain kanssa ristikkäistuotteen komponentilla on merkitystä. Tämä johtaa siihen, että vääntömomentin laskeminen kahdessa ulottuvuudessa voidaan yksinkertaistaa seuraavasti:
On uskomatonta, kuinka vain yhden ulottuvuuden lisääminen simulaatioon tekee asioista huomattavasti monimutkaisempia. Kolmessa ulottuvuudessa jäykän rungon suunta on esitettävä a: lla kvaternioni , joka on eräänlainen nelielementtinen vektori. Hitausmomenttia edustaa 3x3-matriisi, jota kutsutaan hitausjännite , joka ei ole vakio, koska se riippuu jäykästä rungon suunnasta ja vaihtelee siten ajan myötä rungon pyöriessä. Oppiaksesi kaikki yksityiskohdat 3D-jäykästä rungon simuloinnista, voit tutustua erinomaiseen Jäykkä kehon simulointi I - Rajoittamaton jäykkä kehon dynamiikka , joka on myös osa Witkinin ja Baraffin teoksia Fyysisesti perustuva mallinnus: periaatteet ja käytäntö kurssi.
Simulointialgoritmi on hyvin samanlainen kuin partikkelisimulaation. Meidän on lisättävä vain jäykkien kappaleiden muoto ja pyörimisominaisuudet:
#define NUM_RIGID_BODIES 1 // 2D box shape. Physics engines usually have a couple different classes of shapes // such as circles, spheres (3D), cylinders, capsules, polygons, polyhedrons (3D)... typedef struct { float width; float height; float mass; float momentOfInertia; } BoxShape; // Calculates the inertia of a box shape and stores it in the momentOfInertia variable. void CalculateBoxInertia(BoxShape *boxShape) { float m = boxShape->mass; float w = boxShape->width; float h = boxShape->height; boxShape->momentOfInertia = m * (w * w + h * h) / 12; } // Two dimensional rigid body typedef struct { Vector2 position; Vector2 linearVelocity; float angle; float angularVelocity; Vector2 force; float torque; BoxShape shape; } RigidBody; // Global array of rigid bodies. RigidBody rigidBodies[NUM_RIGID_BODIES]; // Prints the position and angle of each body on the output. // We could instead draw them on screen. void PrintRigidBodies() { for (int i = 0; i position.x, rigidBody->position.y, rigidBody->angle); } } // Initializes rigid bodies with random positions and angles and zero linear and angular velocities. // They're all initialized with a box shape of random dimensions. void InitializeRigidBodies() { for (int i = 0; i position = (Vector2){arc4random_uniform(50), arc4random_uniform(50)}; rigidBody->angle = arc4random_uniform(360)/360.f * M_PI * 2; rigidBody->linearVelocity = (Vector2){0, 0}; rigidBody->angularVelocity = 0; BoxShape shape; shape.mass = 10; shape.width = 1 + arc4random_uniform(2); shape.height = 1 + arc4random_uniform(2); CalculateBoxInertia(&shape); rigidBody->shape = shape; } } // Applies a force at a point in the body, inducing some torque. void ComputeForceAndTorque(RigidBody *rigidBody) { Vector2 f = (Vector2){0, 100}; rigidBody->force = f; // r is the 'arm vector' that goes from the center of mass to the point of force application Vector2 r = (Vector2){rigidBody->shape.width / 2, rigidBody->shape.height / 2}; rigidBody->torque = r.x * f.y - r.y * f.x; } void RunRigidBodySimulation() { float totalSimulationTime = 10; // The simulation will run for 10 seconds. float currentTime = 0; // This accumulates the time that has passed. float dt = 1; // Each step will take one second. InitializeRigidBodies(); PrintRigidBodies(); while (currentTime shape.mass, rigidBody->force.y / rigidBody->shape.mass}; rigidBody->linearVelocity.x += linearAcceleration.x * dt; rigidBody->linearVelocity.y += linearAcceleration.y * dt; rigidBody->position.x += rigidBody->linearVelocity.x * dt; rigidBody->position.y += rigidBody->linearVelocity.y * dt; float angularAcceleration = rigidBody->torque / rigidBody->shape.momentOfInertia; rigidBody->angularVelocity += angularAcceleration * dt; rigidBody->angle += rigidBody->angularVelocity * dt; } PrintRigidBodies(); currentTime += dt; } }
Soittaminen RunRigidBodySimulation
yksi jäykkä runko antaa sijaintinsa ja kulmansa seuraavasti:
body[0] p = (36.00, 12.00), a = 0.28 body[0] p = (36.00, 22.00), a = 15.28 body[0] p = (36.00, 42.00), a = 45.28 body[0] p = (36.00, 72.00), a = 90.28 body[0] p = (36.00, 112.00), a = 150.28 body[0] p = (36.00, 162.00), a = 225.28 body[0] p = (36.00, 222.00), a = 315.28 body[0] p = (36.00, 292.00), a = 420.28 body[0] p = (36.00, 372.00), a = 540.28 body[0] p = (36.00, 462.00), a = 675.28 body[0] p = (36.00, 562.00), a = 825.28
Koska 100 Newtonin ylöspäin suuntautuvaa voimaa käytetään, vainYkoordinaattimuutokset. Voimaa ei kohdisteta suoraan massakeskipisteeseen, ja siten se aiheuttaa vääntömomentin, joka saa aikaan kiertokulman kasvavan (vastapäivään).
Graafinen tulos on samanlainen kuin hiukkasanimaatio, mutta nyt meillä on muotoja, jotka liikkuvat ja pyörivät.
Tämä on rajoittamaton simulaatio, koska kehot voivat liikkua vapaasti eivätkä ole vuorovaikutuksessa toistensa kanssa - eivät törmää. Simulaatiot ilman törmäyksiä ovat melko tylsiä eikä kovin hyödyllisiä. Tämän sarjan seuraavassa erässä puhumme törmäystunnistuksesta ja törmäyksen ratkaisemisesta sen havaittuaan.
TO vektori on yhteisö, jolla on pituus (tai muodollisemmin a suuruus ) ja a suunta . Se voidaan intuitiivisesti edustaa Karteesinen koordinaatisto , jossa hajotamme sen kahteen osaan, x ja Y , 2-ulotteisessa tilassa tai kolmessa komponentissa, x , Y ja kanssa , kolmiulotteisessa tilassa.
Esitämme vektorin, jossa on lihavoitu pieni kirjain, ja sen komponentit säännöllisellä identtisellä merkillä komponentin alaindeksin kanssa. Esimerkiksi:
edustaa 2-ulotteista vektoria. Jokainen komponentti on etäisyys origosta vastaavassa koordinaattiakselissa.
Fysiikkamoottoreilla on yleensä oma kevyt, erittäin optimoitu matematiikkakirjasto. Luodin fysiikka Esimerkiksi moottorilla on irronnut matematiikkakirjasto nimeltä Lineaarinen matematiikka jota voidaan käyttää yksinään ilman Bulletin fysiikan simulointiominaisuuksia. Siinä on luokkia, jotka edustavat vektoreita ja matriiseja, ja se hyödyntää SIMD ohjeet, jos saatavilla.
Joitakin vektoreilla toimivia algebrallisia operaatioita tarkastellaan alla.
Operaattorin pituus tai suuruus on merkitty|| ||. Vektorin pituus voidaan laskea sen komponenteista käyttämällä tunnettua Pythagoraan lause suorakulmioille. Esimerkiksi kahdessa annoksessa:
Kun vektori hylätään, pituus pysyy samana, mutta suunta muuttuu täsmälleen päinvastaiseksi. Esimerkiksi, kun otetaan huomioon:
kielto on:
Vektorit voidaan lisätä toisiinsa tai vähentää niistä. Kahden vektorin vähentäminen on sama kuin yhden lisääminen toisen negaatioon. Näissä operaatioissa yksinkertaisesti lisätään tai vähennetään kukin komponentti:
Tuloksena oleva vektori voidaan visualisoida osoittavan samaan pisteeseen kuin kaksi alkuperäistä vektoria, jos ne olisivat kytkettyinä päästä päähän:
Kun vektori kerrotaan skalaarilla (tässä opetusohjelmassa skalaari on yksinkertaisesti mikä tahansa reaaliluku), vektorin pituus muuttuu tällä määrällä. Jos skalaari on negatiivinen, se saa myös vektorin osoittamaan vastakkaiseen suuntaan.
dot-tuote operaattori ottaa kaksi vektoria ja antaa skalaariluvun. Se määritellään seuraavasti:
missäsaarion kahden vektorin välinen kulma. Laskennallisesti on paljon yksinkertaisempaa laskea se vektorien komponenttien avulla, ts .:
Pistetuotteen arvo vastaa pituuden arvoa projektio vektorin että vektoriin b kerrottuna pituudella b . Tämä toiminto voidaan myös kääntää ottaen huomioon projektion pituus b päälle että ja kertomalla pituus että , tuottaa saman tuloksen. Tämä tarkoittaa, että pistetuote on kommutatiivinen - pisteen tulo että kanssa b on sama kuin pisteen tulo b kanssa että . Yksi pistetuotteen hyödyllinen ominaisuus on, että sen arvo on nolla, jos vektorit ovat kohtisuorat (niiden välinen kulma on 90 astetta), koskacos 90 = 0.
Kolmessa ulottuvuudessa voimme myös kertoa kaksi vektoria toisen vektorin tuottamiseksi käyttämällä ristituote operaattori. Se määritellään seuraavasti:
ja ristituotteen pituus on:
missäsaarion pienin kulma välillä että ja b . Tuloksena on vektori c joka on kohtisuora (kohtisuora) molempiin että ja b . Jos että ja b ovat yhdensuuntaisia, toisin sanoen niiden välinen kulma on nolla tai 180 astetta, c tulee olemaan nollavektori, koskasynti 0 = synti 180 = 0.
Toisin kuin pistetuote, ristituote ei ole kommutatiivinen. Ristituotteen alkioiden järjestys on tärkeä, koska:
Tuloksen suunta voidaan määrittää oikean käden sääntö . Avaa oikea kätesi ja osoita etusormi samaan suuntaan että ja suuntaa kätesi siten, että nyrkkiä tehdessäsi sormesi liikkuvat suoraan kohti b näiden vektorien välisen pienimmän kulman kautta. Nyt peukalosi osoittaa suuntaan että × b .