آموزش Three.js

saalek110

Well-Known Member
تغییرات اعمال شده روی بازی 2 تا با کنترلهای جدید کار کند:
متغیرهای اول بازی:
JavaScript:
                         //---- control camera ----
                        var my_control=0;
                        var rotation=0;
                        var flag=0;
                        //-------------------------
اون flag برای اینه داخل تابع my_function کدها آبشاری اجرا نشوند و وقتی یک خط اجرا شد از تابع خارج شود. حرکت به جلو را من 5 سرعته کردم. یعنی با هر بار زدن دکمه جلو 20 تا سرعت اضافه می شود.

قسمتی که در تابع animate اضافه می شود:
JavaScript:
camera.rotation.y=rotation;
camera.position.x += Math.sin(rotation) * my_control;
camera.position.z += Math.cos(rotation) * my_control;

تابع ما:
JavaScript:
function myFunction(x) {
   if (x==1) {
        flag=0;
       if(my_control==0     && flag==0)    {   my_control=-20;    flag=1; }
       if(my_control==-20   && flag==0)    {   my_control=-40;    flag=1; }
       if(my_control==-40   && flag==0)    {   my_control=-60;    flag=1; }
       if(my_control==-60   && flag==0)    {   my_control=-80;    flag=1; }
       if(my_control==-80   && flag==0)    {   my_control=-100;    flag=1; }
   }//x=1

   if (x==2) { my_control=20; }
   if (x==3) { my_control=0; }

    if (x==4) {  rotation +=0.2618;   }
    if (x==5) { rotation -=0.2618;    }

}

و دکمه های بازی:
JavaScript:
        <img src="textures/buttons/left.png" height="90" size="90" alt="Img" onclick="myFunction('4')">
        <img src="textures/buttons/up.png" height="90" size="90" alt="Img" onclick="myFunction('1')">
        <img src="textures/buttons/stop.png" height="90" width="90" alt="Img" onclick="myFunction('3')">
        <img src="textures/buttons/down.png" height="90" size="90" alt="Img" onclick="myFunction('2')">
         <img src="textures/buttons/right.png" height="90" size="90" alt="Img" onclick="myFunction('5')">



دکمه رو به بالا حرکت رو به جلو 5 سرعته.(گاز)
دکمه رو به پایین حرکت به عقب تک سرعته.(دنده عقب)
دکمه سیاه توقف.(ترمز)
دکمه های چپ و راست چرخش به چپ و راست.(فرمان)
 
آخرین ویرایش:

saalek110

Well-Known Member
تنظیمات دکمه ها:

در بازی 3 دکمه های کیبورد را فراموش کرده بودم. درست کردم.
البته شاید این طرز کارکرد کیبورد و تاچ را شما نپسندید.این به بازی شما بستگی داره.
در بازی من الان دقت لازم نیست چون بازی چیزی ندارد که بازیکن بخواهد آروم راه برود. آدمک هم ندارد بازی. دوربین در خیلی بازیها دنبال player راه می رود. بخاطر این مسایل من فعلا ابن طوری تنظیم کردم. شما می توانید هر طور خواستید تنظیم کنید. من روش کار را پیاده کردم ولی قابل تغییر است.

اگر می خواهید هر تاچ دکمه ها کمی راه برود یک متغیر پر کنید که با حرکت دوربین فوری یا به تدریج خالی شود. استفاده از متغیرها را من گفتم و شما می تواند روش استفاده از متغیرها را عوض کنید تا کارکرد دکمه ها اون طوری بشود که مناسب بازی شماست.
 
آخرین ویرایش:

saalek110

Well-Known Member
ساخت Run time اشیا:

یعنی همان طور که برنامه در حال اجرا است یک شی بسازیم.
من یک روش دارم از خودم که شاید روشهای بهتری موجود باشد ولی بهرحال روشم را اینجا میگم:

