/// <summary> /// /// </summary> public override void ComputeBoundingSphere() { var box = new Box3(); if (this.BoundingSphere == null) { this.BoundingSphere = new Sphere(); } var bufferAttribute = this.Attributes["position"] as BufferAttribute<float>; Debug.Assert(null != bufferAttribute); var positions = bufferAttribute.Array; if (null != positions) { box.MakeEmpty(); var center = this.BoundingSphere.Center; for ( var i = 0; i < positions.Length; i += 3 ) { var vector = new Vector3(positions[i], positions[i + 1], positions[i + 2]); box.ExpandByPoint(vector); } box.Center(center); // hoping to find a boundingSphere with a radius smaller than the // boundingSphere of the boundingBox: sqrt(3) smaller in the best case var maxRadiusSq = float.NegativeInfinity; for ( var i = 0; i < positions.Length; i += 3 ) { var vector = new Vector3(positions[i], positions[i + 1], positions[i + 2]); maxRadiusSq = Math.Max(maxRadiusSq, center.DistanceToSquared(vector)); } this.BoundingSphere.Radius = (float)Math.Sqrt(maxRadiusSq); //if () //{ // Trace.TraceError( "BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The 'position' attribute is likely to have NaN values." ); //} } }
public void Update() { box = Box3.FromObject(o); Scale = box.Size(); Position = box.Center(); }