arjmand200
Member
به نام خدا
این جلسه رو با ادامه متریالها شروع میکنم ما تا اونجا پیش رفتیم که تونستیم به ابجکت های که داریم یه متریال اختصاص بدیم متریالها رو من به صورت کامل نگفتم و فقط یه مقدار در مورد materialList گفتم که البته یه متریال نیست ولی ابزاریه برای اینکار .
من در اخرهای جلسه قبل انواع متریالها رو گفتم و 11 تا از اونها رو اسم بردم و اونجا هم گفتم که از این متریالها شاید کلا از لحاظ کار سه تاشون با هم فرق دارن و اکثر اونها شبیه هم هستن
خوب اولین قسمت رو با BitmapAssetMaterial شروع میکنم قبل از هر کاری اول ببینیم متدهای این کلاس چیه :
یادم رفت این رو بگم که برای مثال دیگه با همون مثال قبلی شروع میکنم و برای صرفه جویی در زمان مثال دیگه نمیزنم
خوب اولین پارامتر نشون میده که ورودی از نوع bitamData هستش یعنی عکسی که وارد کتابخانه شده و به اکشن اسکریپت export شده
البته این نوع متریال رو من زیاد توصییه نمیکنم چون حجم کار رو افزایش میده
اینم نمونه کد که میتونین تستش کنین البته این رو هم بگم که من عکس رو با این اسم BMPMaterial اکسپورتش کردم:
--------------------------------------------------
2) BitmapColorMaterial : این متریال تقریبا کار colorTransform رو انجام میده و متدهاش اینه :
که فکر نکنم نیاز به توضییح باشه
3)BitmapFileMaterial تقریبا مناسبترین نوع متریال که واسه وب مناسبه و عکس رو از بیرون لود میکنه . کار کلاس loader رو میکنه و حجم کار هم خیلی کم میشه :
که مشخصه url هم مسیر فایل تون هستش میتونین با قرار دادن این مقدار (URLRequest.url) یه لودینگ هم واسه متریالی که داره لود میشه بزارین طوری که اول از نوع MovieMaterial استفاده کنین بعد که فایلتون لود شد این متریال رو null کنین و این متریال رو ست کنین (البته ترفند زیاده و من دیگه نمیخوام اینارو توضییح بدم و این دیگه به خلاقیت خودتون بستگی داره)
4)BitmapMaterial : اینم هم یه انتخاب خوبیه واسه اونایی که میخوان خودشون از طریق کلاس bitmapdata یه متریال بسازن
asset نام bitmapdata هستش که ساختین (یه مثال میزنم تا کامل منظورمه رو بدونین)
فقط کافیه این خط کدها رو به پروژتون اضافه کنین :
من در این جا با perlinNoise یه افکت خیلی ساده ساختم واسه این که بدونین چطوری میشه از این متریال استفاده کرد
5)BitmapViewportMaterial : اما دوستان این متریال
این متریال یکم پیچیدس فقط میتونم این رو بگم که شما میتونین چندین viewport رو به متریال نسبت بدین ، درسته که مقدار پردازش فایل خیلی افزایش میده (چون موتور رندر باید دوبار از viewport رندر بگیره ولی کارایی خیلی زیادی داره که بعد در موردش مثال خواهم زد )
در پارامتر اول ما باید کلاس :BitmapViewport3D وارد پروژه کنیم که این کلاس دقیق همانند viewport هستش که قبلا گفتم و متدهاش هم عین اونه :
اگه خواستین باهاش کار کنین اول اون رو وارد پروژتون کنین :
6) BitmapWireframeMaterial : دقیقا شبیه کلاس (متریال ) WireframeMaterial هستش . بخاطر همون یکیش رو توضییح میدم
7) ColorMaterial : یه متریال خیلی ساده دقیقا شبیه BitmapColorMaterial
8)MovieAssetMaterial : شبیه BitmapAssetMaterial که چندتا متد اضافه داره :
animated واسه اینه که اگه متریالی که تو کتابخانه دارین اگه داخلش انیمیشن داره papervision رو مجبور کنه که با دقت یکم بیشتری این متریال رو رندر کنه اگه توی حالت false باشه بهتره !
و اما createUnique : نمیدونم با مفهوم instance و copy توی 3dmax اشنا هستین (من خودم فقط دیدم)
خوب من میگم نیازی نیست زحمت بکشین ، ببینید copy یعنی از والد همه چیز روی میگیره و اگه والد تغییر کرد copy هم تغییر میکنه ولی اگه instance باشه یعنی فرزند از والد مستقله و بعد از createUnique فرزند هر تغییر در والد رو ازش صرفنظر میکنه
در اینجا اگه این متد رو روی false بزارین یعنی هر موقع والد(موی کلیپ کتابخانه) تغییری رو داشته باشه فرزند همه اون تغییرات رو میپذیره ولی اگه روی true باشه والد دیگه از پدر جداست
البته من خودم هم درست متوجه نشدم منظور از این تغییر چه تغییری هستش چون در هر دو صورت فرزند از والد خصوصیات رو به ارث میبره احتمالا منظورش runtime هستش (حالا هر کی اطلاعاتی داره ما رو هم بی نصیب نذاره)
9) MovieMaterial : هم شبیه قبلیه ولی یه متد اضافه به نام rect داره که همون کلاس rectangle هستش یعنی شما میتونین فضایی که همیشه AutoResize روش تاثیر بذاره ، چون کنترل این ابجکت سخته بهتره همون روی null باشه
10)VideoStreamMaterial : خوب موند فقط این متریال دوستان برای کار با باید با کلاس video کار کرده باشین
برای کار باهاش به یک ابجکت از نوع video و یه کانکشن از نوع netStream دارین من یه مثال میزنم ولی شما تستش نکنین چون یکم سنگینه
:
اول ابجکت video رو بسازین (من دیگه زیاد در این باره توضییج نمیدم البته توضییح زیادی هم نیاز نداره)
vid.flv هم نام ویدیو تون هستش
بعد این کد رو وارد کنین :
متریالها هم تموم شد
این جلسه رو با ادامه متریالها شروع میکنم ما تا اونجا پیش رفتیم که تونستیم به ابجکت های که داریم یه متریال اختصاص بدیم متریالها رو من به صورت کامل نگفتم و فقط یه مقدار در مورد materialList گفتم که البته یه متریال نیست ولی ابزاریه برای اینکار .
من در اخرهای جلسه قبل انواع متریالها رو گفتم و 11 تا از اونها رو اسم بردم و اونجا هم گفتم که از این متریالها شاید کلا از لحاظ کار سه تاشون با هم فرق دارن و اکثر اونها شبیه هم هستن
خوب اولین قسمت رو با BitmapAssetMaterial شروع میکنم قبل از هر کاری اول ببینیم متدهای این کلاس چیه :
PHP:
public function BitmapAssetMaterial( linkageID:String, precise:Boolean = false )
یادم رفت این رو بگم که برای مثال دیگه با همون مثال قبلی شروع میکنم و برای صرفه جویی در زمان مثال دیگه نمیزنم
خوب اولین پارامتر نشون میده که ورودی از نوع bitamData هستش یعنی عکسی که وارد کتابخانه شده و به اکشن اسکریپت export شده
البته این نوع متریال رو من زیاد توصییه نمیکنم چون حجم کار رو افزایش میده
اینم نمونه کد که میتونین تستش کنین البته این رو هم بگم که من عکس رو با این اسم BMPMaterial اکسپورتش کردم:
PHP:
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.materials.*;
var viewport:Viewport3D = new Viewport3D(800,600);
var scene:Scene3D = new Scene3D();
var camera:Camera3D = new Camera3D();
var renderer:BasicRenderEngine = new BasicRenderEngine();
var material:BitmapAssetMaterial = new BitmapAssetMaterial("BMPMaterial",false);
material.doubleSided = true;
material.smooth = true;
material.tiled = true;
var materials:MaterialsList = new MaterialsList(material);
materials.addMaterial(material, "all");
addChild(viewport);
var sphere:Cube = new Cube(materials,550,550,400,20,20,20,0,0);
sphere.x =0;
sphere.y = 0;
scene.addChild(sphere);
addEventListener(Event.ENTER_FRAME , mainFun);
function mainFun(e:Event) {
sphere.rotationX =stage.mouseY/20
sphere.rotationY += 10;
renderer.renderScene(scene, camera, viewport);
}
--------------------------------------------------
2) BitmapColorMaterial : این متریال تقریبا کار colorTransform رو انجام میده و متدهاش اینه :
PHP:
public function BitmapColorMaterial(color:Number=0xFF00FF, alpha:Number=1)
که فکر نکنم نیاز به توضییح باشه
3)BitmapFileMaterial تقریبا مناسبترین نوع متریال که واسه وب مناسبه و عکس رو از بیرون لود میکنه . کار کلاس loader رو میکنه و حجم کار هم خیلی کم میشه :
PHP:
public function BitmapFileMaterial( url :String="", precise:Boolean=false )
که مشخصه url هم مسیر فایل تون هستش میتونین با قرار دادن این مقدار (URLRequest.url) یه لودینگ هم واسه متریالی که داره لود میشه بزارین طوری که اول از نوع MovieMaterial استفاده کنین بعد که فایلتون لود شد این متریال رو null کنین و این متریال رو ست کنین (البته ترفند زیاده و من دیگه نمیخوام اینارو توضییح بدم و این دیگه به خلاقیت خودتون بستگی داره)
4)BitmapMaterial : اینم هم یه انتخاب خوبیه واسه اونایی که میخوان خودشون از طریق کلاس bitmapdata یه متریال بسازن
PHP:
public function BitmapMaterial( asset:BitmapData=null, precise:Boolean = false)
asset نام bitmapdata هستش که ساختین (یه مثال میزنم تا کامل منظورمه رو بدونین)
فقط کافیه این خط کدها رو به پروژتون اضافه کنین :
PHP:
var bmp:BitmapData = new BitmapData(400,400,false,0xFF0000*Math.random()+0xF0);
bmp.perlinNoise(40,10,10,10,false,true,7,false,null);
var material:BitmapMaterial = new BitmapMaterial(bmp,false);
من در این جا با perlinNoise یه افکت خیلی ساده ساختم واسه این که بدونین چطوری میشه از این متریال استفاده کرد
5)BitmapViewportMaterial : اما دوستان این متریال
PHP:
public function BitmapViewportMaterial(bitmapViewport:BitmapViewport3D, precise:Boolean=false)
این متریال یکم پیچیدس فقط میتونم این رو بگم که شما میتونین چندین viewport رو به متریال نسبت بدین ، درسته که مقدار پردازش فایل خیلی افزایش میده (چون موتور رندر باید دوبار از viewport رندر بگیره ولی کارایی خیلی زیادی داره که بعد در موردش مثال خواهم زد )
در پارامتر اول ما باید کلاس :BitmapViewport3D وارد پروژه کنیم که این کلاس دقیق همانند viewport هستش که قبلا گفتم و متدهاش هم عین اونه :
PHP:
public function BitmapViewport3D(viewportWidth:Number=640, viewportHeight:Number=480, autoScaleToStage:Boolean = false,bitmapTransparent:Boolean=false, bgColor:int=0x000000, interactive:Boolean=false, autoCulling:Boolean=true)
اگه خواستین باهاش کار کنین اول اون رو وارد پروژتون کنین :
PHP:
import org.papervision3d.view.BitmapViewport3D
6) BitmapWireframeMaterial : دقیقا شبیه کلاس (متریال ) WireframeMaterial هستش . بخاطر همون یکیش رو توضییح میدم
PHP:
public function BitmapWireframeMaterial(color:Number=0xFF00FF, alpha:Number=1, thickness:Number=3)
7) ColorMaterial : یه متریال خیلی ساده دقیقا شبیه BitmapColorMaterial
PHP:
public function ColorMaterial( color:Number=0xFF00FF, alpha:Number = 1, interactive:Boolean = false )
8)MovieAssetMaterial : شبیه BitmapAssetMaterial که چندتا متد اضافه داره :
PHP:
public function MovieAssetMaterial( linkageID:String="", transparent:Boolean=false, animated:Boolean=false, createUnique:Boolean=false, precise:Boolean = false)
animated واسه اینه که اگه متریالی که تو کتابخانه دارین اگه داخلش انیمیشن داره papervision رو مجبور کنه که با دقت یکم بیشتری این متریال رو رندر کنه اگه توی حالت false باشه بهتره !
و اما createUnique : نمیدونم با مفهوم instance و copy توی 3dmax اشنا هستین (من خودم فقط دیدم)
خوب من میگم نیازی نیست زحمت بکشین ، ببینید copy یعنی از والد همه چیز روی میگیره و اگه والد تغییر کرد copy هم تغییر میکنه ولی اگه instance باشه یعنی فرزند از والد مستقله و بعد از createUnique فرزند هر تغییر در والد رو ازش صرفنظر میکنه
در اینجا اگه این متد رو روی false بزارین یعنی هر موقع والد(موی کلیپ کتابخانه) تغییری رو داشته باشه فرزند همه اون تغییرات رو میپذیره ولی اگه روی true باشه والد دیگه از پدر جداست
البته من خودم هم درست متوجه نشدم منظور از این تغییر چه تغییری هستش چون در هر دو صورت فرزند از والد خصوصیات رو به ارث میبره احتمالا منظورش runtime هستش (حالا هر کی اطلاعاتی داره ما رو هم بی نصیب نذاره)
9) MovieMaterial : هم شبیه قبلیه ولی یه متد اضافه به نام rect داره که همون کلاس rectangle هستش یعنی شما میتونین فضایی که همیشه AutoResize روش تاثیر بذاره ، چون کنترل این ابجکت سخته بهتره همون روی null باشه
PHP:
public function MovieMaterial( movieAsset:DisplayObject=null, transparent:Boolean=false, animated:Boolean=false, precise:Boolean=false, rect:Rectangle=null )
10)VideoStreamMaterial : خوب موند فقط این متریال دوستان برای کار با باید با کلاس video کار کرده باشین
برای کار باهاش به یک ابجکت از نوع video و یه کانکشن از نوع netStream دارین من یه مثال میزنم ولی شما تستش نکنین چون یکم سنگینه