من یک آبجکت را که قابلیت حرکت در بازی را دارد می سازم. اسمش را مارکر یا قالب یا چنین چیزی می گذارم.
با زدن یک دکمه از پایین برنامه اون قالب می آید نزدیک دوربین.
و با زدن دکمه های دیگر سایز و محل و متریالش تغییر می کند تا دقیقا بشود اون شی یی که نیاز داریم.
مثلا من یک چوب کوچک برای سردر می خواهم. با یک باکس بزرگ یا یک استوانه بزرگ شروع می کنم و اون قدر تغییر سایز و محل می دهم تا برود جایی که می خواهم.

بعد اینکه قالب در جای درست قرار گرفت یک شی دیگر می سازم که از لحاظ محل و سایز و متریال با شی قالب یکی باشد.
قالب را بعدا جابجا می کنم تا برای ساخت شی بعدی ازش استفاده کنم.

پس شی قالب قابلیت تغییر سایز و محل و متریال داره و بعد تنظیم شی قالب یک شی می آید همونجا با همون سایز و متریال خلق می شود. و بعد ما قالب را که تکان دهیم می بینیم شی دوم جای قالب را گرفته.

این شد طرز چیدن آبجکت ها در حالت اجرا. مثلا برای دیوارکشی یا زدن سقف. یا ساخت پله. یا هر ساختار دیگر



مرحله ثبت اشیا:
همون موقع که شی جای قالب را می گیره میشه صفات اون یعنی محل و سایز و متریال را ذخیره کرد. حالا یا در فایل یا در دیتابیس.
یا میشه در آرایه ای پر کرد تا بعدا ثبت کرد.

خوب اگر داده های اشیای ساخته شده ثبت نشود بار بعدی که بازی اجرا میشه اثری از اونها نیست.
پس وقتی x,y,z ,a,b,c,mat که محل و سایز و متریال شی است جایی ثبت شد
وقتی بار بعد بازی اجرا میشه باید از این 7 صفت شی را بسازد.
ممکنه در ساخت یک ساختمان شما 20 آبجکت حین اجرا بسازید. پس 20 تا شی باید ذخیره شود. یعنی 20 تا از این 7 صفت جایی ذخیره میشه. تا در اجرای بعدی این اشیا ایجاد شوند.
می توانید برای نوع شکل هم یک کد در نظر بگیرید. مثلا کد 1 برای مکعب و کد 2 برای استوانه و کد 3 برای کره sphere.
برنامه موقع شروع با توجه به کدها با دستور سوییچ می تواند اشکال مورد نظر را بسازد.

فعلا کدهای اینها را نگذاشتم. ولی فکر کنم با همین شرحش بعضی بتوانند برنامه را پیاده کنند.

در شکل زیر 4 مکعب از قالب ساخته شده:

g7.jpg


دکمه خلق:
creat.jpg
 
آخرین ویرایش:

saalek110

Well-Known Member
کدهای ساخت Run time اشیا:

برای کمک به خوانندگان قسمتهایی از کد را ارسال می کنم:
PHP:
 function maker(x ) {
                var obj_shape = new THREE.BoxBufferGeometry(  200, 200, 200 );
                obj = new THREE.Mesh( obj_shape, mat );


    obj.position.x = marker.position.x;
    obj.position.y =marker.position.y;
    obj.position.z =marker.position.z;
scene.add( obj );

}//f2

کد بالا تابعی است که از شی قالب یا شی مارکر کپی می گیرد.
البته در کد بالا شی ساخته شده ابعادش از روی ماکر کپی نشده و 200, 200, 200 در نظر گرفته شده.
قبلا یادتونه با دکمه های ساختگی خودمون این گونه تابع ها را صدا می زدیم.برای کار روی دوربین منظورمه.
PHP:
 <img src="textures/my_buttons/create.jpg" height="60" size="60" alt="Img" onclick="maker('15')">
اون عدد 15 که به تابع ارسال شده هیچ کاری انجام نمی دهد و اضافه است و میشه حذف کرد.

