generated from krampus/template-godot4
26 lines
864 B
GDScript
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)
|