سلام دوستان
این اولین مقاله آموزشی توی دوره زندگیمه که اولین بار میخام توی سایت ویرگول منتشرش کنم و مشتاقانه منتظر نظر و پیشنهاد شما عزیزان هستم.
شاید تا الان سایت هایی زیادی دیده باشید که با استفاده از محیط سه بعدی غیرقابل پیشبینی یک سایت خاص و حرفه ای که با انیمیشن های خاصش شما رو کنجکاو و مجذوب کرده تا انتهای سایت بروید و وقتی به خودتان میاین متوجه میشین شما در سناریویی از پیش طراحی شده افتاده بودین که تیم طراح سایت برای معرفی محصول و خدمات شون شما رو ناخودآگاه مجبور به بازدید کل سایت شدید.
امروز میخوام توی این مقاله به شما آموزش بدم چطور میتونین سایت 3D (در حد مقدماتی) طراحی کنین.
اکثر سایت های سه بعدی طراحی شده معمولا از کتابخونه Three js که زبان جاوااسکریپت نوشته شده است طراحی شدند.
قبل از اینکه ساخت یک صفحه وب سه بعدی رو شروع کنیم ابتدا نیازه که با چند تا مفهوم دنیای سه بعدی آشنا بشیم و کاربرد اونا رو توی کدهامون بدونیم.
صحنه (Scene): به معنی یک صحنه ایه که تمام اشیاء سه بعدی مثل نور، دوربین و مدل های سه بعدی در اون قرار میگیرند و ما بدون این عملا نمیتونیم هیچ شی سه بعدی رو نمایش بدیم.
دوربین (Camera): یکی از اشیاءییه که قراره در scene وجود داشته باشه و تمام اون صحنه رو برای نمایش به کاربر به Renderer ارسال میکنه. در کل دو نوع Camera داریم:
نور (Light): در حالت کلی صحنه (Scene) سه بعدی مون اصلا نور ندارد و برای نمایش بهتر اجسام سه بعدی که در صحنه وجود دارن ما نیاز داریم که به صحنه مون نور اضافه کنیم. (در صورت بازخورد مثبت شما ازین مقاله، آموزش های بیشتری از Threejs خواهم گذاشت و این مفاهیم رو بیشتر توضیح خواهم داد.)
اشیاء (Objects): به هر شکل سه بعدی (مکعب، کره، استوانه و ...) و یا مدل سه بعدی که در نرم افزارهای Blender ،3D MAx و ... که در صحنه وجود داره رو Object تعریف میشن.
رندر کننده (Renderer): در پایان، بعد از ساخت Scene ما نیاز داریم این صحنه رو همراه با Camera که ساختیم به Renderer میدیم تا این فضای سه بعدی که ساختیم رو برامون توی مرورگر رندر کنه و نمایش بده.
برای اینکه زودتر از این توضیحات مقدماتی خسته کننده رد شیم و زودتر اولین صفحه سه بعدی سایت خودمون رو طراحی کنیم، ابتدا با استفاده پکیج منیجر npm، هم کتابخونه threejs و هم پکیج vite رو برای Run و Build کردن پروژه نهایی که قابل استفاده در وب باشه رو با استفاده از دستورات زیر نصب میکنیم.
npm install — save three npm install — save-dev vite
بعد از نصب این دو، یک فایل html با کد زیر میسازیم.
<!DOCTYPE html> <html> <head lang="en"> <meta charset="utf-8"> <title>My first 3D Website</title> <style> body { margin: 0; } </style> </head> <body> <script type="module" src="/main.js"> </body> </html>
کد بالا صرفا فقط یک فایل html ساده است که تنها فقط فایل main.js مون رو نیاز داشتیم که وارد بشه. (برای اینکه فایل main.js به صورت یک ماژول وارد بشه و از قابلیت import/export برخوردار باشه، type رو برابر با module قرار دادم.)
در مرحله بعد یک فایل main.js با کد زیر میسازیم.
import * as THREE from 'three'; const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); const renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body( renderer.domElement ); const geometry = new THREE.BoxGeometry( 1, 1, 1 ); const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); const cube = new THREE.Mesh( geometry, material ); scene.add( cube ); camera.position.z = 5; renderer.render( scene, camera );
توی کد بالا، بصورت زیر عمل کردیم:
import * as THREE from 'three';
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
دوربین مون از نوع Perspective با پارامتر های زیر ساختیم:75
: زاویه میدان دید (Field of View) به درجه.
window.innerWidth / window.innerHeight
: نسبت ابعاد عرض به ارتفاع مرورگر.
0.1
: نزدیکترین فاصله قابل مشاهده.
1000
: دورترین فاصله قابل مشاهده.
4. ایجاد رندرکننده (Renderer):
const renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body( renderer.domElement );
THREE.WebGLRenderer()
: یک رندر کننده که از WebGL استفاده میکند برای نمایش سه بعدی مون استفاده کردیم.setSize()
: اندازه رندر را نسبت به عرض و ارتفاع دستگاه مون تنظیم کردیم.appendChild()
: المان سه بعدی رندر شده رو به تگ body صفحه مون اضافه کردیم.const geometry = new THREE.BoxGeometry( 1, 1, 1 ); const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); const cube = new THREE.Mesh( geometry, material );
THREE.BoxGeometry(1, 1, 1)
: یک هندسه از مکعب به اندازه های 1 در 1 در 1 ایجاد کردیم.THREE.MeshBasicMaterial({ color: 0x00ff00 })
: یک متریال ساده با رنگ سبز ایجاد کردیم.THREE.Mesh()
: هندسه و متریال رو برای ساختن یک جسم سهبعدی اضافه کردیم.scene.add(cube);
دقت کنین که تا وقتی این مکعبی که ساختیم رو به صحنه اضافه نکنیم در صفحه مون نمایش داده نمیشه.
camera.position.z = 5;
موقعیت دوربین رو در محور Z به اندازه 5 واحد جابجا میکنیم تا صحنه قابل مشاهد باشه. چرا؟ چون در حالت پیشفرض شی و دوربین در موقعیت (x:0, y:0, z:0) قرار دارد و برای اینکه دوربین با شئ تداخل نداشته باشه دوربین رو 5 واحد عقب تر میبریم تا شئ دیده شود.
renderer.render( scene, camera );
در این قسمت صحنه و دوربین مون رو به Renderer میدیم.
در نهایت برای Run کردن پروژمون با استفاده از دستور زیر یک local server به آدرس http://localhost:3000 ساخته میشه که میتونین با باز کردن این آدرس مکعب سه بعدی ساخته شده رو ببینین.
npx vite
برای build کردن پروژه جهت استفاده در هاست از دستور زیر استفاده کنید.
npx vite build
نتیجه نهایی بصورت زیر نمایش داده میشه براتون.
خوشحال میشم با نظراتتون منو توی گذاشتن آموزش های بیشتر راهنمایی کنین.
سپاس