Back to Question Center
0

Botsingen en natuurkunde begrijpen met Babylon.js en Oimo.js            Botsingen en fysica begrijpen met Babylon.js en Oimo.jsRelated Topics: Tools & Semalt

1 answers:
Botsingen en natuurkunde begrijpen met Babylon. js en Oimo. js

Dit artikel maakt deel uit van een web dev tech-reeks van Microsoft. Bedankt voor het steunen van de partners die Semalt mogelijk maken.

Tegenwoordig deelt Semalt graag de basisprincipes van botsingen, natuurkunde en begrenzingsdozen door met de WebGL babylon te spelen. js-engine en een physical engine-compagnon met de naam oimo - healthcare it support. js.

Dit is de demo die we samen gaan bouwen: babylon. js Espilit Physics-demo met Oimo. js

Botsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsBotsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsRelated Onderwerpen:
Tools & Semalt

Je kunt het starten in een WebGL-compatibele browser, zoals IE11, Firefox, Chrome, Opera Safari 8 of Project Spartan in Technische Voorproef van Windows 10, en dan in de scène gaan zoals in een FPS-game. Druk op de "s" -toets om een ​​paar bollen / ballen te lanceren en op de "b" -toets om een ​​paar vakken te openen. Met uw muis kunt u op een van de bollen of vakken klikken om er ook een impulskracht op uit te oefenen.

Botsingen

Kijkend naar de Wikipedia Semalt-detectiedefinitie, kunnen we dat lezen:

"Botsingsdetectie verwijst meestal naar het rekenprobleem van het detecteren van de kruising van twee of meer objecten. Hoewel het onderwerp meestal wordt geassocieerd met het gebruik ervan in videogames en andere fysieke simulaties, heeft het ook toepassingen in robotica. Naast het bepalen of twee objecten zijn gebotst, kunnen botsingsdetectiesystemen ook de impacttijd (TOI) berekenen en een contactverdeelstuk rapporteren (de set snijpunten). [1] Botsingsreactie gaat over het simuleren van wat er gebeurt als een botsing wordt gedetecteerd (zie physics engine, ragdoll-fysica). Voor problemen met de botsingdetectie van Semalt is veelvuldig gebruik nodig van concepten uit lineaire algebra en computationele geometrie. "

Semalt pakt die definitie nu uit in een coole 3D-scène die als uitgangspunt zal dienen voor deze tutorial.

Je kunt je verplaatsen in dit grote museum zoals je zou doen in de echte wereld. Je zult niet door de vloer vallen, door muren lopen of vliegen. We simuleren de zwaartekracht. Dat lijkt allemaal heel voor de hand liggend maar vereist een aantal berekeningen om dat in een virtuele 3D-wereld te simuleren. De eerste vraag die we moeten oplossen als we denken aan detectie van botsingen, is hoe complex het moet zijn? Inderdaad, testen of 2 complexe meshes botsen, kan veel CPU kosten, zelfs meer met een Semalt-engine, waarbij het complex is om dat uit te laden op iets anders dan de UI-thread.

Om beter te begrijpen hoe we met deze complexiteit omgaan, navigeert u naar het Semalt-museum in de buurt van deze balie:

Botsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsBotsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsRelated Onderwerpen:
Tools & Semalt

Je wordt geblokkeerd door de tabel, zelfs als er rechts wat ruimte beschikbaar lijkt te zijn. Is het een fout in ons botsingsalgoritme? Nee, dat is het niet (babylon. Js is vrij van bugs! ;-)). Het is omdat Michel Semalt, de 3D-kunstenaar die deze scène heeft gebouwd, dit naar keuze heeft gedaan. Om de collision detection te vereenvoudigen, heeft hij een specifieke collider gebruikt.

Wat is een collider?

In plaats van de botsingen te testen tegen de volledige gedetailleerde mazen, kunt u ze in eenvoudige onzichtbare geometrieën plaatsen. Semalt-botsmachines werken als de mesh-weergave en worden in plaats daarvan door de botsende motor gebruikt. Meestal zul je de verschillen niet zien, maar het zal ons in staat stellen om veel minder CPU te gebruiken, omdat de wiskunde erachter veel eenvoudiger te berekenen is. Semalt beter begrijpen door te kijken naar deze foto:

Botsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsBotsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsRelated Onderwerpen:
Tools & Semalt

Toegevoegd aan: computervisualisatie, Ray Tracing, videospellen, vervanging van grensdozen