متغیر mat در بالای برنامه تعریف شده تا در تابع ها در دسترس باشد.

PHP:
 var mat;

و در جایی از برنامه متریال مورد نظر را در mat می ریزیم:
PHP:
mat= material_marker;

شی قالب هم یک شی معمولی است که قبلا از این شی ها ساختیم.

حالا دیگه اکثر کد را دارید و بقیه اش را هم می توانید راحت با سرچ پیدا کنید.
 
آخرین ویرایش:

saalek110

Well-Known Member
البته خلق اشیا در حالت اجرا قابل توسعه است و میشه امکانات زیادی بهش افزود.
و من در بالا کلید ورود را دادم. شما می توانید با ابداعات خود تسهیلات یا قدرتهای زیادی به برنامه اضافه کنید.

مثلا می توانید اشیا ساخته شده را در دیتابیس ذخیره کنید
و بعد با کوئری های مختلف ظهورهای متنوعی از این اشیا ایجاد کنید.

یا در ور رفتن با شی قالب انواع ابزارها را می توانید به کار ببرید.

همچنین بعدا که در theee js چیزهای بیشتری یاد گرفتید خلق اشیا در حالت اجرا را با تکنولوژی جدیدتر انجام خواهید داد.
 
آخرین ویرایش:

saalek110

Well-Known Member
اینکه گفتم شی قالب را می آوریم به محل دوربین
کدش این میشه که مختصات دوربین را در مختصات اون می ریزیم. همون x و z را.

البته جالب درنمیاد چون دقیقا می افتد روی دوربین و دیده نمیشه و باید جای دوربین را عوض کرد تا اون را دید.

برای رفع این مشکل باید شی بیاید در محدوده دید دوربین.
قبلا برای حرکت دوربین از سینوس و کسینوس استفاده کردیم ، از همون فرمولها برای پیدا کردن محدوده دید دوربین استفاده کنید.
 

saalek110

Well-Known Member
الان اوایل تیر ۱۴۰۰ است. ممکنه چند هفته یا چند ماه نباشم.

پس منتظر من نباشید ، یا کدهای فعلی را تمرین کنید و توسعه بدهید
یا خودتون کد پیدا کنید.
 
آخرین ویرایش:

saalek110

Well-Known Member
همین ساختن شی در حالت اجرا خیلی نیاز به کار داره.
هر چی بیشتر روی اون کار کنید تمیزتر درمیاد.
این جور کارها دیگه نیاز به آموزش نداره و نیاز به وقت و سلیقه داره.
روی این گونه موارد خودتون کار کنید و حسابی هنر خود را نشان دهید.

نگذارید محیط بازی تون خالی بمونه ، برای طبیعی سازی محیط از هر ابزاری استفاده کنید.
یکی از قوانین بازی سازی استفاده خوب از ابزارهای موجود است و همش نباید دنبال تکنولوژی جدید و کد جدید باشید.
 

saalek110

Well-Known Member
Three js می دونید ماژول های زیادی داره که در سمپل های سایتش قابل مشاهده است.

من تلاشم این بود برنامه سنگین نشه.
ولی اگر شما دوست دارید از ماژولها استفاده کنید تا برنامه اتان سریع تجهیز بشه. ممکن است شما یک کامپیوتر قوی داشته باشید و برای کامپیوتر شما سنگینی معنی نداشته باشه ولی من قصدم این بود جیزی بسازم که روی موبایل های ضعیف هم بتونه اجرا بشه. و می خواستم جزییات زیاد به بازی اضافه کنم. پس باز از ماژول استفاده نکردم تا دستم باز باشه جزییات به بازی اضافه کنم. من تلاشم این بود خودم کد بنویسم و تا می تونم از ماژولها استفاده نکنم.
 

saalek110

