Coulomb Force

From MineLabs
Jump to navigation Jump to search

De Coulomb kracht is de kracht achter de beweging van elektrisch geladen deeltjes. In kort: een + trekt een - aan, en dezelfde ladingen stoten elkaar af. Dit is niet hetzelfde als magnetische krachten, een magnetisch veld beschrijven is iets complexer en vereist de beweging van ladingen (of spin).

De huidige branch met de laatste ontwikkelingen (10 juli 2022) is de [Workshop-branch].

Theoretische achtergrond

De Coulomb kracht kan opgesplitst worden in een kracht en een veld

Coulomb kracht

Een deeltje kan een lading Q hebben, met als eenheid Coulomb. Dit wordt vaker uitgedrukt in de elementaire lading e=1,602×1019Coulomb. Sinds de verandering van het SI-stelsel in 2019 is deze eenheid vastgelegd op deze waarde.

De formule om de Coulomb kracht te berekenen is

F=kQ1Q2|r|2r^

met k=14πϵ, een krachtsconstante met ϵ de primitiviteit van het elektrisch veld in het medium, Q1 en Q2 de ladingen, \vec r de afstand tussen de ladingen en \hat r de eenheidsvector tussen de ladingen.

De kracht wijst zowel van het eerste deeltje naar het tweede deeltje als andersom. De kracht komt steeds voor in paren (ook de derde wet van Newton). In totaal, de som van de twee krachten tussen de deeltjes, is de kracht nul. Dit wilt zeggen dat een geheel aan geladen deeltjes steeds hetzelfde massamiddelpunt zal behouden.

Elektrisch veld

Indien er meerdere deeltjes zijn, zullen alle deeltjes elkaar aantrekken of afstoten met de Coulombkracht. De kracht dat een deeltje van lading Q=1C zou ervaren op een bepaalde positie, is het elektrisch veld E met als eenheid Voltmeter. De formule voor het elektrisch veld is

E=kQ|r2|r^

Als er twee deeltjes zijn, is het elektrisch veld op een bepaalde positie gegeven door de som van de elektrische velden. Door het elektrisch veld te berekenen, kan eenvoudig de kracht bepaald worden dat een deeltje met lading Q zou ervaren indien het op de positie staat waar het elektrisch veld gekend is:

F=QE=Q(kQ|r|2r^)=kQQ|r|2

Voorbeeld je hebt twee deeltjes op een lijn met ladingen Q1=1C en Q2=2C op posities x1=1m en x2=5m. Wat is het elektrisch veld op positie x3=3m?

Het elektrisch veld van deeltje 1 is E1=k1C(1m3m)2(x^)=+0,25V/mx^. Voor deeltje 2 is dit E2=k2C(5m3m)2x^=+0,50V/mx^. Het totale elektrische veld is dus E3=E1+E2=+0,25V/mx^+0,50V/mx^=+0,75V/mx^. Een deeltje met lading Q3=1C zou dus in de positieve x-richting bewegen, F=QE=0,75Nx^. Dit klinkt logisch, deeltje 1 heeft teven een positieve lading, en stoot dus af. Deeltje 2 trekt dan weer aan, in totaal krijg je een kracht die vertrekt wordt.


Het voorbeeld van hierboven was in slechts één dimensie. In Minecraft zijn er natuurlijk 3 dimensies. Met behulp van cos en sin kunnen we, vertrekkende van de hoken tussen de vector en de drie assen, de coordianten van de vector verkrijgen r=r(cosϕsinθ,sinϕsinθ,cosθ)=r(rx,ry,rz)=(x,y,z). De voorlaatste uitdrukking is interessant, deze laat toe om van een grootte van een vector de projectie op de verschillende assen te verkrijgen.

Implementatie in Minecraft

Om de Coulombkracht in Minecraft te implementeren, kunnen we gebruik maken van het elektrische veld. Ieder deeltje houdt zijn elektrisch veld als een vector bij (dus E=(Ex,Ey,Ez)) alsook de lading Q. Het deeltje kan dan zelf de Coulomb kracht bepalen. Afhankelijk van de grootte van deze gracht, zal het deeltje bewegen.

