Axiom.SceneManagers.Octree.TerrainRenderable.IntersectSegment C# (CSharp) Метод

IntersectSegment() публичный Метод

public IntersectSegment ( Vector3 start, Vector3 end ) : Vector3
start Vector3
end Vector3
Результат Vector3
		public Vector3 IntersectSegment( Vector3 start, Vector3 end )
		{
			Vector3 dir = end - start;
			Vector3 ray = start;

			//special case...
			if ( dir.x == 0 && dir.z == 0 )
			{
				if ( ray.y <= GetHeightAt( ray.x, ray.z ) )
				{
					return start;
				}
			}

			dir.Normalize();

			//dir.x *= mScale.x;
			//dir.y *= mScale.y;
			//dir.z *= mScale.z;

			AxisAlignedBox box = this.BoundingBox;
			//start with the next one...
			ray += dir;

			// traverse down the ray until we are
			while ( !( ( ray.x < box.Minimum.x ) ||
				( ray.x > box.Maximum.x ) ||
				( ray.z < box.Minimum.z ) ||
				( ray.z > box.Maximum.z ) ) )
			{
				float h = GetHeightAt( ray.x, ray.z );

				if ( ray.y <= h )
				{
					return ray;
				}

				else
				{
					ray += dir;
				}
			}

			if ( ray.x < box.Minimum.x && GetNeighbor( Neighbor.West ) != null )
				return GetNeighbor( Neighbor.West ).IntersectSegment( ray, end );
			else if ( ray.z < box.Minimum.z && GetNeighbor( Neighbor.North ) != null )
				return GetNeighbor( Neighbor.North ).IntersectSegment( ray, end );
			else if ( ray.x > box.Maximum.x && GetNeighbor( Neighbor.East ) != null )
				return GetNeighbor( Neighbor.East ).IntersectSegment( ray, end );
			else if ( ray.z > box.Maximum.z && GetNeighbor( Neighbor.South ) != null )
				return GetNeighbor( Neighbor.South ).IntersectSegment( ray, end );
			else
			{
				return new Vector3( -1, -1, -1 );
			}
		}

Usage Example

Пример #1
0
        public Vector3 IntersectSegment(Vector3 start, Vector3 end)
        {
            TerrainRenderable t = GetTerrainTile(start);

            if (t == null)
            {
                return(new Vector3(-1, -1, -1));
            }
            return(t.IntersectSegment(start, end));
        }