diff options
| Commit | fa19b7caa1fb0a3127d24ce5f689d1a39f8e05af (patch) | |
|---|---|---|
| Author | 2022-11-08 16:26:37 +0200 | |
| Committer | 2022-11-08 16:26:37 +0200 | |
| Files | b97de80f81c4c33890995773da86c161355e5397 | |
| uni-projects-fa19b7caa1fb0a3127d24ce5f689d1a39f8e05af.tar uni-projects-fa19b7caa1fb0a3127d24ce5f689d1a39f8e05af.tar.gz uni-projects-fa19b7caa1fb0a3127d24ce5f689d1a39f8e05af.zip | ||
| Parent | de44ffda470905c350a1edb4bce4f0107f1d7742 (diff) | |
[OKG/HW05] Solved homework and added CSG shortcut
2 files changed, 153 insertions, 0 deletions
| l--------- | Year 2/Computer Graphics Fundamentals/Practicum Homework/CSG.js | 1 | ||||
| -rw-r--r-- | Year 2/Computer Graphics Fundamentals/Practicum Homework/a05.html | 152 |
diff --git a/Year 2/Computer Graphics Fundamentals/Practicum Homework/CSG.js b/Year 2/Computer Graphics Fundamentals/Practicum Homework/CSG.js new file mode 120000 index 0000000..dccc44c --- /dev/null +++ b/Year 2/Computer Graphics Fundamentals/Practicum Homework/CSG.js @@ -0,0 +1 @@ +../CSG.js
\ No newline at end of file diff --git a/Year 2/Computer Graphics Fundamentals/Practicum Homework/a05.html b/Year 2/Computer Graphics Fundamentals/Practicum Homework/a05.html new file mode 100644 index 0000000..adc94fa --- /dev/null +++ b/Year 2/Computer Graphics Fundamentals/Practicum Homework/a05.html @@ -0,0 +1,152 @@ +<html>
+ <head>
+ <style>
+ body { margin: 0; }
+ canvas { width: 100%; height: 100% }
+ </style>
+ </head>
+ <body>
+ <script src="three.min.js"></script>
+ <script src="CSG.js"></script>
+ <script>
+ var renderer = new THREE.WebGLRenderer();
+ renderer.setSize( window.innerWidth, window.innerHeight );
+ renderer.setAnimationLoop( drawFrame );
+ renderer.shadowMap.enabled = true;
+ renderer.shadowMap.type = THREE.PCFSoftShadowMap;
+ document.body.appendChild( renderer.domElement );
+
+ var scene = new THREE.Scene();
+
+ var aspect = window.innerWidth/window.innerHeight;
+ var camera = new THREE.PerspectiveCamera( 30, aspect );
+ camera.position.set( 2, 1.5, 0 );
+ camera.lookAt( new THREE.Vector3(0, 0.35, 0) );
+
+
+
+ var garden = new THREE.Group();
+
+ /*
+ * Ground
+ */
+
+ const groundSize = 10;
+ var groundPlatform = new THREE.Mesh(new THREE.BoxGeometry(groundSize, 0.1, groundSize), new THREE.MeshPhongMaterial({ color: 0x5bab3a }));
+ groundPlatform.receiveShadow = true;
+ groundPlatform.position.y = -0.05;
+ garden.add(groundPlatform);
+
+ /*
+ * Trees
+ */
+
+ const treeHeight = 1;
+ const treeLeafsRadius = 0.18;
+ const treeRadius = 0.11;
+ const treeSegments = 12;
+ const treeRootRadius = 0.15;
+
+ var trunkMaterial = new THREE.MeshPhongMaterial({color: 0x5d3b0b});
+ var leafMaterial = new THREE.MeshPhongMaterial({color: 0x526E2A });
+ trunkMaterial.flatShading = leafMaterial.flatShading = true; // Изглежда по-добре така според мене
+
+ var treeCSG = new CSG();
+
+ // Trunk
+ var roots = new THREE.Mesh(new THREE.CylinderGeometry(treeRadius, treeRootRadius, treeHeight * 0.05, treeSegments));
+ roots.position.y = treeHeight * 0.025
+
+ var bottomHalfTrunk = new THREE.Mesh(new THREE.CylinderGeometry(treeRadius * 0.8, treeRadius, treeHeight * 0.45, treeSegments));
+ bottomHalfTrunk.position.y = treeHeight * 0.05 + treeHeight * 0.225;
+
+ var topHalfTrunk = new THREE.Mesh(new THREE.CylinderGeometry(treeRadius, treeRadius * 0.8, treeHeight * 0.1, treeSegments));
+ topHalfTrunk.position.y = treeHeight * 0.05 + treeHeight * 0.45 + treeHeight * 0.05;
+
+ treeCSG.union([roots, bottomHalfTrunk, topHalfTrunk]);
+ var tree = treeCSG.toMesh();
+ tree.material = trunkMaterial;
+
+ // Leafs
+ var leafs = new THREE.Mesh(new THREE.SphereGeometry(treeLeafsRadius, treeSegments, treeSegments), leafMaterial);
+ leafs.position.y = treeHeight * 0.05 + treeHeight * 0.45 + treeHeight * 0.1 + treeLeafsRadius / 2;
+ tree.add(leafs);
+
+ tree.castShadow = leafs.castShadow = true;
+
+ // Positioning
+ tree.position.z = -0.5;
+ garden.add(tree);
+
+ var secondTree = tree.clone();
+ secondTree.position.z = 0.5;
+ garden.add(secondTree);
+
+ /*
+ * Hammock
+ */
+
+ var hammockMaterial = new THREE.MeshPhongMaterial({ color: 'red' });
+ hammockMaterial.flatShading = true;
+
+ var topCylinder = new THREE.Mesh(new THREE.CylinderGeometry(1, 1, 0.2, 64));
+ var minusBox = new THREE.Mesh(new THREE.BoxGeometry(2, 2, 2));
+ minusBox.position.x = 0.075;
+ var minusCylinder = new THREE.Mesh(new THREE.CylinderGeometry(1, 1, 0.2, 64));
+ minusCylinder.position.x = 0.01;
+
+ var hammockCSG = new CSG();
+ hammockCSG.subtract([topCylinder, minusBox, minusCylinder]);
+
+ var hammock = hammockCSG.toMesh();
+ hammock.material = hammockMaterial;
+ hammock.position.y = 1.15;
+ hammock.rotation.z = Math.PI / 2;
+
+ hammock.castShadow = true;
+ garden.add(hammock);
+
+ var strings = [
+ new THREE.Vector3(-0.09, 0.225, -0.37), new THREE.Vector3(0, 0.28, -0.41),
+ new THREE.Vector3(-0.07, 0.225, -0.37), new THREE.Vector3(0, 0.28, -0.41),
+ new THREE.Vector3(-0.05, 0.225, -0.37), new THREE.Vector3(0, 0.28, -0.41),
+ new THREE.Vector3(-0.03, 0.225, -0.37), new THREE.Vector3(0, 0.28, -0.41),
+ new THREE.Vector3( 0 , 0.225, -0.37), new THREE.Vector3(0, 0.28, -0.41),
+ new THREE.Vector3( 0.03, 0.225, -0.37), new THREE.Vector3(0, 0.28, -0.41),
+ new THREE.Vector3( 0.05, 0.225, -0.37), new THREE.Vector3(0, 0.28, -0.41),
+ new THREE.Vector3( 0.07, 0.225, -0.37), new THREE.Vector3(0, 0.28, -0.41),
+ new THREE.Vector3( 0.09, 0.225, -0.37), new THREE.Vector3(0, 0.28, -0.41),
+
+ new THREE.Vector3(0, 0.28, 0.41), new THREE.Vector3(-0.09, 0.225, 0.37),
+ new THREE.Vector3(0, 0.28, 0.41), new THREE.Vector3(-0.07, 0.225, 0.37),
+ new THREE.Vector3(0, 0.28, 0.41), new THREE.Vector3(-0.05, 0.225, 0.37),
+ new THREE.Vector3(0, 0.28, 0.41), new THREE.Vector3(-0.03, 0.225, 0.37),
+ new THREE.Vector3(0, 0.28, 0.41), new THREE.Vector3( 0 , 0.225, 0.37),
+ new THREE.Vector3(0, 0.28, 0.41), new THREE.Vector3( 0.03, 0.225, 0.37),
+ new THREE.Vector3(0, 0.28, 0.41), new THREE.Vector3( 0.05, 0.225, 0.37),
+ new THREE.Vector3(0, 0.28, 0.41), new THREE.Vector3( 0.07, 0.225, 0.37),
+ new THREE.Vector3(0, 0.28, 0.41), new THREE.Vector3( 0.09, 0.225, 0.37),
+ ];
+ var hammockStrings = new THREE.LineSegments(new THREE.BufferGeometry().setFromPoints(strings), new THREE.LineBasicMaterial({color: 'white'}));
+ garden.add(hammockStrings);
+
+ scene.add(garden);
+
+
+ var sun = new THREE.DirectionalLight(0xE3A857);
+ sun.position.set( 3, 1.5, -3 );
+ sun.target = groundPlatform;
+ sun.castShadow = true;
+ scene.add( sun );
+
+ var ambient = new THREE.AmbientLight(0xffffff, 0.5);
+ scene.add(ambient);
+
+ function drawFrame()
+ {
+ scene.rotation.y += 0.005;
+ renderer.render( scene, camera );
+ }
+ </script>
+ </body>
+</html>
|