De cyclus van de beweging van een deeltje akn als volgt beschreven worden:

  • Een deeltje wordt toegevoegd
  • Het deeltje zoekt naar deeltjes in de omgeving, bijvoorbeeld binnen een box met zijde 11 blokken
  • Indien dit ook een geladen deeltje is, bereken het eletrisch veld. Gebruik hiervoor Etmp=Q((x1x2)2+(y1y2)2+(z1z2)2)32 en bepaal de componenten van het veld met Etmp=(Etmpx,Ey,Etmpz)
  • Voor het deeltje zelf, tel de componenten van die berekend veld op bij de componenten voor het elektrisch veld van het deeltje zelf, Ex+=Etmp,x etc.
  • Voor het andere deeltje, trek het elektrisch veld er van af Ex=Etmp,x
  • Voor het andere deeltje, bereken de kracht en zorg ervoor dat het een beweging zal uitvoeren bij een volgende tick indien de kracht voldoende groot is
  • Loop verder voor het originele deeltje over al de andere blokken binnen de box
  • Op het einde van de loop, bereken de kracht op het deeltje en zorg ervoor dat het deeltje een beweging zal ondergaan bij een volgende tick indien de waarde voldoende groot is

Als er een beweging moet worden uitgevoerd, wordt dezelfde loop eerst gedaan maar met het elektrisch veld afgetrokken respectievelijk opgeteld zodat het effect van het elektrisch veld van het deeltje dat gaat bewegen op de andere deeltjes wordt afgetrokken. Dan wordt er tijdelijk een placeholder geplaatst op de originele positie en de nieuwe positie zodat de animatie van een bewegend deeltje kan worden uitgevoerd. Na de animatie worden de palceholders verwijderd en start de cyclus van het begin, bij het toevoegen van een nieuw deeltje.

Problemen

  • Momenteel is de grootste uitdaging een betrouwbare manier vinden die zeker het elektrische veld zal verwijderen indien het deeltje weg gaat. Het zou kunnen gebeuren dat er een deeltje zou worden verwijderd zonder de routine compleet zou worden uitgevoerd. Indien dit zou gebeuren, komt er een spookveld waarbij het deeltje een rare beweging probeert te maken. Op zich is dit niet een groot probleem, indien het deeltje kan bewegen. Het deeltje zou immers het elektrisch veld opnieuw berekenen bij een verplaatsing. Maar bij statische ladingen, of bij krachtsensoren, zou dit wél een probleem zijn.
  • De beweging moet geïnitieerd worden op de server. Indien de client ook de beweging zal beginnen, kan het zijn dat de boekhouding van posities vast loopt. Hierdoor moeten er pakketten verzonden worden naar de clients [zie ScicraftClient.java] wanneer er een beweging zal plaatsvinden. In dit pakket zit het type blok dat de animatie zal ondergaan, alsook de staat van het blok (voor pionen) en of het een beweging van het type annihilation is. (Dit laatste was lazy programming van Bert, dit werkte gewoon lol).
  • Wanneer het pakket wordt ontvangen door de client, zal de client een animatie uitvoeren door aan de placeholder blok (geplaatst door de server) extra tags toe te voegen die de beweging beschrijven.
  • De animatie heeft een bepaalde duur, wat de server in het oog houdt. Na de duur van de animatie, verwijderd de server de placeholders en zal het een nieuw blok plaatsten op de juiste positie. (de client plaatst geen blokken, algemeen mag de client nooit iets veranderen in de wereld, of het eindigt in een gamecrash)
  • De code voor de coulombkracht is veel knip-en-plak werk. Als een gevolg zijn er veel functies zoals int2vec voor conversie tussen verschillende typen. Dit kan veel efficiënter, maar ik ben geen kenner in Java, dus ik laat dit over aan der experts :P.