Well-Known Member
در کامپیوتر از کلیدهای کیبورد میشه برای ارسال دستور استفاده کرد
ولی در موبایل چون کیبورد نداریم(البته در دستگاه های جدید میشه کیبورد وصل کرد) مجبوریم برای هر کار یک دکمه تعین کنیم
پس بهرحال در موبایل محدودیت بیشتری داریم.

بنابراین شاید لازم باشه تقسیم کار کرد و کارهایی را در کامپیوتر انجام داد.
البته این یک اجبار ۱۰۰ درصد نیست و میشه یک رابط کاربری قوی در موبایل ایجاد کرد ولی خوب هم هزینه داره و هم اینکه شاید در نهایت اونی که باید بشه نشود.
و در فاز اول شاید مجبور بشویم مدتی تقسیم کار کنیم و....

( ولی اگر بتوانیم آبجکت ها را تاچ کنیم قضیه مقداری فرق می کنه. )

و مثل خیلی جاهای دیگر ، تولید محتوا را در کامپیوتر و استفاده را در موبایل تقسیم کرد.
خیلی نرم افزارها ورژن موبایلی ندارند و شاید اصلا نیازی به این کار نیست.
 
آخرین ویرایش:

saalek110

Well-Known Member
صدا:
JavaScript:
// create an AudioListener and add it to the camera
const listener = new THREE.AudioListener();
camera.add( listener );

// create a global audio source
const sound = new THREE.Audio( listener );

// load a sound and set it as the Audio object's buffer
const audioLoader = new THREE.AudioLoader();
audioLoader.load( 'sounds/358232_j_s_song.ogg', function( buffer ) {
    sound.setBuffer( buffer );
    sound.setLoop( true );
    sound.setVolume( 0.5 );
    sound.play();
});

منبع:

تست شد.
 

hanie9988

Member
۳. **سیستم حکومتی:** آمریکا یک جمهوری فدرال با سیستم حکومتی دموکراتیک دارد.

۴. **تاریخ:** آمریکا دارای تاریخ متنوع و پررنگی است که شامل دوران کلونی‌ها، استقلال از انگلیس، جنگ داخلی، و دوران پس از جنگ جهانی دوم می‌شود.

۵. **اقتصاد:** اقتصاد آمریکا یکی از بزرگترین اقتصادهای جهان است و به عنوان یک قدرت اقتصادی و نظامی برجسته شناخته می‌شود.

۶. **فرهنگ و هنر:** مهاجرت به آمریکا اخبار مهاجرت
 

saalek110

Well-Known Member
بازی ((چرخش در محوطه)) :

در پستهای قبلی ، کدهای درخت و صفحه زرد و سیستم حرکت جدید با چرخش ، پست شده بود.
من آن قسمتها را روی بازی اول سوار کردم تا بازی ((چرخش در محوطه)) حاصل شود:


JavaScript:
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>three.js</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <link type="text/css" rel="stylesheet" href="main.css">
 

    </head>
    <body>
<script src="js/three.js"></script>

         <script>
            var camera, scene, renderer;
            var mesh;
                         //---- control camera ----
                    var my_control=0;
                    var rotation=0;                                              var flag=0;
                        //-------------------------

            init();
            animate();
            function init() {
                camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 35000 );
                camera.position.z = 5400;
                scene = new THREE.Scene();
                //========================================================================
             function my_draw(a, b , c , x, y , z ,material_x) {//function

                var geometry_x = new THREE.BoxBufferGeometry(  a, b, c );
                mesh_x = new THREE.Mesh( geometry_x, material_x );

    mesh_x.position.x = x;
    mesh_x.position.y = y;
    mesh_x.position.z = z;
    scene.add( mesh_x );
}//function


//-------------------------- skybox -------------------
var skyGeo = new THREE.SphereGeometry(15000, 25, 25);
//First the geometry. I wanted it big and made it big
             var texture_x = new THREE.TextureLoader().load(  'textures/cube/skyboxsun25deg/nx.jpg' );
                var material_sky = new THREE.MeshBasicMaterial( { map: texture_x } );
