vmc

Crates.iovmc
lib.rsvmc
version0.3.0
sourcesrc
created_at2023-08-11 02:56:56.179791
updated_at2023-08-17 17:03:02.044153
descriptionImplementation of Virtual Motion Capture protocol for virtual avatar tracking.
homepage
repositoryhttps://github.com/vitri-ent/vmc
max_upload_size
id941537
size120,710
Carson M. (decahedron1)

documentation

https://docs.rs/vmc

README

vmc

An asynchronous implementation of the Virtual Motion Capture Protocol in Rust.

While this crate is intended specifically for Virtual Motion Capture, it can also be used as an implementation of the Open Sound Control protocol which VMC is based on.

Examples

See examples/ for more detailed examples.

Performer

use vmc::{
	VMCApplyBlendShapes, VMCBlendShape, VMCModelState, VMCResult, VMCStandardVRMBlendShape, VMCState, VMCTime
};

#[tokio::main]
async fn main() -> VMCResult<()> {
	let socket = vmc::performer!("127.0.0.1:39539").await?;
	loop {
		socket
			.send(VMCBlendShape::new(VMCStandardVRMBlendShape::Joy, 1.0))
			.await?;
		socket.send(VMCApplyBlendShapes).await?;
		socket.send(VMCState::new(VMCModelState::Loaded)).await?;
		socket.send(VMCTime::elapsed()).await?;
	}
}

Marionette

use tokio_stream::StreamExt;
use vmc::{VMCMessage, VMCResult};

#[tokio::main]
async fn main() -> VMCResult<()> {
	let mut socket = vmc::marionette!("127.0.0.1:39539").await?;
	while let Some(packet) = socket.next().await {
		let (packet, _) = packet?;
		for message in vmc::parse(packet)? {
			match message {
				VMCMessage::BoneTransform(transform) => {
					println!("\tTransform bone: {} (pos {:?}; rot {:?})", transform.bone, transform.position, transform.rotation)
				}
				_ => {}
			}
		}
	}

	Ok(())
}

License

❤️ This package is based on rosc by Andreas Linz and async-osc by Franz Heinzmann. Licensed under MIT License or Apache-2.0.

Commit count: 8

cargo fmt