ආයුබෝවන් යාලුවනේ! 👋 අද අපි පටන් ගන්න යන්නේ සුපිරිම වැඩක්! ඔයාලා කවදා හරි හිතුවද Websites වල එහෙම 3D දේවල් දාලා, Interactive දේවල් කරන්න තිබ්බනම් කොහොමද කියලා? 🤔 අන්න ඒ වැඩේට පාවිච්චි කරන නියම JavaScript library එකක් තමයි Three.js කියන්නේ. 🚀
මේ Lesson Series එකෙන් අපි මුල ඉඳන් සරලව Three.js ඉගෙන ගමු. මේක පළවෙනි කොටස. අපි අද බලමු Three.js වලින් පොඩි වැඩක් කරගන්නේ කොහොමද කියලා. Ready ද? 😎
🧐 මොකක්ද මේ Three.js කියන්නේ?
සරලවම කිව්වොත්, Three.js කියන්නේ ඔයාගේ Web Browser එකේ 3D graphics (ත්රිමාණ ග්රැෆික්ස්) හදන්න, පෙන්නන්න උදව් කරන JavaScript library එකක්. 👨💻 WebGL කියන තාක්ෂණය පාවිච්චි කරලා තමයි මේක වැඩ කරන්නේ. ඒත් WebGL කෙලින්ම පාවිච්චි කරනවට වඩා Three.js එක්ක වැඩ කරන එක හුඟක් ලේසියි, ඉක්මන්. 😉 Three.js එක හදලා තියෙන්නේ Ricardo Cabello (Mr.doob) කියලා කෙනෙක්. අද වෙද්දි ලොකු developer community එකක් මේකට දායක වෙනවා.
🤔 ඇයි Three.js පාවිච්චි කරන්නේ?
🛠️ අපි වැඩේට බහිමු! පළවෙනි Scene එක හදමු!
හරි, දැන් කතා ඇති. Code කරන්න වෙලාව! 💪 පොඩි ත්රිමාණ කියුබ් එකක් හදලා ඒක කරකවමු.
1. මුලික Setup එක: HTML File එක
මුලින්ම අපිට HTML file එකක් ඕනේ. ඔයා කැමති Code Editor එකක් (VS Code, Sublime Text වගේ) open කරලා, අලුත් file එකක් හදලා index.html
කියලා save කරගන්න. ඒකට මේ code එක දාන්න:
HTML
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>මගේ පළවෙනි Three.js Scene එක! ✨</title> <style> /* මේ CSS ටිකෙන් වෙන්නේ page එකේ අනවශ්ය margins අයින් කරලා, අපේ 3D content එක දාන canvas එක මුළු screen එකම ගන්න හදන එක */ body { margin: 0; overflow: hidden; } /* Page margin අයින් කරනවා, scroll bars හංගනවා */ canvas { display: block; } /* Canvas එක block element එකක් කරනවා */ </style> </head> <body> <script type="importmap"> { "imports": { "three": "https://unpkg.com/three@0.163.0/build/three.module.js", "three/addons/": "https://unpkg.com/three@0.163.0/examples/jsm/" } } </script> <script type="module"> // අපේ Three.js මැජික් එක මෙතනින් පටන් ගන්නේ! 🪄 import * as THREE from 'three'; // මෙතන ඉඳන් අපි අනිත් කෝඩ් ටික ලියමු... console.log("Three.js ලෝඩ් උනා! 🎉"); // --- Scene, Camera, Renderer හදන තැන --- // --- Geometry, Material, Mesh හදන තැන --- // --- Animation Loop එක හදන තැන --- </script> </body> </html>
👀 මොකක්ද මේ importmap කියන්නේ?
මේක browser එකට කියනවා "three" කියලා code එකේ කොහේ හරි import කරොත්, අර දීලා තියෙන URL එකෙන් ඒ module එක load කරගන්න කියලා. මේක JavaScript modules පාවිච්චි කරන නූතන ක්රමයක්. අර URL එකේ version number එක (0.163.0) තියෙන එකෙන් අපි පාවිච්චි කරන්නේ Three.js වල අලුත්ම version වලින් එකක් කියලත් sure කරගන්නවා (මේ ලියන වෙලාවේ අලුත් version එකක්).
2. ප්රධාන අංග 3: Scene, Camera, Renderer
Three.js වලින් මොනවා හරි ත්රිමාණව පෙන්නන්න නම් අපිට අත්යවශ්යම components 3ක් තියෙනවා:
PerspectiveCamera
එක. ඒකෙන් මිනිස් ඇහැ දකින විදියටම දුර වැඩිවෙද්දි ವಸ್ತು කුඩාවට පේනවා.<canvas>
element එක උඩ අපේ 3D රූපය මවන්නේ.දැන් මේ තුන JavaScript code එකෙන් හදමු (<script type="module">
tag එක ඇතුලේ):
JavaScript
// ... (import line එකට පස්සේ) // 1. Scene එක හදමු 🎬 const scene = new THREE.Scene(); // Scene එකට පොඩි background පාටක් දාමු, නැත්නම් කළු පාටයි scene.background = new THREE.Color(0xaaaaaa); // ලා අළු පාටක් (Hex color code) // 2. Camera එක හදමු 📸 // PerspectiveCamera( fov, aspect, near, far ) // fov (Field of View): කොච්චර පළල කෝණයකින්ද බලන්නේ (සාමාන්යෙන් 50-75 degrees) // aspect (Aspect Ratio): දර්ශනයේ පළල / උස අනුපාතය (බොහෝවිට browser window එකේ අනුපාතය) // near: කැමරාවට කොච්චර ලඟින් තියෙන දේවල් පේන්න පටන් ගන්නවද? (මේකට වඩා ලඟ ඒවා පේන්නේ නෑ) // far: කැමරාවට කොච්චර දුරින් තියෙන දේවල් පේනවද? (මේකට වඩා දුර ඒවා පේන්නේ නෑ) const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); // කැමරාව z-අක්ෂය දිගේ ටිකක් පිටිපස්සට ගමු (default එකට (0,0,0) වල තියෙන්නේ) camera.position.z = 5; // 3. Renderer එක හදමු 🖼️ // WebGLRenderer එක තමයි අපි සාමාන්යෙන් පාවිච්චි කරන්නේ GPU acceleration එක්ක render කරන්න. const renderer = new THREE.WebGLRenderer({ antialias: true }); // antialias දැම්මම edges ටිකක් smooth වෙනවා // Renderer එකේ size එක browser window එකේ size එකටම සෙට් කරමු renderer.setSize( window.innerWidth, window.innerHeight ); // Renderer එකෙන් හදන HTML <canvas> element එක අරගෙන අපේ HTML document එකේ body එකට එකතු කරමු document.body.appendChild( renderer.domElement );
🥳 හුරේ! අපි මූලික අංග ටික හදාගත්තා! දැන් අපේ Scene එක තියෙනවා, බලන්න Camera එකක් තියෙනවා, ඒක පෙන්නන්න Renderer එකක් තියෙනවා. ඒත්... Scene එක හිස් නේද? 😟 තාම මොකුත් පේන්නේ නෑ.
3. අපේ පළවෙනි 3D Object එක! (කියුබ් එකක් හදමු 🧊)
දැන් තමයි විනෝදම කොටස! අපි Scene එකට ත්රිමාණ වස්තුවක් එකතු කරමු. මේකට අපිට දේවල් තුනක් ඕනේ:
BoxGeometry
, SphereGeometry
, PlaneGeometry
etc.).MeshBasicMaterial
, MeshLambertMaterial
, MeshPhongMaterial
, MeshStandardMaterial
etc.). අපි මුලින්ම පාවිච්චි කරන්නේ MeshBasicMaterial
එක. මේකට Scene එකේ Lights (ආලෝකය) අවශ්ය නෑ, නිකන්ම ඒ පාට පේනවා.දැන් මේ ටිකත් Code එකට දාමු:
JavaScript
// ... (Renderer හදපු code එකට පස්සේ) // 4. Geometry (හැඩය) හදමු 📐 // BoxGeometry( width, height, depth ) const geometry = new THREE.BoxGeometry( 1, 1, 1 ); // හැම පැත්තම unit 1ක් දිග කියුබ් එකක් // 5. Material (පාට/පෙනුම) හදමු 🎨 // MeshBasicMaterial එකට color property එකක් දෙන්න පුලුවන් const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); // කොළ පාට (Hex: 0xRRGGBB) // 6. Mesh එක හදමු (Geometry + Material) 🧊 const cube = new THREE.Mesh( geometry, material ); // 7. Mesh (කියුබ්) එක Scene එකට එකතු කරමු 🎬 + 🧊 // scene.add() function එකෙන් objects scene එකට දාන්න පුලුවන් scene.add( cube );
✅ නියමයි! දැන් අපේ Scene එකේ කොළ පාට කියුබ් එකක් තියෙනවා. ඒත් තාම අපිට ඒක පේන්නේ නෑ... 🤔 ඇයි ඒ? මොකද අපි Renderer එකට කිව්වේ නෑ "මේ Scene එක මේ Camera එකෙන් බලලා අඳින්න" කියලා.
4. Render කරමු! (Scene එක තිරයේ අඳිමු!)
අපි Renderer එක හැදුවට, එයාට render කරන්න කියලා කියන්න ඕනේ. ඒකට renderer.render()
function එක call කරන්න ඕනේ, Scene එකයි Camera එකයි parameters විදියට දීලා.
JavaScript
// ... (scene.add(cube) line එකට පස්සේ) // 8. Scene එක Render කරමු 🖼️👀 // මේ line එක එක පාරක් run උනොත්, ඒ මොහොතේ තියෙන විදියට scene එක ඇඳලා නතර වෙනවා. // renderer.render( scene, camera ); // <-- අපි මේක animation loop එක ඇතුලට දාමු
අපි මේ render()
call එක එකපාරක් දැම්මොත්, page එක load වෙද්දි එක frame එකක් render වෙලා නවතීවි. අපිට ඕනේ කියුබ් එක කරකවන්න නිසා, අපි මේක දිගටම වෙනස් වෙන Scene එක render කරන්න ඕනේ. ඒකට තමයි Animation Loop එක!
5. Animation Loop එක! (ජීවය දෙමු!) 🔄
Static කියුබ් එකක් බලන් ඉන්නවාට වඩා ඒක චලනය වෙනවා දකින්න ආසයිනේ? 😅 මේකට අපිට ඕනේ Animation Loop එකක්. මේකෙන් වෙන්නේ දිගටම, තත්පරේකට කීප වතාවක් (සාමාන්යෙන් තත්පරයට රාමු 60ක් - 60fps) මේ දේවල් කරන එක:
මේක කරන්න JavaScript වල requestAnimationFrame()
කියලා function එකක් තියෙනවා. මේකෙන් browser එකට කියනවා "ඔයා ඊලඟ frame එක අඳින්න ලෑස්ති උනාම, මම දෙන මේ function එක call කරන්න" කියලා. මේක setInterval()
වලට වඩා animation වලට සුදුසුයි, මොකද browser එක optimize කරලා performace සහ battery life එක ගැන බලනවා.
JavaScript
// ... (scene.add(cube) line එකට පස්සේ) // 9. Animation Loop එක හදමු 🔄 function animate() { // ඊලඟ frame එක redraw කරන්න කලින් මේ animate function එක ආයේ call කරන්න request කරනවා requestAnimationFrame( animate ); // මෙතන තමයි අපි හැම frame එකකම update කරන්න ඕන දේවල් දාන්නේ // කියුබ් එක කරකවමු! 💫 // object.rotation එකේ x, y, z අක්ෂ වටා rotation එක radians වලින් තියෙන්නේ cube.rotation.x += 0.01; // X අක්ෂය වටා පොඩ්ඩ පොඩ්ඩ කරකවමු cube.rotation.y += 0.01; // Y අක්ෂය වටාත් පොඩ්ඩ පොඩ්ඩ කරකවමු // Scene එක හැම frame එකකම අලුත් විදියට render කරමු renderer.render( scene, camera ); } // Animation loop එක පටන් ගමු! මේක call කරේ නැත්නම් මුකුත් වෙන්නේ නෑ. animate();
දැන් ඔයා ඔයාගේ index.html
file එක browser එකේ open කරලා බලන්න! 🎉 ඔව්! ඔයාට පේන්න ඕනේ අළු පාට Background එකේ ලස්සනට කැරකෙන කොළ පාට කියුබ් එකක්! 🤩 මේ ඔයාගේ පළවෙනි, ජීවය තියෙන Three.js නිර්මාණය! සුභ පැතුම්! 🥳
Bonus: Window Resize Handling (Responsive කිරීම)
Browser window එක resize කරොත් මොකද වෙන්නේ? අපේ කියුබ් එක හිරවෙලා, කැත වෙලා පේයි. මොකද Camera එකේ Aspect Ratio එකයි, Renderer එකේ Size එකයි update වෙන්නේ නෑ. ඒකටත් පොඩි code කෑල්ලක් දාමු.
JavaScript
// ... (animate function එකට කලින් හෝ පස්සේ දාන්න) // Browser window එක resize කරනකොට මේ function එක call වෙන්න හදමු window.addEventListener('resize', onWindowResize, false); function onWindowResize() { // Camera එකේ aspect ratio එක අලුත් window size එකට අනුව update කරමු camera.aspect = window.innerWidth / window.innerHeight; // Camera එකේ projection matrix එක update කරන්න ඕනේ aspect ratio වෙනස් උනාම camera.updateProjectionMatrix(); // Renderer එකේ size එකත් අලුත් window size එකට update කරමු renderer.setSize(window.innerWidth, window.innerHeight); }
දැන් browser window එක resize කරලා බලන්න. හැමදේම ලස්සනට adjust වෙනවා නේද? 😉
සම්පූර්ණ Code එක:
HTML
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>මගේ පළවෙනි Three.js Scene එක! ✨</title> <style> body { margin: 0; overflow: hidden; } canvas { display: block; } </style> </head> <body> <script type="importmap"> { "imports": { "three": "https://unpkg.com/three@0.163.0/build/three.module.js", "three/addons/": "https://unpkg.com/three@0.163.0/examples/jsm/" } } </script> <script type="module"> import * as THREE from 'three'; console.log("Three.js ලෝඩ් උනා! 🎉"); // 1. Scene 🎬 const scene = new THREE.Scene(); scene.background = new THREE.Color(0xaaaaaa); // ලා අළු background // 2. Camera 📸 const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); camera.position.z = 5; // කැමරාව ටිකක් පිටිපස්සට // 3. Renderer 🖼️ const renderer = new THREE.WebGLRenderer({ antialias: true }); // antialias for smoother edges renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); // Add canvas to HTML // 4. Geometry 📐 (The shape) const geometry = new THREE.BoxGeometry( 1.5, 1.5, 1.5 ); // ටිකක් ලොකු කියුබ් එකක් // 5. Material 🎨 (The appearance) const material = new THREE.MeshBasicMaterial( { color: 0x0077ff, wireframe: false } ); // නිල් පාට, wireframe: true කරලා බලන්න // 6. Mesh 🧊 (Combine Geometry and Material) const cube = new THREE.Mesh( geometry, material ); // 7. Add cube to Scene 🎬 + 🧊 scene.add( cube ); // Responsive Design: Handle window resize window.addEventListener('resize', onWindowResize, false); function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); } // 9. Animation Loop 🔄 function animate() { requestAnimationFrame( animate ); // Request next frame // Rotate the cube cube.rotation.x += 0.005; cube.rotation.y += 0.005; // cube.rotation.z += 0.001; // Z අක්ෂය වටාත් කරකවලා බලන්න // Render the scene with the camera renderer.render( scene, camera ); } // Start the animation loop! animate(); </script> </body> </html>
අදට ඇති වගේ නේද? 😉
සුභ පැතුම්! ඔයා Three.js වලින් ඔයාගේ පළවෙනි ත්රිමාණ දර්ශනය නිර්මාණය කරලා, ඒකට චලනයකුත් එකතු කලා! මේක තමයි Three.js ගමනේ පළවෙනි, වැදගත්ම පියවර. අපි අද ඉගෙනගත්ත දේවල්:
importmap
වලින් Three.js ලෝඩ් කරගන්න විදිය.Scene
, Camera
, Renderer
.Geometry
, Material
, Mesh
පාවිච්චි කරන විදිය.add()
කරන විදිය.requestAnimationFrame
පාවිච්චි කරලා Animation Loop එකක් හදන විදිය.renderer.render()
වලින් Scene එක අඳින විදිය.ඔයාට කරන්න තියෙන දේ (Try it yourself!):
material
එකේ color
value එක) ඔයා කැමති hex code එකක් දාලා වෙනස් කරලා බලන්න. 🌈 (Google "color picker" කියලා හොයන්න hex codes ගන්න).wireframe: true
කරලා බලන්න මොකද වෙන්නේ කියලා.BoxGeometry
එකේ numbers) වෙනස් කරලා බලන්න (උදා: new THREE.BoxGeometry( 2, 1, 1 )
).cube.rotation.x +=
value එක) වෙනස් කරලා බලන්න (වැඩි කරන්න, අඩු කරන්න, අගයක් දාන්න). 🌪️cube.position.x
, cube.position.y
වගේ properties වෙනස් කරලා බලන්න animation loop එකේදී.BoxGeometry
වෙනුවට SphereGeometry
දාලා බලන්න (new THREE.SphereGeometry( 1, 32, 16 )
).camera.position.z = 5;
) වෙනස් කරලා බලන්න (තව ලං කරන්න, දුරස් කරන්න, camera.position.x = 2;
වගේ දාලා පැත්තකට කරන්න).Experiment කරන්න! බය නැතුව code එක වෙනස් කරන්න, කඩන්න, හදන්න. 😄 එතකොට තමයි මේක ඇඟටම යන්නේ.
ඊලඟ Episode එකෙන් අපි බලමු තව Objects (වෙනස් Shapes) Scene එකට එකතු කරන්නේ කොහොමද, Lights (ආලෝකය) දාලා MeshBasicMaterial
වෙනුවට MeshStandardMaterial
වගේ advanced materials පාවිච්චි කරන්නේ කොහොමද, Controls (Mouse එකෙන් Scene එක කරකවන්න පුලුවන් විදියට) එකතු කරන්නේ කොහොමද කියලා. 💡🖱️
එතකන් මේ ටික හොඳට practice කරන්න! 💪
ඔබට ජය! 🎉🚀
Member since 2025-04-09 13:55:06
Comments
Please login to post a comment.
No comments yet. Be the first to comment!