//Set everything together and add it to the scene here.

    var sky = new THREE.Mesh(skyGeo, material_sky);
    sky.material.side = THREE.BackSide;
    scene.add(sky);
//--------------------------- grass ------------------------
var loader = new THREE.TextureLoader();
        var texture4 = loader.load( 'textures/terrain/grasslight-big.jpg', function ( texture ) {
    texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
    texture.offset.set( 0, 0 );
    texture.repeat.set( 20, 35 );
    // your code
} );
var material_zz4 = new THREE.MeshBasicMaterial( { map: texture4 } );
    my_draw(8000,10,30000,0,-150,7000,material_zz4);
    //-------------------- stone ------------
var geometry_stone = new THREE.BoxBufferGeometry(  200, 200, 200 );
var texture_stone = new THREE.TextureLoader().load(   'textures/terrain/stone.jpg' );
                var material_stone = new THREE.MeshBasicMaterial( { map: texture_stone } );
                mesh_stone = new THREE.Mesh( geometry_stone, material_stone );
     
    mesh_stone.position.x = -650;
    mesh_stone.position.y = -100;
    mesh_stone.position.z = 5500;
    scene.add( mesh_stone );
    //=================
    const map = new THREE.TextureLoader().load( 'textures/tree11.png' );
   
    const material = new THREE.SpriteMaterial( { map: map, color: 0xffffff } );
   
   
   
    const sprite = new THREE.Sprite( material );
   
    sprite.scale.set(1000,1000, 1)
   
     sprite.position.x = 100;
     sprite.position.y =200;
     sprite.position.z = 100;

 scene.add( sprite );        
 
 
 const sprite2 = new THREE.Sprite( material );
 
 sprite2.scale.set(1000,1000, 1)
 
     sprite2.position.x = 800;
      sprite2.position.y =200;
      sprite2.position.z = 100;
 scene.add( sprite2 );
 //================================
 const geometry_yellow_plane = new THREE.PlaneGeometry( 300, 300 );

 const material_yellow_plane = new THREE.MeshBasicMaterial( {color: 0xffff00, side: THREE.DoubleSide} );

 const plane = new THREE.Mesh( geometry_yellow_plane, material_yellow_plane );

     plane.position.x = -1300;
     plane.position.y =50;
     plane.position.z = 5000;
 scene.add( plane );
 //======================================================================
                renderer = new THREE.WebGLRenderer( { antialias: true } );
                renderer.setPixelRatio( window.devicePixelRatio );
                renderer.setSize( window.innerWidth, window.innerHeight );
                document.body.appendChild( renderer.domElement );
                window.addEventListener( 'resize', onWindowResize, false );
            }//  /init--------------------------------------------------------------------------------------------------
document.addEventListener('keydown',onKeyDown,false);
function onKeyDown(event){//onKeyDown
      var delta =20;

                              //event = event || window.event;
                         var keycode = event.keyCode;
     switch(keycode){
     case 37 : //left arrow

      camera.updateProjectionMatrix();
       break;
     case 38 : // up arrow
     //

camera.position.z = camera.position.z - delta;
camera.updateProjectionMatrix();

      break;
     case 39 : // right arrow

     camera.updateProjectionMatrix();
     break;
    case 40 : //down arrow

camera.position.z = camera.position.z + delta ;
camera.updateProjectionMatrix();
    break;
                 }
}//onKeyDown
            function onWindowResize() {
                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();
                renderer.setSize( window.innerWidth, window.innerHeight );
            }

            function animate() {

                requestAnimationFrame( animate );

camera.rotation.y=rotation;
camera.position.x += Math.sin(rotation) * my_control;
camera.position.z += Math.cos(rotation) * my_control;

       camera.updateProjectionMatrix();
                renderer.render( scene, camera );
            }
