Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ianmackenzie/elm-3d-scene
A high-level 3D rendering engine for Elm, with support for lighting, shadows, and realistic materials.
https://github.com/ianmackenzie/elm-3d-scene
3d elm hacktoberfest rendering webgl
Last synced: 5 days ago
JSON representation
A high-level 3D rendering engine for Elm, with support for lighting, shadows, and realistic materials.
- Host: GitHub
- URL: https://github.com/ianmackenzie/elm-3d-scene
- Owner: ianmackenzie
- License: mpl-2.0
- Created: 2017-03-24T21:33:20.000Z (over 7 years ago)
- Default Branch: main
- Last Pushed: 2024-04-01T21:27:57.000Z (9 months ago)
- Last Synced: 2024-12-16T20:52:51.633Z (6 days ago)
- Topics: 3d, elm, hacktoberfest, rendering, webgl
- Language: Elm
- Homepage: https://package.elm-lang.org/packages/ianmackenzie/elm-3d-scene/latest/
- Size: 13.9 MB
- Stars: 205
- Watchers: 10
- Forks: 27
- Open Issues: 58
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# elm-3d-scene
`elm-3d-scene` is a high-level Elm package for producing 3D graphics, with
support for lighting, shadows and realistic materials:![Lit scene with shadows](https://ianmackenzie.github.io/elm-3d-scene/images/1.0.0/hable-filmic-tone-mapping-bright.png)
It aims to make creating 3D graphics as easy and enjoyable as possible, without
having to worry about low-level details like shader programs and transformation
matrices. `elm-3d-scene` uses [`elm-explorations/webgl`](https://package.elm-lang.org/packages/elm-explorations/webgl/latest/)
under the hood (and therefore requires [WebGL support](https://caniuse.com/#feat=webgl)
to work), but no knowledge of WebGL is required to use this package.Any questions/feedback, please open an issue or please reach out in the
**#webgl** channel or to **@ianmackenzie** on the [Elm Slack](https://elmlang.herokuapp.com)!## Who is this for?
`elm-3d-scene` is built to support a wide range of use cases, from [simple 3D
loading spinners](https://ianmackenzie.github.io/elm-3d-scene/examples/1.0.0/animation.html)
up to [near-photorealistic scenes](https://ianmackenzie.github.io/elm-3d-scene/examples/1.0.0/duckling.html).
It is designed to be beginner-friendly with a smooth onramp to advanced features
like [shadows](https://ianmackenzie.github.io/elm-3d-scene/examples/1.0.0/multiple-shadows.html),
[HDR lighting](https://ianmackenzie.github.io/elm-3d-scene/examples/1.0.0/exposure-and-tone-mapping.html)
and [physically based materials](https://ianmackenzie.github.io/elm-3d-scene/examples/1.0.0/textured-sphere.html).
You can use `elm-3d-scene` to make:- Games
- Animations
- Visualizations
- Scientific/engineering/technical apps and more!However, if you're a WebGL guru who's comfortable with writing their own shader
programs, then `elm-3d-scene` might not (yet?) be for you - you're currently
limited to the material and lighting types that `elm-3d-scene` supports
directly. Eventually `elm-3d-scene` will likely support custom shaders in some
way (see the [roadmap](#roadmap)), but it's not there yet.## Getting started
The best way to start learning the `elm-3d-scene` API is by reading through the
[tutorial](https://github.com/ianmackenzie/elm-3d-scene/blob/master/TUTORIAL.md)
and then checking out the [examples](https://github.com/ianmackenzie/elm-3d-scene/tree/master/examples/README.md).
For more details on any type/function, the [reference documentation](https://package.elm-lang.org/packages/ianmackenzie/elm-3d-scene/latest/)
is your friend.![Duckling model](https://ianmackenzie.github.io/elm-3d-scene/images/1.0.0/textured-nonmetal-rough.png)
One important point to understand is that `elm-3d-scene` builds heavily on
several other packages, making extensive use of types and modules from:- [`avh4/elm-color`](https://package.elm-lang.org/packages/avh4/elm-color/latest/):
`Color`
- [`ianmackenzie/elm-3d-camera`](https://package.elm-lang.org/packages/ianmackenzie/elm-3d-camera/latest/):
`Camera3d` and `Viewpoint3d`
- [`ianmackenzie/elm-units`](https://package.elm-lang.org/packages/ianmackenzie/elm-units/latest/):
`Quantity`, `Length`, `Meters`, `Angle`, `Pixels`, `Luminance`, `Illuminance`,
`LuminousFlux` and `Temperature`
- [`ianmackenzie/elm-triangular-mesh`](https://package.elm-lang.org/packages/ianmackenzie/elm-triangular-mesh/latest/):
`TriangularMesh`
- [`ianmackenzie/elm-geometry`](https://package.elm-lang.org/packages/ianmackenzie/elm-geometry/latest/):
`Point3d`, `Vector3d`, `Direction3d`, `LineSegment3d`, `Triangle3d`,
`Sphere3d`, `Block3d`, `Axis3d`...basically anything ending in `3d` other
than `Camera3d` and `Viewpoint3d` =)As a result, to start using `elm-3d-scene` in your own project you will need at
least a decent understanding of those packages as well. Check out their READMEs
and reference documentation for details, but you can probably get a decent sense
of how they work by checking out the [`elm-3d-scene` examples](https://github.com/ianmackenzie/elm-3d-scene/tree/master/examples/README.md).When installing `elm-3d-scene`, you'll also want to install the above packages:
```text
elm install ianmackenzie/elm-3d-scene
elm install avh4/elm-color
elm install ianmackenzie/elm-3d-camera
elm install ianmackenzie/elm-units
elm install ianmackenzie/elm-triangular-mesh
elm install ianmackenzie/elm-geometry
```(All of the packages will get downloaded and installed automatically anyways,
since they're dependencies of `elm-3d-scene`, but you'll need to install them
explicitly in your own project so that you can use them directly.)![Table and chairs](https://ianmackenzie.github.io/elm-3d-scene/images/1.0.0/cloudy-scene.png)
## Climate action
I would like for the projects I work on to be as helpful as possible in
addressing the climate crisis. If- you are working on a project that helps address the climate crisis (clean
energy, public transit, reforestation, sustainable agriculture etc.) either as
an individual, as part of an non-profit organization or even as part of a
for-profit company, and
- there is a new feature you would find helpful for that work (or a bug you need
fixed) in any of my open-source projects, thenplease [open a new issue](https://github.com/ianmackenzie/elm-3d-scene/issues),
describe briefly what you're working on and I will treat that issue as high
priority.![Spheres and blocks](https://ianmackenzie.github.io/elm-3d-scene/images/1.0.0/point-light.png)
## Roadmap
`elm-3d-scene` has a decent number of features already, but there are many, many
more to add. Check out the [issues](https://github.com/ianmackenzie/elm-3d-scene/issues)
to get a sense of what features are planned (and add your own feature request if
there's something you'd like to see!), but some of the immediate next steps will
likely include:- Performance improvements (there are already some [improvements in the pipeline
for `elm-explorations/webgl`](https://github.com/elm-explorations/webgl/pull/28)
that will significantly improve `elm-3d-scene` performance)
- [Support for loading different model formats](https://github.com/ianmackenzie/elm-3d-scene/issues/30)
such as glTF and OBJ (likely in separate packages designed to work nicely with
`elm-3d-scene`, instead of being part of `elm-3d-scene` itself)
- Support for normal and ambient occlusion mapping (already mostly implemented
internally)
- [Improved line rendering](https://github.com/ianmackenzie/elm-3d-scene/issues/32)
- [Silhouette edges/outlined meshes](https://github.com/ianmackenzie/elm-3d-scene/issues/26)
- Some level of support for [transparent objects](https://github.com/ianmackenzie/elm-3d-scene/issues/4)
like windowsIn the longer term, I hope to add support for:
- Custom vertex and/or fragment shaders (for things like custom procedural
texturing, fancy material types or deformable meshes)
- Skeletal animation (rigging/skinning)However, these will require some significant API design and implementation work.
## Contributing
Contributions are very welcome! Here are some ideas for some that would be very
useful at this stage:- More examples to add to the `examples` directory, showing how to create
specific kinds of scenes or how to integrate `elm-3d-scene` with other
packages, such as:
- An example combining `elm-3d-scene` and [`elm-gamepad`](https://package.elm-lang.org/packages/xarvh/elm-gamepad/latest/),
perhaps using the gamepad to walk around a scene
- An example with shadows cast from a moving light source (I think something
like a point light flying in and amongst a bunch of cubes could look pretty
cool)
- Anything you think would look cool/illustrate part of the API missed by
other examples/help others understand something you struggled with
- Separate packages that parse different 3D model formats so they can be loaded
into `elm-3d-scene`, such as [OBJ](https://en.wikipedia.org/wiki/Wavefront_.obj_file),
[STL](https://en.wikipedia.org/wiki/STL_%28file_format%29) or [DAE](https://en.wikipedia.org/wiki/COLLADA).I think it makes sense for each file format to have a dedicated package
separate from `elm-3d-scene`. Ideally, I think each package should focus on
simply parsing a file into a nice Elm data structure (instead of directly into
an `elm-3d-scene` `Entity`, for example) so that the data could also be used
in other ways (custom rendering engines, 3D printing, analysis etc.).
Note that some work has already started on [GLTF](https://en.wikipedia.org/wiki/GlTF)
loading, so reach out to me (**@ianmackenzie**) on the [Elm Slack](http://elmlang.herokuapp.com/)
if that's something you're interested in working on.Once the internals of `elm-3d-scene` stabilize a bit, there will be lots more
opportunities to contribute to the core rendering engine, to add features such
as:- Textured backgrounds ([#53](https://github.com/ianmackenzie/elm-3d-scene/issues/53))
- Rectangular/polygonal light sources ([#41](https://github.com/ianmackenzie/elm-3d-scene/issues/41))
- 3D-rendered text ([#37](https://github.com/ianmackenzie/elm-3d-scene/issues/37))
- Procedural textures ([#22](https://github.com/ianmackenzie/elm-3d-scene/issues/22))
- Debug rendering options ([#21](https://github.com/ianmackenzie/elm-3d-scene/issues/21))
- Funky material types like water and ceramics ([#5](https://github.com/ianmackenzie/elm-3d-scene/issues/5))For now, though, the internals are changing rapidly enough that
coordination/collaboration on these kinds of issues would be tricky.![Physics simulation](https://ianmackenzie.github.io/elm-3d-scene/images/1.0.0/physics-background-600px.png)