Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/sebcrozet/kiss3d

Keep it simple, stupid 3d graphics engine for Rust.
https://github.com/sebcrozet/kiss3d

Last synced: 1 day ago
JSON representation

Keep it simple, stupid 3d graphics engine for Rust.

Awesome Lists containing this project

README

        

# Kiss3d

[![Crates.io](https://img.shields.io/crates/v/kiss3d.svg)](https://crates.io/crates/kiss3d)
[![Docs](https://docs.rs/kiss3d/badge.svg)](https://docs.rs/kiss3d)
[![License](https://img.shields.io/crates/l/kiss3d)](https://github.com/sebcrozet/kiss3d)

Keep It Simple, Stupid 3d graphics engine.

This library is born from the frustration that today’s 3D
graphics library are either:

* **Too low level**: you have to write your own shaders and opening a
window takes 8 hours, 300 lines of code and 10L of coffee.
* High level, but **too hard to understand/use**: these libraries are made to
create beautiful photoreal (or close to it) animations or games.
They have many features; too many, in fact, if you just want to draw a few objects
on the screen with as little friction as possible.

**kiss3d** is not designed to be feature-complete or fast.
It is designed to let you draw simple geometric figures and play with them
with as little friction as possible.

## Features

* WASM compatible.
* Out of the box, open a window with a default arc-ball camera and a point light.
* First-person camera available as well, and user-defined cameras are possible.
* Render boxes, spheres, cones, cylinders, quads and lines simply
* Change an object's color or texture.
* Change an object's transform (we use [nalgebra](http://nalgebra.org) to do that).
* Create basic post-processing effects.

As an example, creating a scene with a red, rotating cube with a light attached
to the camera is as simple as (NOTE: this will **not** compile when targeting WASM):

```rust
extern crate kiss3d;

use kiss3d::nalgebra::{Vector3, UnitQuaternion};
use kiss3d::window::Window;
use kiss3d::light::Light;

fn main() {
let mut window = Window::new("Kiss3d: cube");
let mut c = window.add_cube(1.0, 1.0, 1.0);

c.set_color(1.0, 0.0, 0.0);

window.set_light(Light::StickToCamera);

let rot = UnitQuaternion::from_axis_angle(&Vector3::y_axis(), 0.014);

while window.render() {
c.prepend_to_local_rotation(&rot);
}
}
```

Making the same example compatible with both WASM and native platforms is slightly more complicated because **kiss3d** must control the render loop:

```rust
extern crate kiss3d;

use kiss3d::light::Light;
use kiss3d::scene::SceneNode;
use kiss3d::window::{State, Window};
use kiss3d::nalgebra::{UnitQuaternion, Vector3};

struct AppState {
c: SceneNode,
rot: UnitQuaternion,
}

impl State for AppState {
fn step(&mut self, _: &mut Window) {
self.c.prepend_to_local_rotation(&self.rot)
}
}

fn main() {
let mut window = Window::new("Kiss3d: wasm example");
let mut c = window.add_cube(1.0, 1.0, 1.0);

c.set_color(1.0, 0.0, 0.0);

window.set_light(Light::StickToCamera);

let rot = UnitQuaternion::from_axis_angle(&Vector3::y_axis(), 0.014);
let state = AppState { c, rot };

window.render_loop(state)
}
```

Some controls are handled by default by the engine (they can be overridden by the user):

* `scroll`: zoom in / zoom out.
* `left click + drag`: look around.
* `right click + drag`: translate the view point.
* `enter`: look at the origin (0.0, 0.0, 0.0).

## Compilation

You will need the last stable build of the [rust compiler](http://www.rust-lang.org)
and the official package manager: [cargo](https://github.com/rust-lang/cargo).

Simply add the following to your `Cargo.toml` file:

```
[dependencies]
kiss3d = "0.32"
```
Note: If your project already uses nalgebra, you'll need the same version used by `kiss3d`, or you may run into compatibility issues.

## Contributions
I’d love to see people improving this library for their own needs. However, keep in mind that
**kiss3d** is KISS. One-liner features (from the user point of view) are preferred.

## Acknowledgements

Thanks to all the Rustaceans for their help, and their OpenGL bindings.