2009年11月26日 星期四

PV3D 練習-幾種加入光影材質的方式

開車加入光影材質…
http://www.asn.com.tw/flex/cardrive/CarDriver3.html



幾種加入光影材質的方式…

在PV3D 裡面有所謂的 shadematerial,用來產生會按照光源反應出明暗變化的效果的材質,在使用上很方便,只需產生一個點光源,再利用它來 new 出一個 ShadeMaterial,再賦予物件使用。

最簡單的像是 org.papervision3d.materials.shadematerials 底下的 FlatShadeMaterial …

         private function foo():void
         {
            var light:PointLight3D = new PointLight3D();
            var shaderMaterial:FlatShadeMaterial =  new FlatShadeMaterial( light, 0x123456, 0x000000 );
            var plane:Plane = new Plane(shaderMaterial,500,500);
         }

但有時會需要用貼圖的方式來生成物件的表面紋理,比較像真,這時要透過 shader 來重新製作俱備貼圖的 ShadedMaterial…

[Embed(source="assets/photo.jpg")]
private var bmpAsset:Class;
         private function foo():void
         {
            var light:PointLight3D = new PointLight3D();
             var yourBitmap:Bitmap = new bmpAsset() as Bitmap;
            var bitmapMaterial:BitmapMaterial = new BitmapMaterial(yourBitmap.bitmapData);
            var shader:FlatShader= new FlatShader( light, 0xffffff, 0x333333);
            var shaderMaterial:ShadedMaterial = new ShadedMaterial(bitmapMaterial, shader);
            plane = new Plane(shaderMaterial,500,500);
         }

上面是靜態讀圖的作法,但是若是透過 BitmapFileMaterial 動態即時讀圖檔,卻會失敗…

         private function foo():void
         {
            var fileMaterial:BitmapFileMaterial = new BitmapFileMaterial("assets/FocusBody.jpg");
            /// after FileLoadEvent.LOAD_COMPLETE ....
            var light:PointLight3D = new PointLight3D();
            var shader:FlatShader = new FlatShader(light, 0xFFFFFF, 0x333333);
            var shaderMaterial:ShadedMaterial = new ShadedMaterial(fileMaterial, shader);
            var plane:Plane = new Plane(shaderMaterial,500,500);
       }

因為 BitmapFileMaterial 並不是 BitmapMaterial 的子類別  ~"~,所以要稍微轉一下…


         private function foo():void
         {
            var fileMaterial:BitmapFileMaterial = new BitmapFileMaterial("assets/FocusBody.jpg");
            /// after FileLoadEvent.LOAD_COMPLETE ....
            var light:PointLight3D = new PointLight3D();
            var shader:FlatShader = new FlatShader(light, 0xFFFFFF, 0x333333);
            var bitmapMaterial:BitmapMaterial = new BitmapMaterial( fileMaterial.bitmap );
            var shaderMaterial:ShadedMaterial = new ShadedMaterial(bitmapMaterial, shader);
            var plane:Plane = new Plane(shaderMaterial,500,500);
        }

另外要注意,Cube 六面體若是要使用 ShadedMaterial 的話,六面都要 new 個新 shader 給它,否則會有三角形黑色塊產生 = =",很麻煩,而且跑起來非常秏效能。

org.papervision3d.materials.shader 底下還有很多種不同的 shader 可以使用,效果皆不同…
FlatShader
PhongShader
CellShader
EnvMapShader
GouraudShader

沒有留言:

更高效處理 micro second 的方式

更高效處理 micro second 的方式…  以 STM32 為例… __IO unsigned long sys_tick = 0; void SysTick_Handler(void) {     HAL_IncTick();     sys_tick += (SysTi...