最新代码
This commit is contained in:
53
public/sdk/three/jsm/geometries/ConvexGeometry.js
Normal file
53
public/sdk/three/jsm/geometries/ConvexGeometry.js
Normal file
@ -0,0 +1,53 @@
|
||||
import {
|
||||
BufferGeometry,
|
||||
Float32BufferAttribute
|
||||
} from 'three';
|
||||
import { ConvexHull } from '../math/ConvexHull.js';
|
||||
|
||||
class ConvexGeometry extends BufferGeometry {
|
||||
|
||||
constructor( points = [] ) {
|
||||
|
||||
super();
|
||||
|
||||
// buffers
|
||||
|
||||
const vertices = [];
|
||||
const normals = [];
|
||||
|
||||
const convexHull = new ConvexHull().setFromPoints( points );
|
||||
|
||||
// generate vertices and normals
|
||||
|
||||
const faces = convexHull.faces;
|
||||
|
||||
for ( let i = 0; i < faces.length; i ++ ) {
|
||||
|
||||
const face = faces[ i ];
|
||||
let edge = face.edge;
|
||||
|
||||
// we move along a doubly-connected edge list to access all face points (see HalfEdge docs)
|
||||
|
||||
do {
|
||||
|
||||
const point = edge.head().point;
|
||||
|
||||
vertices.push( point.x, point.y, point.z );
|
||||
normals.push( face.normal.x, face.normal.y, face.normal.z );
|
||||
|
||||
edge = edge.next;
|
||||
|
||||
} while ( edge !== face.edge );
|
||||
|
||||
}
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { ConvexGeometry };
|
Reference in New Issue
Block a user