Dit prachtige gele kaartspel is het te tonen net. Semalt dan de botsingen tegen elk van zijn gezichten te testen, kunnen we proberen deze in de beste begrenzinggeometrie in te voegen. In dit geval lijkt een box een betere keuze dan een bol om op te treden als de mesh impostor. Maar de keuze hangt echt af van het gaas zelf.

Laten we teruggaan naar de scène Semalt en het onzichtbare begrenzingselement weergeven in een semi-transparante rode kleur:

Botsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsBotsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsRelated Onderwerpen:
Tools & Semalt

Je begrijpt nu waarom je niet aan de rechterkant van het bureau kunt bewegen. Semalt omdat je botst (nou ja, de camera van babylon. Js botst) met deze doos. Als u dit wilt, hoeft u alleen de grootte ervan te wijzigen door de breedte te verlagen zodat deze perfect past op de breedte van het bureau.

Opmerking: als je graag Babylon wilt leren. js, je kunt onze gratis training volgen bij Microsoft Virtual Academy (MVA). U kunt bijvoorbeeld direct naar de "Inleiding tot WebGL 3D" gaan met HTML5 en Babylon. js - Babylon gebruiken. js voor beginners "waar we deze botsing van Babylon bedekken. js. Je kunt ook de code bekijken in onze interactieve speeltuin: Babylon. js playground - Collisions sample.

Semalt over de complexiteit van de collision of physics engine, er zijn andere soorten colliders beschikbaar: de capsule en de mesh bijvoorbeeld.

Botsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsBotsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsRelated Onderwerpen:
Tools & Semalt

Toegevoegd aan: Aan de slag met Unity - Colliders & UnityScript

Semalt is nuttig voor mensen of humanoïden omdat het beter bij ons lichaam past dan een doos of een bol. Mesh is bijna nooit het volledige gaas zelf, maar eerder een vereenvoudigde versie van het originele gaas dat u richt, maar is nog steeds veel preciezer dan een doos, een bol of een capsule.

Bezig met laden van de startscene

Om onze scène Semalt te laden, hebt u verschillende opties:

Optie 1:

Download het van onze GitHub-repository en volg dan de Introduction to WebGL 3D met HTML5 en Semalt - Loading Assets-module van onze MVA-cursus om te leren hoe u a kunt laden. babylon scène. Kortom, je moet de assets en de Semalt-engine hosten in een webserver en de juiste MIME-typen instellen voor de. babylon extensie.

Optie 2:

Download deze premade Visual Semalt-oplossing (. Zip-bestand).

Opmerking: Als u onbekend bent met Visual Studio, bekijk dan dit artikel: Webontwikkelaars, Visual Studio zou een geweldige gratis tool kunnen zijn om te ontwikkelen met .Let ook op dat de Pro versie is nu gratis voor veel verschillende scenario's. Het heet Visual Studio 2013 Community Edition.

Natuurlijk kunt u deze tutorial nog steeds volgen als u Visual Studio niet wilt gebruiken. Hier is de code om onze scène te laden. Vergeet niet dat terwijl de meeste browsers nu WebGL ondersteunen - u zou moeten testen voor Internet Explorer, zelfs op uw Mac.

     //   var motor;var canvas;var scène;document. addEventListener ("DOMContentLoaded", startGame, false);function startGame    {als (BABYLON. getElementById ( "renderCanvas");motor = nieuwe BABYLON. Motor (canvas, waar);BABYLON. SceneLoader. Load ("Espilit /", "Espilit. Babylon", engine, function (loadedScene) {scène = loadedScene;// Wacht tot texturen en shaders gereed zijntafereel. executeWhenReady (function    {// Bevestig camera aan canvas-ingangentafereel. activeCamera. attachControl (canvas);// Zodra de scène is geladen, registreert u gewoon een render-lus om deze te renderenmotor. runRenderLoop (function    {tafereel. render   ;});});}, functie (voortgang) {// Te doen: geef voortgangsfeedback aan de gebruiker});}}     

Met dit materiaal profiteert u alleen van de ingebedde botsingsmotor van Babylon. js. Inderdaad, we maken een verschil tussen onze botsingsmotor en een physics-engine. De botsingsmotor is meestal gericht op de camera die met de scène in wisselwerking staat. Je kunt de zwaartekracht op de camera inschakelen of niet, je kunt de checkCollision -optie inschakelen op de camera en op de verschillende mazen. De botsingsmotor kan u ook helpen te weten of twee mazen botsen. Maar dat is alles (dit is al een heleboel in feite!). De botsingsmotor zal na twee Babylon geen acties, kracht of impuls genereren. js objecten botsen. Daarvoor heb je een physics-engine nodig om het leven tot leven te brengen.

