ammo.js
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:Direct port of the Bullet physics engine to JavaScript using Emscripten
ammo.js
=======


Demos
-----

 * [Cubes](https://rawcdn.githack.com/kripken/ammo.js/99d0ec0b1e26d7ccc13e013caba8e8a5c98d953b/examples/webgl_demo/ammo.html)
 * [Cubes (WebAssembly)](https://rawcdn.githack.com/kripken/ammo.js/99d0ec0b1e26d7ccc13e013caba8e8a5c98d953b/examples/webgl_demo/ammo.wasm.html)
 * [SoftBody-Rope](https://rawcdn.githack.com/kripken/ammo.js/99d0ec0b1e26d7ccc13e013caba8e8a5c98d953b/examples/webgl_demo_softbody_rope/index.html)
 * [SoftBody-Cloth](https://rawcdn.githack.com/kripken/ammo.js/99d0ec0b1e26d7ccc13e013caba8e8a5c98d953b/examples/webgl_demo_softbody_cloth/index.html)
 * [SoftBody-Volume](https://rawcdn.githack.com/kripken/ammo.js/99d0ec0b1e26d7ccc13e013caba8e8a5c98d953b/examples/webgl_demo_softbody_volume/index.html)
 * [Heightmap](https://rawcdn.githack.com/kripken/ammo.js/99d0ec0b1e26d7ccc13e013caba8e8a5c98d953b/examples/webgl_demo_terrain/index.html)
 * [Vehicle](https://rawcdn.githack.com/kripken/ammo.js/99d0ec0b1e26d7ccc13e013caba8e8a5c98d953b/examples/webgl_demo_vehicle/index.html)


Overview
--------

**Example code to give you an idea of the API**:

 * https://github.com/kripken/ammo.js/blob/master/examples/webgl_demo/worker.js#L6 which interacts with https://github.com/kripken/ammo.js/blob/master/examples/webgl_demo/ammo.html#L14

ammo.js is a direct port of the [Bullet physics
engine](http://bulletphysics.org/) to JavaScript, using Emscripten. The source
code is translated directly to JavaScript, without human rewriting, so
functionality should be identical to the original Bullet.

**Note: ammo.js has just been updated to a new porting approach. If you find
some part of the Bullet API that is not supported that you need, please see
https://github.com/kripken/ammo.js/issues/60**

'ammo' stands for "Avoided Making My Own js physics engine by compiling bullet
from C++" ;)

ammo.js is zlib licensed, just like Bullet.

Discussion takes place on IRC at #emscripten on Mozilla's server
(irc.mozilla.org)


Instructions
------------

`builds/ammo.js` contains a prebuilt version of ammo.js. This is probably what you want.

You can also [build](#building) ammo.js yourself.


Usage
-----

The most straightforward thing is if you want to write your code in C++, and
run that on the web. If so, then you can build your C++ code with emscripten
normally and either build and link Bullet using

https://emscripten.org/docs/compiling/Building-Projects.html

or you can use Bullet directly from emscripten-ports, with `-s USE_BULLET=1`.
In both cases, you don't need ammo.js, just plain Bullet.

If, on the other hand, you want to write code in JavaScript, you can use the
autogenerated binding code in ammo.js. A complete example appears in

  `examples/hello_world.js`

That is HelloWorld.cpp from Bullet, translated to JavaScript. Other examples
in that directory might be useful as well. In particular see the WebGL
demo code in

  `examples/webgl_demo/ammo.html`


Bindings API
------------

ammo.js autogenerates its API from the Bullet source code, so it should
be basically identical. There are however some differences and things
to be aware of:

  * See https://github.com/kripken/emscripten/wiki/WebIDL-Binder
    for a description of the bindings tool we use here, which includes
    instructions for how to use the wrapped objects.

  * All ammo.js elements should be accessed through `Ammo.*`. For example,
    `Ammo.btVector3`, etc., as you can see in the example code.

  * Member variables of structs and classes can be accessed through
    setter and getter functions, that are prefixed with `|get_|` or `|set_|`.
    For example,

      `rayCallback.get_m_rayToWorld()`

    will get `m_rayToWorld` from say a `ClosestRayResultCallback`. Native
    JavaScript getters and setters could give a slightly nicer API here,
    however their performance is potentially problematic.

  * Functions returning or getting `float&` or `btScalar&` are converted to
    float. The reason is that `float&` is basically `float*` with nicer syntax
    in C++, but from JavaScript you would need to write to the heap every
    time you call such a function, making usage very ugly. With this change,
    you can do `|new btVector3(5, 6, 7)|` and it will work as expected. If
    you find a case where you need the float& method, please file an issue.

  * Not all classes are exposed, as only what is described in ammo.idl is
    wrapped. Please submit pull requests with extra stuff that you need
    and add.

  * There is experimental support for binding operator functions. The following
    might work:

    | Operator  | Name in JS |
    |-----------|------------|
    | `=`       | `op_set`   |
    | `+`       | `op_add`   |
    | `-`       | `op_sub`   |
    | `*`       | `op_mul`   |
    | `/`       | `op_div`   |
    | `[]`      | `op_get`   |
    | `==`      | `op_eq`    |


Building
--------

In order to build ammo.js yourself, you will need
[Emscripten](http://emscripten.org) and [cmake](https://cmake.org/download).

For more information about setting up Emscripten, see the [getting started
guide](https://emscripten.org/docs/getting_started).

To configure and build ammo into the `builds` directory, run the following:

  ```bash
  $ cmake -B builds
  $ cmake --build builds
  ```

There are also some key options that can be specified during cmake
configuration, for example:

  ```bash
  $ cmake -B builds -DCLOSURE=1                # compile with closure
  $ cmake -B builds -DTOTAL_MEMORY=268435456   # allocate a 256MB heap
  $ cmake -B builds -DALLOW_MEMORY_GROWTH=1    # enable a resizable heap
  ```

On windows, you can build using cmake's
[mingw](https://chocolatey.org/packages/mingw) generator:

  ```bat
  > cmake -B builds -G 'MinGW Makefiles'
  > cmake --build builds
  ```

Note that if you have not installed emscripten via the emsdk, you can configure
its location with `-DEMSCRIPTEN_ROOT`.

### Building using Docker

ammo.js can also be built with [Docker](https://www.docker.com).
This offers many advantages (keeping its native environment clean, portability, etc.).
To do this, you just have to install Docker and run:

  ```bash
  $ docker-compose build        # to create the Docker image
  $ docker-compose up           # to create the Docker container and build ammo.js
  $ docker-compose run builder  # to build again the ammojs targets after any modification
  ```

If you want to add arguments to cmake, you have to edit the `docker-compose.yml` file. 

Reducing Build Size
-------------------

The size of the ammo.js builds can be reduced in several ways:

  * Removing uneeded interfaces from ammo.idl. Some good examples of this are `btIDebugDraw` and `DebugDrawer`, which are both only needed if visual debug rendering is desired.

  * Removing methods from the `-s EXPORTED_RUNTIME_METHODS=[]` argument in make.py. For example, `UTF8ToString` is only needed if printable error messages are desired from `DebugDrawer`.


Testing
-------

You can run the automatic tests with `npm test`, which in turn will run [ava](https://github.com/avajs/ava) against both the javascript and WebAssembly builds:

```bash
$ npm run test-js      # --> AMMO_PATH=builds/ammo.js ava
$ npm run test-wasm    # --> AMMO_PATH=builds/ammo.wasm.js ava
```

It's also possible to run ava directly for more options:

```
$ npx ava --verbose
$ npx ava --node-arguments inspect
```

When no `AMMO_PATH` is defined, `builds/ammo.js` is tested by default.


Running the Examples
--------------------

[http-server](https://github.com/http-party/http-server) is included as a dev
dependency as an easy way to run the examples. Make sure to serve everything
from the repo root so that the examples can find ammo in the `builds`
directory:

  ```bash
  $ npx http-server -p 3000 .
  ```


Troubleshooting
---------------

  * It's easy to forget to write |new| when creating an object, for
    example

      `var vec = Ammo.btVector3(1,2,3); // This is wrong! Need 'new'!`

    This can lead to error messages like the following:

      `Cannot read property 'a' of undefined`
      `Cannot read property 'ptr' of undefined`

    This is an annoying aspect of JavaScript, sadly.


Reporting Issues
----------------

If you find a bug in ammo.js and file an issue, please include a script
that reproduces the problem. That way it is easier to debug, and we can
then include that script in our automatic tests.


Release Process
---------------

Pushing a new build in `builds/ammo.js` should be done only after the
following steps:

  * Configure with [closure](https://github.com/google/closure-compiler)
    enabled: `cmake -B builds -DCLOSURE=1`

  * Build both the asm.js and wasm libraries: `cmake --build builds`

  * Make sure they pass all automatic tests: `npm test`

  * Run the WebGL demo in examples/webgl_demo and make sure it looks
    ok, using something like `firefox examples/webgl_demo/ammo.html`
    (chrome will need a webserver as it doesn't like file:// urls)


Upstream Version
----------------

Bullet 2.82 patched with [raycast fix from 2.83](https://github.com/bulletphysics/bullet3/commit/7151865c16ba996996206e1fd7869cbb1e7edd8d)

本源码包内暂不包含可直接显示的源代码文件,请下载源码包。