1 个不稳定版本
0.1.0 | 2024年3月5日 |
---|
#1240 在 算法 中
374 每月下载量
在 6 个 crate 中使用(直接使用2个)
25KB
468 行
uvgen
uvgen是三平面纹理坐标生成器和打包器。该crate可用于生成用于光图的第二纹理坐标以及任何需要自动生成纹理坐标的地方。此crate会自动将所有内容打包到一个图集中。
lib.rs
:
UV映射生成器。用于生成光图的第二纹理坐标。
当前实现使用简单的三平面映射。
示例
#[derive(Copy, Clone, Debug, Default, PartialEq)]
pub struct Vertex {
pub position: Vector3<f32>,
pub tex_coord: Vector2<f32>,
}
impl Vertex {
fn new(x: f32, y: f32, z: f32) -> Self {
Self {
position: Vector3::new(x, y, z),
tex_coord: Default::default(),
}
}
}
// Create cube geometry.
let mut vertices = vec![
Vertex::new(-0.5, -0.5, 0.5),
Vertex::new(-0.5, 0.5, 0.5),
Vertex::new(0.5, 0.5, 0.5),
Vertex::new(0.5, -0.5, 0.5),
Vertex::new(-0.5, -0.5, -0.5),
Vertex::new(-0.5, 0.5, -0.5),
Vertex::new(0.5, 0.5, -0.5),
Vertex::new(0.5, -0.5, -0.5),
];
let mut triangles = vec![
// Front
[2, 1, 0],
[3, 2, 0],
// Back
[4, 5, 6],
[4, 6, 7],
// Right
[7, 6, 2],
[2, 3, 7],
// Left
[0, 1, 5],
[0, 5, 4],
// Top
[5, 1, 2],
[5, 2, 6],
// Bottom
[3, 0, 4],
[7, 3, 4],
];
let patch = uvgen::generate_uvs(
vertices.iter().map(|v| v.position),
triangles.iter().cloned(),
0.005,
).unwrap();
// Apply patch to the initial data.
triangles = patch.triangles;
for &vertex_index in &patch.additional_vertices {
let vertex = vertices[vertex_index as usize];
vertices.push(vertex);
}
// Assign generated texture coordinates.
for (vertex, tex_coord) in vertices.iter_mut().zip(&patch.second_tex_coords) {
vertex.tex_coord = *tex_coord;
}
依赖项
~3MB
~59K SLoC