PHP:
public function VideoStreamMaterial ( video:Video, stream:NetStream , precise:Boolean = false, transparent:Boolean = false )
اول ابجکت video رو بسازین (من دیگه زیاد در این باره توضییج نمیدم البته توضییح زیادی هم نیاز نداره)
PHP:
var nc:NetConnection = new NetConnection ();
nc.connect (null);
var ns:NetStream = new NetStream(nc);
ns.play ("vid.flv");
var vid:Video = new Video();
vid.attachNetStream (ns);
vid.flv هم نام ویدیو تون هستش
بعد این کد رو وارد کنین :
PHP:
import flash.display.BitmapData;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.*
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.materials.*;
var material:VideoStreamMaterial = new VideoStreamMaterial( vid, ns , false, false);
var viewport:Viewport3D = new Viewport3D(800,600);
var scene:Scene3D = new Scene3D();
var camera:Camera3D = new Camera3D();
var renderer:BasicRenderEngine = new BasicRenderEngine();
material.doubleSided = true;
var materials:MaterialsList = new MaterialsList(material);
materials.addMaterial(material, "all");
addChild(viewport);
var sphere:Cube = new Cube(materials,550,550,400,20,20,20,0,0);
sphere.x =0;
sphere.y = 0;
scene.addChild(sphere);
addEventListener(Event.ENTER_FRAME , mainFun);
function mainFun(e:Event) {
sphere.rotationX =stage.mouseY/20;
sphere.rotationY += 10;
renderer.renderScene(scene, camera, viewport);
}
متریالها هم تموم شد