12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- --- Mesh utilities
- -- @module mesh
- local modules = (...):gsub('%.[^%.]+$', '') .. "."
- local vec3 = require(modules .. "vec3")
- local mesh = {}
- -- vertices is an arbitrary list of vec3s
- function mesh.average(vertices)
- local out = vec3()
- for _, v in ipairs(vertices) do
- out = out + v
- end
- return out / #vertices
- end
- -- triangle[1] is a vec3
- -- triangle[2] is a vec3
- -- triangle[3] is a vec3
- function mesh.normal(triangle)
- local ba = triangle[2] - triangle[1]
- local ca = triangle[3] - triangle[1]
- return ba:cross(ca):normalize()
- end
- -- triangle[1] is a vec3
- -- triangle[2] is a vec3
- -- triangle[3] is a vec3
- function mesh.plane_from_triangle(triangle)
- return {
- origin = triangle[1],
- normal = mesh.normal(triangle)
- }
- end
- -- plane.origin is a vec3
- -- plane.normal is a vec3
- -- direction is a vec3
- function mesh.is_front_facing(plane, direction)
- return plane.normal:dot(direction) >= 0
- end
- -- point is a vec3
- -- plane.origin is a vec3
- -- plane.normal is a vec3
- -- plane.dot is a number
- function mesh.signed_distance(point, plane)
- return point:dot(plane.normal) - plane.normal:dot(plane.origin)
- end
- return mesh
|