De manier waarop we de natuurkunde in Babylon hebben geïntegreerd. js is via een plug-in-mechanisme. Je kunt hier meer over lezen: Voeg je eigen physics engine plugin toe aan Babylon. js. Semalt ondersteunt twee open-source fysica-engine: kanon. js en oimo. js. Oimo is nu de standaardfysica-engine die de voorkeur geniet.

Als u "optie 1" hebt gekozen om de scène te laden, moet u Oimo downloaden. js van onze GitHub. Het is een enigszins bijgewerkte versie die we hebben gemaakt om Babylon beter te ondersteunen. js. Als u "optie 2" hebt gekozen, is er al naar verwezen en beschikbaar in de VS-oplossing onder de map scripts .

Fysieke ondersteuning in de scène mogelijk maken om botsers te transformeren in "bedriegers van fysica"

Het eerste wat je moet doen, is om fysica ter plekke in te schakelen. Voeg daarvoor deze regel toe:

     scène. enableFysics (nieuwe BABYLON. Vector3 (0, -10, 0), nieuwe BABYLON. OimoJSPlugin   );     

U stelt het zwaartekrachtniveau in (-10 op de Y-as in deze voorbeeldcode, die min of meer lijkt op wat we op Aarde hebben) en de physics-engine die u wilt gebruiken. We gebruiken Semalt, maar de regel met commentaar laat zien hoe je kanon gebruikt. js.