//======================================================================
function myFunction(x) {
   if (x==1) {
     flag=0;
 if(my_control==0     && flag==0)    {   my_control=-20;    flag=1; }
 if(my_control==-20   && flag==0)    {   my_control=-40;    flag=1; }
if(my_control==-40   && flag==0)    {   my_control=-60;    flag=1; }
if(my_control==-60   && flag==0)    {   my_control=-80;    flag=1; }
if(my_control==-80   && flag==0)    {   my_control=-100;    flag=1; }
}//x=1

if (x==2) { my_control=20; }
if (x==3) { my_control=0; }

if (x==4) {  rotation +=;   }
if (x==5) { rotation -=;    }
 
}  // function
        </script>
     <center>
<img src="textures/buttons/left.png" height="90" size="90" alt="Img" onclick="myFunction('4')">
 <img src="textures/buttons/up.png" height="90" size="90" alt="Img" onclick="myFunction('1')">
<img src="textures/buttons/stop.png" height="90" width="90" alt="Img" onclick="myFunction('3')">
<img src="textures/buttons/down.png" height="90" size="90" alt="Img" onclick="myFunction('2')">
<img src="textures/buttons/right.png" height="90" size="90" alt="Img" onclick="myFunction('5')">  
      </center>
    </body>
</html>
 

saalek110

Well-Known Member
دو تا درخت اضافه کردم و یک صفحه زرد و سیستم ۵ دکمه و دارای قابلیت چرخش به دو طرف را دارد.
برای دکمه ها ، عکس های زیر را می توانید استفاده کنید:

right.pngup.pngstop.pngdown.pngleft.png

در کد مشخص است که عکسها در چه پوشه هایی باید قرار بگیرند. مثلا دکمه های جهت داخل پوشه تکسچر و داخل پوشه باتونز. البته اسم انگلیسی اش منظور است که در کدها هست یعنی این: textures/buttons

با تگهای html می توانید چیدمان دکمه ها را به دلخواه خود قرار دهید.

دکمه رو به جلو ، چند سرعته است ولی عقب تک سرعته است. در تابع myFunction کدهای ایجاد این حالت را می بینید.
متغیرهای ایجاد صفحه زرد ، اون جوری که در تاپیک نوشته بود باعث هنگ برنامه میشد ، شاید این متغیرها قبلا استفاده شده بود ، من اسم متغیرهایش را عوض کردم درست شد.

عکس درخت را از پستهای قبلی دانلود کنید و به پوشه ای که در کد اسمش هست بیاندازید.


قبلا بازی ، آسمان و زمین چمن و یک بلوک سیمانی داشت...
حالا دو درخت و یک صفحه زرد رنگ اضافه شده و سیستم چرخش به طرفین هم حالا داریم. قبلا فقط عقب و جلو می رفت. حالا بعد چرخش به چپ و راست می توانید با کلید جلو به آن سو حرکت کنید. یا دنده عقب بروید.

من ،در پست قبل ،فقط توصیه های پستهای قبلی را عمل کردم و کد جامع را بدست آوردم. توضیحات اون پستها را بخوانید. مثلا پست درخت و پست صفحه زرد و پست تغییر سیستم حرکت.

اسمهای geometry_yellow_planeو material_yellow_plane ساخته من است و ربطی به three.js ندارد. چون اسمهای قبلی باعث هنگ برنامه شد ، من این اسمها را از خودم ساختم ، شما هر اسمی دوس دارید می توانید جایگزین این دو اسم کنید.
 
آخرین ویرایش:

saalek110

Well-Known Member
The OBJ file format is a simple data-format that represents 3D geometry in a human readable .format
فرمت فایل obj ، یک فرمت ساده دیتا است که جئومتری سه بعدی را به یک زبان قابل فهم برای انسان عرضه می کند.
.
سالک: اگر شما با نرم افزارهای سه بعدی ساز کار کنید ، یکی از خروجی ها فایل obj است. و فرمت قابل فهم برای انسان است. یعنی میشه فایل را خواند.


