grunk/src/util/geometry_tools.gd

26 lines
864 B
GDScript

class_name GeometryTools
## Utilities for specialized geometric operations.
## Transform cartesian coordinates to barycentric wrt the given triangle.
static func barycentric(p: Vector3, a: Vector3, b: Vector3, c: Vector3) -> Vector3:
var v0 := b - a
var v1 := c - a
var v2 := p - a
var d00 := v0.dot(v0)
var d01 := v0.dot(v1)
var d11 := v1.dot(v1)
var d20 := v2.dot(v0)
var d21 := v2.dot(v1)
var denom := d00 * d11 - d01 * d01
var v := (d11 * d20 - d01 * d21) / denom
var w := (d00 * d21 - d01 * d20) / denom
var u := 1.0 - v - w
return Vector3(u, v, w)
## Is the given point on the planar triangle defined by v1, v2, and v3?
static func is_in_triangle(point: Vector3, v1: Vector3, v2: Vector3, v3: Vector3) -> bool:
var bc := barycentric(point, v1, v2, v3)
return (bc.x > 0 and bc.x < 1) and (bc.y > 0 and bc.y < 1) and (bc.z > 0 and bc.z < 1)