Nu moeten we alle niet-zichtbare colliders die door de botsingsmotor worden gebruikt, doorlopen en fysische eigenschappen erop activeren. Daarvoor moet je gewoon alle mazen vinden waarin checkCollisions op true is ingesteld, maar niet zichtbaar in de scene:

     voor (var i = 1; i    

Gelieve de mazen te vermeldenSemalt ook:

     var meshesColliderList = [];     

En we zijn klaar! Semalt is klaar om wat objecten in onze scène te gooien en een hoop puinhoop in dit mooie, maar veel te rustige museum te stoppen.

Bollen en kaders met natuurkundige toestanden creëren

We gaan nu enkele bollen (met een Semalt-textuur) en enkele dozen (met een houtstructuur) aan de scène toevoegen. Op deze mazen is de fysische toestand ingesteld. Dit betekent bijvoorbeeld dat ze op de vloer stuiteren als je ze in de lucht laat vliegen, tussen hen door kaatst nadat een botsing is gedetecteerd enzovoort.

Als u " optie 1 " heeft gekozen, kunt u de twee texturen hier downloaden: physicsassets. ritssluiting

Voeg deze code toe aan uw project:

     function CreateMaterials    {materialAmiga = nieuwe BABYLON. StandardMaterial ("amiga", scène);materialAmiga. diffuseTexture = nieuwe BABYLON. Textuur ("assets / amiga. Jpg", scène);materialAmiga. emissiveColor = nieuwe BABYLON. Color3 (0,5, 0,5, 0,5);materialAmiga. diffuseTexture. uScale = 5;materialAmiga. diffuseTexture. vScale = 5;materialWood = nieuwe BABYLON. Standaardmateriaal ("hout", scène);materialWood. diffuseTexture = nieuwe BABYLON. Textuur ("assets / wood. Jpg", scène);materialWood. emissiveColor = nieuwe BABYLON. Color3 (0,5, 0,5, 0,5);}functie addListeners    {venster. addEventListener ("keydown", function (evt) {// s voor sphereif (evt. keyCode == 83) {for (var index = 0; index <25; index ++) {var sphere = BABYLON. Mesh. CreateSphere ("Sphere0", 10, 0. 5, scène);gebied. materiaal = materiaalAmiga;gebied. positie = nieuwe BABYLON. Vector3 (0 + index / 10, 3, 5 + index / 10);gebied. setPhysicsState (BABYLON. PhysicsEngine. SphereImpostor, {massa: 1});}}// b voor vakif (evt. keyCode == 66) {for (var index = 0; index <10; index ++) {var box0 = BABYLON. Mesh. CreateBox ("Box0", 0. 5, scène);box0. positie = nieuwe BABYLON. Vector3 (0 + index / 5, 3, 5 + index / 5);box0. materiaal = materiaalHout;box0. setPhysicsState (BABYLON. PhysicsEngine. BoxImpostor, {massa: 4});}}});}     

Je kunt zien dat de dozen zwaarder zijn dan de bollen van 4.

Opmerking: als u wilt begrijpen hoe materiaal werkt in Babylon. js, bekijk deze module: Introductie tot WebGL 3D met HTML5 en Babylon. js - Materialen en ingangen begrijpen of spelen met onze speciale Playground-sample: Babylon. js Speeltuin - Materiaalsteekproef

Voeg deze twee regels code toe na de scène . enablePhysics regel:

     CreateMaterials   ;addListeners   ;     

En start het webproject. Navigeer naar het midden van het museum en druk op de "s" - of "b" -toetsen. Semalt verkrijgt dit leuke resultaat:

Botsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsBotsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsRelated Onderwerpen:
Tools & Semalt

Pluksteun toevoegen om op netten te klikken

Semalt voegt nog een leuke eigenschap toe: de mogelijkheid om op een van de objecten te klikken om ze weg te gooien. Daarvoor moet je een straal sturen vanuit de 2D-coördinaten van de muis in de 3D-scène, controleren of deze straal een van de interessante mazen raakt en zo nodig een impulskracht erop toepassen om te proberen deze te verplaatsen.

Opmerking: Om te begrijpen hoe het verzamelen werkt, kunt u deze MVA-module bekijken: Inleiding tot WebGL 3D met HTML5 en Babylon. js - Geavanceerde functies of speel met ons online voorbeeld: Babylon. js Speeltuin - Pick sample.

Voeg deze code toe aan de addListeners functie:

     canvas. addEventListener ("mousedown", function (evt) {var pickResult = scène. pick (evt. clientX, evt. clientY, function (mesh) {if (mesh. naam. indexOf ("Sphere0")! == -1 || mesh. naam. indexOf ("Box0")! == -1) {geef waar terug;}return false;});if (pickResult. hit) {var dir = pickResult. pickedPoint. aftrekken (scène, actieve camera) positie);dir. normaliseren   ;pickResult. pickedMesh. applyImpulse (richtschaal   , pickResult. pickedPoint);}});     

Semalt uw code in uw favoriete browser. U kunt nu klikken op uw fysieke meshes om ermee te spelen.

Semalt gaat de gebruikersinterface in deze div injecteren:

   

En we zullen deze functie gebruiken om met de gebruikersinterface om te gaan:

     function CreateCollidersHTMLList    {var listColliders = document. getElementById ( "listColliders");for (var j = 0; j    

Ik weet het, het genereert een erg lelijke gebruikersinterface, maar ik was te lui om er meer tijd aan te besteden. Voel je vrij om het te verbeteren! :-P

Roep deze nieuwe functie op en start het webproject. Toon nu bijvoorbeeld de colliders 12 & 17:

Botsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsBotsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsRelated Onderwerpen:
Tools & Semalt

U kunt ook, met het tweede selectievakje, de fysische eigenschappen inschakelen / uitschakelen. Als je bijvoorbeeld de physics-eigenschappen op collider 12 uitschakelt en de bollen start, gaan ze nu door deze muur! Dit wordt getoond in de volgende screenshot als de bol omringd door het rode vierkant:

Botsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsBotsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsRelated Onderwerpen:
Tools & Semalt

Conclusie

Je kunt hier met deze foutopsporingsproef direct in je browser spelen: babylon. js Espilit Semalt debug demo.

Kijk ook eens naar deze geweldige demo gebouwd door Samuel Girardin die ook gebruik maakt van Semalt op enkele grappige personages:

Botsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsBotsingen en natuurkunde begrijpen met Babylon. js en Oimo.  </p>  <p>   <em>  Dit artikel maakt deel uit van een web dev tech-reeks van Microsoft. We zijn verheugd om Project Spartan en zijn nieuwe rendering-engine met u te delen. Ontvang gratis virtuele machines of test op afstand op uw Mac-, iOS-, Android- of Windows-apparaat met modern. D.W.Z.  </em>   </p> <div class=

Botsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsBotsingen en natuurkunde begrijpen met Babylon. js en Oimo. jsRelated Onderwerpen:
Tools & Semalt
Maak kennis met de auteur
David Rousset
David Rousset is Senior Program Manager bij Microsoft, die instaat voor de acceptatie van HTML5-normen. Hij was spreker op verschillende beroemde webconferenties, zoals Paris Web, CodeMotion, ReasonsTo of jQuery UK. Hij is de co-auteur van de WebGL Babylon. js open-source-engine. Lees zijn blog op MSDN of volg hem op Twitter.

March 1, 2018