نقل:
این نوشته درباره فرمت OBJ است که یکی از مهمترین فرمت های سه بعدی محسوب می شود. فرمت فایل OBJ یکی از محبوب‌ترین فرمت‌های فایل سه‌بعدی در جهان است. این فرمت توسط شرکت Wavefront Technologies در سال ۱۹۹۴ توسعه یافت و از آن زمان تاکنون به عنوان فرمت استاندارد برای ذخیره و تبادل داده‌های سه‌بعدی در نرم‌افزارهای مدل سازی سه‌بعدی، بازی‌سازی، انیمیشن و پرینت سه‌بعدی مورد استفاده قرار گرفته است. فرمت OBJ یک فرمت متنی است و داده‌های سه‌بعدی (مدل ها) را به صورت خطوط، چندضلعی‌ها و منحنی‌ها ذخیره می‌کند. این فرمت از انواع مختلفی از چندضلعی‌ها، از جمله مثلث‌ها، مربع‌ها، مستطیل‌ها و پنج‌ضلعی‌ها پشتیبانی می‌کند. همچنین، فرمت OBJ امکان ذخیره داده‌های منحنی‌ها را نیز فراهم می‌کند که توسط بسیاری از نرم‌افزارهای محبوب پشتیبانی می‌شود.



مزایا و معایب فرمت OBJ
فرمت OBJ مزایا و معایب مختلفی دارد. از مزایای این فرمت می‌توان به محبوبیت و سازگاری بالای آن اشاره کرد، فرمت OBJ یک فرمت محبوب و سازگار است که توسط بسیاری از نرم‌افزارهای مدلسازی سه‌بعدی، بازی‌سازی، انیمیشن و پرینت سه‌بعدی پشتیبانی می‌شود. همچنین، فرمت OBJ حجم فایل کوچکی دارد که باعث می‌شود انتقال و ذخیره‌سازی آن آسان باشد. و همینطور، انعطاف‌پذیری بالای دارد، این فرمت مشهور سه بعدی از انواع مختلفی از داده‌های سه‌بعدی پشتیبانی می‌کند که باعث می‌شود برای کاربردهای مختلف مناسب باشد.

اما این فرمت معایبی نیز دارد، از معایب فرمت OBJ می‌توان به عدم پشتیبانی از اطلاعات صحنه اشاره کرد زیرا فرمت OBJ از اطلاعات صحنه، مانند موقعیت نورها، دوربین‌ها و اشیاء دیگر، پشتیبانی نمی‌کند و همچنین عدم پشتیبانی از انیمیشن‌های پیشرفته، چون OBJ از انیمیشن‌های پیشرفته، مانند انیمیشن‌های اسکلتی، پشتیبانی نمی‌کند.

توصیه‌هایی برای استفاده از فرمت OBJ
برای کاربردهایی که نیاز به ذخیره اطلاعات صحنه یا انیمیشن‌های پیشرفته دارند، بهتر است از فرمت‌های دیگر، مانند فرمت FBX یا فرمت USD، استفاده کرد. و همچنین برای کاربردهایی که نیاز به ذخیره حجم کم فایل دارند، فرمت OBJ یک گزینه مناسب است
 

saalek110

Well-Known Member

فایل obj بسازید.

در سایت بالا می توانید فایل obj بسازید. منو را بزنید ، اکسپورت به obj را بزنید.
در قسمت پایین و چپ صفحه ، دکمه add را داریم که می توانید اشکال دیگر را اضافه کنید. چه اشکالی اضافه بکنید و چه همون مربع که اولش هست را اکسپورت کنید فرقی نداره.
منظور اینه که یک فایل obj ساخت خودتان داشته باشید. نرم افزار دیگه هم می خواهید می توانید استفاده کنید ولی این سای آنلاین مجانی است ، دم دست است.
 

saalek110

Well-Known Member
اگر اون بسته حدودا ۳۰۰ مگائی که در همین تاپیک لینک دادیم را دانلود کنید و بفرستید روی هاست خودتون ، فایلهای پوشه examles خودش اجرا میشه و نیاز به هیچ کاری نداره، فقط باید لینک اون صفحات را در آدرس بار بروسر خودتون وارد کنید.

