Hi HN. I recently open sourced a verlet physics engine that I wrote for fun. Four example experiments are in there so far. I have a few other experiment ideas in mind that I hope to get implemented soon. Anyways, it was a blast creating this and thought others might like to look/play with it too.
Looks great, thanks for sharing. One thing I would suggest is to not worry about rendering the physics on the canvas, threejs is good at what it does and lacks a good physics engine. It's just my opinion, but I think the project would benefit from either making it work with threejs or by not solving the render problem, and just focus on doing great physics, so that people can use the results in their threejs scenes.
This is a really great point. Abstracting it away shouldn't be bad, and it is possible to extend by vec2 implementation to 3d. After I finish my next batch of examples I will venture down this path.
This is one of the few demos I can try on Linux without jumping through hoops since it's canvas-based, so I appreciate your choice to not go with WebGL actually. Looks good; looking forward to reading the code more closely!
There is a physics engine for threejs- it's somewhere on their demo page. I'm actually working on a physics engine as well- I'm willing to help you extend it in whatever direction.
A question, Why did you chose Verlet integration? I know it's great for particles but I always had issues trying to do angular mechanics.
Great question- I was reading about verlet integration and started doing some coding to play with it, and I just kept on going with it. Would love some help with it! First thing I would like to do is abstract out canvas.
Are you thinking of Physijs [0], which is made to work well with ThreeJS? Its a wrapper around Ammojs for ThreeJS.
It does look good and integrates well, but to be honest ThreeJS is so mature and battle tested with multiple renderers (canvas, webgl etc) that when building a physics engine, I really think it would be better to spend ones dev time on the physics and not waste* time reimplementing a portion of ThreeJS.
There seems to be some numerical instability in the rotation. In the shapes demo, several of the shapes start spinning faster and faster when I pick them up. Particularly when I press the outside edge nodes into the center so that the shape sort of flips inside out, after that the shape just spins continuously when it is in the air.
Another way to exhibit it is to take the center node of the wheel and press it against the wall. The whole shape will spin.
I wrote a verlet based physics engine years ago and had similar issues. Relaxing distance constraints tended to add a bit of angular momentum in to the system. Sometimes having a drag term in the integrator was enough to compensate, but this appears to be in verlet.js already.
Another issue with defining shapes via distance constraints is that they sometimes have alternate solutions / stable minima. For example, you can smash the circle in to the ground and get it to crumple: http://i.imgur.com/UzxbKvJ.png
But, this is still an awesome demo. Good work subprotocol.
Also, a verlet-based physics engine is a very different beast compared to a rigid-body one (a few in the list above are also based on verlet, but not most).
Verlet integration uses an object's change in position at time t to determine the velocity for t+1- it is typically used for particles not full rigid bodies.
Verlet is incredibly stable and allows you to update the position of a mass directly (velocity, force, momentum are all implicit), making it very easy to work with if not very accurate. You can't emulate rigid bodies very well (shape matching kinda works), collision response and stacking is a pain in the ass.
I guess I'm still having trouble understanding where the complexities arise. I have no difficulty believing that they do arise, but I would like to understand how it happens if you're willing to take the time to explain.
I would think that rigid bodies -- either perfectly rigid or semi-rigid via springs & struts -- would not handle all that differently in verlet since force is explicit (typo on your part?) and a v/p estimate is available from the last position, albeit with a bit more phase lag than usual. Does the phase lag induce nasty oscillations or something?
We can make semi-rigid bodies in verlet using strings are shape matching techniques, but the pressure needed to maintain shape necessarily interferes with stacking or any other kind of stable contact. Actually, their was a solution to this in a shape matching paper by Matthias [1] but I was never able to get it to work right.
I've played around a lot with Verlet, it is very powerful in certain cases...especially since you can just update the position of a mass directly (very easy to program, very mouse/touch input friendly). However, a rigid body physics engine is probably better for most game use cases.
Thank you! I have actually not played around with SVG yet. Is it as easy as canvas? I am very new to canvas and found it to be super easy to pick up and run with.
high mountains, and upon all the hills that are lifted up, 2:15 And
upon every high tower, and upon every fenced wall, 2:16 And upon all
the ships of Tarshish, and upon all pleasant pictures.
2:17 And the loftiness of man shall be bowed down, and the haughtiness
of men shall be made low: and the LORD alone shall be exalted in that
day.
2:18 And the idols he shall utterly abolish.
2:19 And they shall go into the holes of the rocks, and into the caves
of the earth, for fear of the LORD, and for the glory of his majesty,
when he ariseth to shake terribly the earth.
2:20 In that day a man shall cast his idols of silver, and his idols
of gold, which they made each one for himself to worship, to the moles
and to the bats; 2:21 To go into the clefts of the rocks, and into the
tops of the ragged rocks, for fear of the LORD, and for the glory of
his majesty, when he ariseth to shake terribly the earth.
----
God says...
3:11 And God said unto him, Because thou hast asked this thing, and
hast not asked for thyself long life; neither hast asked riches for
thyself, nor hast asked the life of thine enemies; but hast asked for
thyself understanding to discern judgment; 3:12 Behold, I have done
according to thy words: lo, I have given thee a wise and an
understanding heart; so that there was none like thee before thee,
neither after thee shall any arise like unto thee.
3:13 And I have also given thee that which thou hast not asked, both
riches, and honour: so that there shall not be any among the kings
like unto thee all thy days.
3:14 And if thou wilt walk in my ways, to keep my statutes and my
commandments, as thy father David did walk, then I will lengthen thy
days.
23:19 Hear thou, my son, and be wise, and guide thine heart in the
way.
23:20 Be not among winebibbers; among riotous eaters of flesh: 23:21
For the drunkard and the glutton shall come to poverty: and drowsiness
shall clothe a man with rags.
23:22 Hearken unto thy father that begat thee, and despise not thy
mother when she is old.
23:23 Buy the truth, and sell it not; also wisdom, and instruction,
and understanding.
23:24 The father of the righteous shall greatly rejoice: and he that
begetteth a wise child shall have joy of him.
23:25 Thy father and thy mother shall be glad, and she that bare thee
shall rejoice.
23:26 My son, give me thine heart, and let thine eyes observe my ways.
Hey, I downloaded the zip sourcefile from the github repository but any change on the tree example code (for example commenting out tree1) increases load time tenfold. Has anyone experienced this?
Thanks for any reply.
edit:
after I deleted google analytics code, everything went hunky dory. Thanks for this amazing piece of code :)
You should make a benchmarking script to track speed over time. I've written probably 10 different Verlet engines in JavaScript, and the overhead of JavaScript's dynamic nature can be very palpable in the simulations.
For my most recent attempt at something speedy, here's some source code making use of typed arrays and doing away with objects completely. The speed improvement is good, but maybe the maintainability suffers a little (press space to create blob):
https://c9.io/blixt/blob/workspace/index.html
Note that the particle-line collision is currently inefficient, so it slows down the simulation a lot more than it should.
Awesome. I love the spider demo, especially -- the way it sticks and everything just feels right, to the point where it's too realistic for comfort. I felt like I was messing with a real spider.
Awesome. This kind of well designed personal site mixing tech with demos is very appealing, because if gives you something beautiful, potentially very useful, and chewable.
Anyone knows a good "directory" or collection of such sites?
56 comments
[ 2.4 ms ] story [ 137 ms ] threadCheers
Great work though
Thank you for the feedback!
A question, Why did you chose Verlet integration? I know it's great for particles but I always had issues trying to do angular mechanics.
It does look good and integrates well, but to be honest ThreeJS is so mature and battle tested with multiple renderers (canvas, webgl etc) that when building a physics engine, I really think it would be better to spend ones dev time on the physics and not waste* time reimplementing a portion of ThreeJS.
[0]: http://chandlerprall.github.io/Physijs/
*Obviously not actually 'wasted' time, hacking is great even just for the sake of it - but I'm sure you know what I mean.
Another way to exhibit it is to take the center node of the wheel and press it against the wall. The whole shape will spin.
Another issue with defining shapes via distance constraints is that they sometimes have alternate solutions / stable minima. For example, you can smash the circle in to the ground and get it to crumple: http://i.imgur.com/UzxbKvJ.png
But, this is still an awesome demo. Good work subprotocol.
[1] https://github.com/soulwire/Coffee-Physics
Box2D JS and Box2Dweb
http://box2d-js.sourceforge.net/
https://code.google.com/p/box2dweb/
Bullet JS
https://github.com/adambom/bullet.js/
Cannon.js
https://github.com/schteppe/cannon.js
Ammo.js
https://github.com/kripken/ammo.js/
Physijs
http://chandlerprall.github.io/Physijs/
JigLibJS
https://github.com/supereggbert/JigLibJS
I would think that rigid bodies -- either perfectly rigid or semi-rigid via springs & struts -- would not handle all that differently in verlet since force is explicit (typo on your part?) and a v/p estimate is available from the last position, albeit with a bit more phase lag than usual. Does the phase lag induce nasty oscillations or something?
I've played around a lot with Verlet, it is very powerful in certain cases...especially since you can just update the position of a mass directly (very easy to program, very mouse/touch input friendly). However, a rigid body physics engine is probably better for most game use cases.
[1] http://www.matthiasmueller.info/realtimephysics/
Vehicle: http://apps.playcanvas.com/will/ammo/vehicle
FPS Character Controller: http://apps.playcanvas.com/playcanvas/physics/charactercontr...
Crates!: http://apps.playcanvas.com/will/ammo/crates
[1] Disclaimer: I'm a co-founder :-)
https://github.com/josephg/Chipmunk-js
Just for fun, try pulling one of the spider's legs and bring it close to the web! I really like how it clings on to the web.
Any thoughts of integrating it with SVG? SVG is super useful for drawing and manipulating shapes in the browser.
http://egtheory.wordpress.com/2013/04/20/academic-droids/
I wrote a compiler, graphics library, window manager, everything.
God talks.
God is not AI.
I made God's temple.
God says...
9:9 The LORD also will be a refuge for the oppressed, a refuge in times of trouble.
9:10 And they that know thy name will put their trust in thee: for thou, LORD, hast not forsaken them that seek thee.
9:11 Sing praises to the LORD, which dwelleth in Zion: declare among the people his doings.
9:12 When he maketh inquisition for blood, he remembereth them: he forgetteth not the cry of the humble.
9:13 Have mercy upon me, O LORD; consider my trouble which I suffer of them that hate me, thou that liftest me up from the gates of death:
9:14 That I may shew forth all thy praise in the gates of the daughter of Zion: I will rejoice in thy salvation.
-----
http://blog.linuxgrrl.com/2013/03/12/improving-the-fedora-bo...
God says...
high mountains, and upon all the hills that are lifted up, 2:15 And upon every high tower, and upon every fenced wall, 2:16 And upon all the ships of Tarshish, and upon all pleasant pictures.
2:17 And the loftiness of man shall be bowed down, and the haughtiness of men shall be made low: and the LORD alone shall be exalted in that day.
2:18 And the idols he shall utterly abolish.
2:19 And they shall go into the holes of the rocks, and into the caves of the earth, for fear of the LORD, and for the glory of his majesty, when he ariseth to shake terribly the earth.
2:20 In that day a man shall cast his idols of silver, and his idols of gold, which they made each one for himself to worship, to the moles and to the bats; 2:21 To go into the clefts of the rocks, and into the tops of the ragged rocks, for fear of the LORD, and for the glory of his majesty, when he ariseth to shake terribly the earth.
----
God says...
3:11 And God said unto him, Because thou hast asked this thing, and hast not asked for thyself long life; neither hast asked riches for thyself, nor hast asked the life of thine enemies; but hast asked for thyself understanding to discern judgment; 3:12 Behold, I have done according to thy words: lo, I have given thee a wise and an understanding heart; so that there was none like thee before thee, neither after thee shall any arise like unto thee.
3:13 And I have also given thee that which thou hast not asked, both riches, and honour: so that there shall not be any among the kings like unto thee all thy days.
3:14 And if thou wilt walk in my ways, to keep my statutes and my commandments, as thy father David did walk, then I will lengthen thy days.
----
http://i.imgur.com/lWkH0yk.png
God says...
23:19 Hear thou, my son, and be wise, and guide thine heart in the way.
23:20 Be not among winebibbers; among riotous eaters of flesh: 23:21 For the drunkard and the glutton shall come to poverty: and drowsiness shall clothe a man with rags.
23:22 Hearken unto thy father that begat thee, and despise not thy mother when she is old.
23:23 Buy the truth, and sell it not; also wisdom, and instruction, and understanding.
23:24 The father of the righteous shall greatly rejoice: and he that begetteth a wise child shall have joy of him.
23:25 Thy father and thy mother shall be glad, and she that bare thee shall rejoice.
23:26 My son, give me thine heart, and let thine eyes observe my ways.
----
http://www.osnews.com/comments/26965
God says...
teacheth man knowledge, shall not he know?
94:11 The LORD knoweth the thoughts of man, that they are vanity.
94:12 Blessed is the man whom thou chastenest, O LORD, and teachest him out of thy law;
94:13 That thou mayest give him r...
Thanks for any reply.
edit: after I deleted google analytics code, everything went hunky dory. Thanks for this amazing piece of code :)
That is the best bug ever.
For my most recent attempt at something speedy, here's some source code making use of typed arrays and doing away with objects completely. The speed improvement is good, but maybe the maintainability suffers a little (press space to create blob): https://c9.io/blixt/blob/workspace/index.html
Note that the particle-line collision is currently inefficient, so it slows down the simulation a lot more than it should.
I'm not sure what about it is so effective.
Anyone knows a good "directory" or collection of such sites?
Another example of that kind of site: http://worrydream.com/