1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
// Задача: изградете селище с различни по размер
// къщи, ориентирани в една от две перпендикулярни
// посоки, като добавете и мъгла, така че да са
// замъглени най-отдалечените къщи
var renderer = new THREE.WebGLRenderer( {antialias: true} );
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.setAnimationLoop( drawFrame );
document.body.appendChild( renderer.domElement );
var scene = new THREE.Scene();
scene.background = new THREE.Color( 'tan' );
var aspect = window.innerWidth/window.innerHeight;
var camera = new THREE.PerspectiveCamera( 30, aspect );
camera.position.set( 0, 15, 100 );
camera.lookAt( new THREE.Vector3() );
const N = 200;
const MAXX = 120;
const MAXZ = 120;
const MINSCALE = 0.5;
const MAXSCALE = 2.0;
function randBetween(a, b) {
return Math.random() * (b - a) + a;
}
scene.fog = new THREE.FogExp2('tan', 0.008);
// профил на къща
var shape = new THREE.Shape();
shape.moveTo( 2, 0 );
shape.lineTo( 2, 4 );
shape.lineTo( 2.5, 4 );
shape.lineTo( 0, 6 );
shape.lineTo(-2.5, 4 );
shape.lineTo( -2, 4 );
shape.lineTo( -2, 0 );
shape.lineTo( 2, 0 );
// създаване на къщата като изтòчен обект
var extrudeSettings = { depth: 6, bevelEnabled: true, bevelSegments: 2, steps: 2, bevelSize: 0.1, bevelThickness: 0.1 };
var geometry = new THREE.ExtrudeGeometry( shape, extrudeSettings );
// къща
var house = new THREE.Mesh( geometry, new THREE.MeshPhongMaterial() );
for (var i = 0; i < N; i++) {
house.rotation.y = (Math.random() > 0.5) ? 0 : Math.PI / 2;
house.position.x = randBetween(-MAXX, MAXX);
house.position.z = randBetween(-MAXZ, MAXZ);
house.scale.set(randBetween(MINSCALE, MAXSCALE), randBetween(MINSCALE, MAXSCALE), randBetween(MINSCALE, MAXSCALE))
scene.add( house.clone() );
}
// светлини
light1 = new THREE.PointLight( 'orange', 0.5 );
light1.position.set( 20, 40, 0 );
scene.add( light1 );
light3 = new THREE.PointLight( 'red', 0.5 );
light3.position.set( -20, 40, 0 );
scene.add( light3 );
light2 = new THREE.PointLight();
light2.position.set( 0, -50, 100 );
scene.add( light2 );
function drawFrame()
{
scene.rotation.y += 0.003;
renderer.render( scene, camera );
}
|