You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

74 lines
2.2 KiB

/**
* Terrain Object Component
*
* Creates textured terrain planes for the 3D world visualization.
* Provides terrain generation with texture mapping and configurable
* dimensions and colors.
*
* @file Terrain.ts
* @author Matthew Raymer
* @created 2023-06-30
* @version 1.0.0
*/
import { PlaneGeometry, MeshLambertMaterial, Mesh, TextureLoader, Color } from "three";
/**
* Terrain class for creating textured terrain planes.
*
* This class generates terrain using Three.js PlaneGeometry with
* texture mapping. It creates a flat terrain surface that can be
* used as a base for the 3D world. The terrain includes texture
* loading and proper material setup.
*
* @class Terrain
* @author Matthew Raymer
*/
class Terrain {
/**
* Creates a new Terrain instance with the specified properties.
*
* @param props - Configuration object for terrain properties
* @param props.width - The width of the terrain plane
* @param props.height - The height of the terrain plane
* @param props.color - The base color of the terrain material
*
* @returns A Three.js Mesh object representing the terrain
*
* @example
* ```typescript
* const terrain = new Terrain({
* width: 100,
* height: 100,
* color: new Color(0x8B4513) // Brown color
* });
* scene.add(terrain);
* ```
*/
constructor(props: { width: number; height: number; color: Color }) {
const loader = new TextureLoader();
const heightTexture = loader.load("img/textures/leafy-autumn-forest-floor.jpg");
const geometry = new PlaneGeometry(props.width, props.height, 64, 64);
const material = new MeshLambertMaterial({
color: props.color,
flatShading: true,
map: heightTexture,
});
const plane = new Mesh(geometry, material);
plane.position.set(0, 0, 0);
plane.rotation.x -= Math.PI * 0.5; // Rotate to lay flat
// Storing our original vertices position on a new attribute
plane.geometry.attributes.position.originalPosition =
plane.geometry.attributes.position.array;
// Add tick method for animation compatibility
plane.tick = () => {};
return plane;
}
}
export { Terrain };