[orx-mesh] Add method to compute 3D position from barycentric coordinates, IIndexedPolygon.position
This commit is contained in:
@@ -10,6 +10,26 @@ internal fun <T : LinearType<T>> bc(barycentric: Vector3, items: List<T>): T {
|
|||||||
return (items[0] * barycentric.x) + (items[1] * barycentric.y) + (items[2] * barycentric.z)
|
return (items[0] * barycentric.x) + (items[1] * barycentric.y) + (items[2] * barycentric.z)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computes the 3D position of a point in a polygon using barycentric coordinates.
|
||||||
|
*
|
||||||
|
* The method retrieves the positions of the vertices associated with this polygon
|
||||||
|
* from the provided vertex data. Using the given barycentric coordinates, it calculates
|
||||||
|
* the weighted combination of the vertex positions.
|
||||||
|
*
|
||||||
|
* @param vertexData The vertex data containing the positions of the polygon's vertices.
|
||||||
|
* @param barycentric A vector representing the barycentric coordinates, used to describe
|
||||||
|
* the relative position within the polygon.
|
||||||
|
* @return A 3D vector representing the position in the polygon corresponding to the given
|
||||||
|
* barycentric coordinates.
|
||||||
|
* @throws IllegalArgumentException If the polygon does not have exactly 3 position indices.
|
||||||
|
* @throws IllegalStateException If the polygon's positions list is empty.
|
||||||
|
*/
|
||||||
|
fun IIndexedPolygon.position(vertexData: IVertexData, barycentric: Vector3): Vector3 {
|
||||||
|
require(positions.size == 3)
|
||||||
|
val positions = vertexData.positions.slice(positions)
|
||||||
|
return if (positions.isNotEmpty()) bc(barycentric, positions) else error("No positions")
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Computes a `Point` by interpolating vertex attributes from a 3D polygon using
|
* Computes a `Point` by interpolating vertex attributes from a 3D polygon using
|
||||||
|
|||||||
Reference in New Issue
Block a user