فایل زیر یکی از مثالهای اون بسته است:


که مثالی برای load یک فایل obj است. اگر فایل obj خودتان را در برنامه اسمش را بنویسید ، فایل شما را لود می کند. یعنی باید فایل obj را کنارش بدارید یا مسیر درست بهش بدهید.
فایلی که در لینک بالا هست ، دقیقا در پوشه examples هم همین هست .فرقی نمی کنند.

اگر فایل بالا را بخوانید چیزهایی را import کرده.

خط ۹۵ فایل من اسم فایل obj خودم را که در همین سایت آنلاین ساخته بودم و اکسپورت کردم به دستگاهم و بعدش آپلود کردم به هاستم ، دادم:


JavaScript:
                loader.load( 'model.obj', function ( obj ) {

پس در خط ۹۵ اسم فایل خودتون را ساختید می توانید بدهید
اگر در بسته ۳۰۰ مگائی باشه ، خودش به یک مدلی که در پوشه مدلها هست وصل است.
و نتیج اجرایش هم اینه:



یک آدمک رنگی. پس اگر در بسته ۳۰۰ مگائی باشه ، خودش پوشه مدلهایش را دارد و ادرسش را در فایل مورد بحث بهش داده. ولی شما می توانید مدل خودتون را جایگزین کنید.
اگر فقط مدل را بدهید و تکسچر را تامین نکنید ، مدل شما سیاه و کم نور است، در کد یک تکسچر هم مسیرش را داده.

پس دو کار باید با این فایل کد بکنید، یکی دادن اسم و مسر مدل خودتون که آپلود کردید و دیگری تنظیم مسیرها...
اگر فایل را از پوشه emxaples حرکت ندهید ، مسیرهایش تنظیم است خودش. یکی پوشه jsm را نیاز داره که پوشه jsm داخل پوشه examples است. یکی هم پوشه build را نیاز دارد که یکی از پوشه های بسته ۳۰۰ مگائی است. و داخلش ۷ تا فایل است.


Screenshot_۲۰۲۴-۱۰-۰۲_۱۳۰۴۰۳.jpg
کل این فایلها ۵ تا ۷ مگا است. در عکس به حجم ها نگاه کنید.

حالا به خطوط import کدمان در همون اوایل فایل نگاه می کنیم. کد زیر:


JavaScript:
import * as THREE from 'three';

            import { OBJLoader } from 'three/addons/loaders/OBJLoader.js';
            import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

دو تا فایل علاوه بر اون ۷ تا فایل ، import شده.
OBJLoader.js
OrbitControls.js

از پوشه های loaders و controls
این دو فایل حدود بیست تا سی کیلو بیشتر نیست.

پس شاید نیاز نباشه ۳۰۰ مگا را دانلود کنید و اگر این چند تا فایل را به برنامه بدهید ، برنامه اجرا بشود.

در کد یک تکسچر هم لود شده ، فایل و مسیرش باید رعایت شود.
 
آخرین ویرایش:

saalek110

Well-Known Member
نتیجه اجرا:

Screenshot_۲۰۲۴-۱۰-۰۲_۱۳۳۱۲۱.jpg

در اون سایت آنلاین من ۳ تا شکل را انداختم روی هم که در عکس بالا می بینید.یک کره بود و یک مکعب و یک چند وجهی شبیه استوانه.
تکسچری که خود فایل مثال انتخاب کرده این جوری بوده.
تکسچری خوبی نیست نه برای اون آدمک مثال ، نه برای مدل من.

تکسچر چوبی:

Screenshot_۲۰۲۴-۱۰-۰۲_۱۳۴۱۰۸.jpg

تکسچر آجری:

Screenshot_۲۰۲۴-۱۰-۰۲_۱۳۴۸۰۸.jpg
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا