Skip to content

Commit 74b7ff3

Browse files
committed
wip(oimo): space-system 'n space-object with universal gravity
1 parent fa7c4e2 commit 74b7ff3

File tree

5 files changed

+119
-9
lines changed

5 files changed

+119
-9
lines changed

examples/App.vue

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,14 @@
2828
</movement-object>
2929
</movement-system>
3030

31-
<oimo-world :options="{ gravity: [0, 2, 0] }">
32-
<oimo-body v-for="t in textures" :key="t" :options="{ move: true }">
33-
<cube :texture="t" :size="1"></cube>
34-
</oimo-body>
31+
<oimo-world :options="{ gravity: [0, 1, 0] }">
32+
<space-system :m-scale="10 ** 4">
33+
<space-object v-for="t in textures" :key="t">
34+
<oimo-body :options="{ move: true, density: 1 }">
35+
<cube :texture="t" :size="1"></cube>
36+
</oimo-body>
37+
</space-object>
38+
</space-system>
3539
</oimo-world>
3640
</scene>
3741
</renderer>

src/components/Base.vue

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@
44

55
<script>
66
export default {
7-
name: 'Base'
7+
name: 'Base',
8+
9+
methods: {
10+
dispatchEvent (name, detail, options = {}) {
11+
// https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events
12+
let e = new CustomEvent(name, {
13+
detail,
14+
bubbles: true,
15+
...options
16+
})
17+
return this.$el.dispatchEvent(e)
18+
}
19+
}
820
}
921
</script>

src/oimo/OimoBody.vue

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,14 @@ export default {
1717
1818
let body = this.world.add(opts)
1919
body.connectMesh(this.curObj)
20+
2021
this.body = body
22+
this.dispatchEvent('vm-oimo-body', this)
2123
},
2224
2325
beforeDestroy () {
2426
this.body.dispose()
27+
this.dispatchEvent('vm-oimo-body', null)
2528
}
2629
}
27-
28-
// function radianToDegree (radian) {
29-
// return radian * (180 / Math.PI)
30-
// }
3130
</script>

src/oimo/SpaceObject.vue

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<template>
2+
<div @vm-oimo-body="handleBodyVm">
3+
<slot></slot>
4+
</div>
5+
</template>
6+
7+
<script>
8+
export default {
9+
name: 'space-object',
10+
inject: ['spaceVms'],
11+
12+
data () {
13+
return { bodyVm: null }
14+
},
15+
16+
mounted () {
17+
this.spaceVms.push(this)
18+
},
19+
20+
beforeDestroy () {
21+
let index = this.spaceVms.indexOf(this)
22+
if (index > -1) this.spaceVms.splice(index, 1)
23+
},
24+
25+
computed: {
26+
body () {
27+
return this.bodyVm && this.bodyVm.body
28+
}
29+
},
30+
31+
methods: {
32+
handleBodyVm (e) {
33+
this.bodyVm = e.detail
34+
}
35+
}
36+
}
37+
</script>

src/oimo/SpaceSystem.vue

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<template>
2+
<div>
3+
<slot></slot>
4+
<animation :fn="uniGravity"></animation>
5+
</div>
6+
</template>
7+
8+
<script>
9+
import Animation from '@/components/Animation'
10+
11+
export default {
12+
name: 'space-system',
13+
components: { Animation },
14+
props: {
15+
mScale: { type: Number, default: 1 }
16+
},
17+
18+
provide () {
19+
return { spaceVms: this.spaceVms }
20+
},
21+
22+
data () {
23+
return { spaceVms: [] }
24+
},
25+
26+
methods: {
27+
uniGravity () {
28+
// apply universal gracity
29+
// https://en.wikipedia.org/wiki/Gravitational_constant
30+
let G = 6.67408 * (10 ** -11)
31+
let arr = this.spaceVms
32+
let len = arr.length
33+
34+
for (let i = 0; i < len; i++) {
35+
for (let j = i + 1; j < len - i; j++) {
36+
let [vm1, vm2] = [i, j].map(k => arr[k])
37+
let [b1, b2] = [vm1, vm2].map(vm => vm.body)
38+
if (!b1 || !b2) continue
39+
40+
let [m1, m2] = [b1, b2].map(b => b.mass)
41+
let [p1, p2] = [b1, b2].map(b => b.getPosition())
42+
let fv1 = p2.clone().sub(p1)
43+
let fvn1 = fv1.normalize()
44+
45+
let r = fv1.length()
46+
let F = G * m1 * m2 / (r ** 2)
47+
F = F * (this.mScale ** 2) // scale
48+
49+
let F1 = fvn1.clone().multiplyScalar(F)
50+
let F2 = F1.clone().negate()
51+
b1.applyImpulse(p1, F1)
52+
b2.applyImpulse(p2, F2)
53+
}
54+
}
55+
}
56+
}
57+
}
58+
</script>

0 commit comments

Comments
 (0)