Added normals to STL, but mesh is broken at some settings

This commit is contained in:
Chris Hodapp 2020-02-15 09:28:08 -05:00
parent adcfc9410c
commit 40abb2426b
2 changed files with 15 additions and 11 deletions

View File

@ -2,6 +2,8 @@
## Highest priority: ## Highest priority:
- Fix my fucked STL export at max_iters=4. Blender & Wings refuse to
load.
- Fix `OpenMesh.connect()`. - Fix `OpenMesh.connect()`.
- Continue converting `curve_horn_*`. - Continue converting `curve_horn_*`.

View File

@ -1,4 +1,3 @@
//use std::io;
use nalgebra::*; use nalgebra::*;
use std::fs::OpenOptions; use std::fs::OpenOptions;
use std::io; use std::io;
@ -66,14 +65,16 @@ impl OpenMesh {
// Turn every face into an stl_io::Triangle: // Turn every face into an stl_io::Triangle:
for i in 0..num_faces { for i in 0..num_faces {
let v0 = self.verts[self.faces[3*i + 0]].as_slice(); let v0 = self.verts[self.faces[3*i + 0]].xyz();
let v1 = self.verts[self.faces[3*i + 1]].as_slice(); let v1 = self.verts[self.faces[3*i + 1]].xyz();
let v2 = self.verts[self.faces[3*i + 2]].as_slice(); let v2 = self.verts[self.faces[3*i + 2]].xyz();
// TODO: Normals let normal = (v1-v0).cross(&(v2-v0));
triangles[i].vertices[0].copy_from_slice(&v0[0..3]);
triangles[i].vertices[1].copy_from_slice(&v1[0..3]); triangles[i].normal.copy_from_slice(&normal.as_slice());
triangles[i].vertices[2].copy_from_slice(&v2[0..3]); triangles[i].vertices[0].copy_from_slice(v0.as_slice());
triangles[i].vertices[1].copy_from_slice(v1.as_slice());
triangles[i].vertices[2].copy_from_slice(v2.as_slice());
// TODO: Is there a cleaner way to do the above? // TODO: Is there a cleaner way to do the above?
} }
@ -545,6 +546,7 @@ fn rule_to_mesh(rule: &Rule, iters_left: u32) -> (OpenMesh, u32) {
fn main() { fn main() {
// Below is so far my only example that uses entrance/exit groups:
println!("DEBUG-------------------------------"); println!("DEBUG-------------------------------");
let m = OpenMesh { let m = OpenMesh {
verts: vec![ verts: vec![
@ -595,15 +597,15 @@ fn main() {
inc = inc.transform(xform); inc = inc.transform(xform);
mesh = mesh.connect_single(&inc); mesh = mesh.connect_single(&inc);
} }
println!("mesh = {:?}", mesh); //println!("mesh = {:?}", mesh);
//try_save(&mesh, "openmesh_cube_several.obj");
} }
let r = Rule::Recurse(cube_thing_rule); let r = Rule::Recurse(cube_thing_rule);
let max_iters = 4; let max_iters = 5;
println!("Running rules..."); println!("Running rules...");
let (cubemesh, nodes) = rule_to_mesh(&r, max_iters); let (cubemesh, nodes) = rule_to_mesh(&r, max_iters);
println!("Merged {} nodes", nodes);
println!("Writing STL..."); println!("Writing STL...");
cubemesh.write_stl_file("cubemesh.stl").unwrap(); cubemesh.write_stl_file("cubemesh.stl").unwrap();