Papervision3Dで画像がゆがむの回避する方法、どっちがいい?

Papervision3Dでオブジェクトにビットマップ画像を貼り付けたとき、画像がゆがんでしまうのを回避するにはオブジェクトのセグメント数を上げるしかないと思っていたのですが、先日会社で隣の席に座っている@morikenさんにbitmapMaterialなどの引数“precise”をtrueにすることでもゆがみを解消できることを教わったので、せっかくだしちょっと比較検証してみることにしました。
 
まずは画像のゆがみの比較です。
一番左は、普通に貼り付けただけのもの。
真ん中はnew Plane(_material, _w, _h, 4, 4)のような感じでセグメントを4つずつ分割したもの、
一番右はnew BitmapMaterial(bitmap, true)のような感じで、2つ目の引数preciseをtrueにしたものです。
何もしてないのは論外として、真ん中と右を比べると、precise=trueの方が角度によって若干ガタつきが起こっていることが分かります。


 

スピード比較

大量にオブジェクトを作ってスピード比較してみました。上がPlaneのセグメント数を4,4にしたもの、下がmaterialのpreciseをtrueにしたものです。
あからさまにpreciseをtrueにしたものの方が速いことが分かります。
 

 

 
segmentの数を2,2まで減らせばprecise=trueにしたものより速くすることができますが、その場合はprecise=trueの方がゆがみが少なく、表示がきれいになります。
 

 

結論

ほとんどの場合、セグメント数を増やすよりprecise=trueを使う方が良さそうです。セグメント数を増やすのはprecise=trueにしたものよりさらにゆがみを少なくしたい場合でしょうか。スピードは犠牲にすることになりますが、4,4以上のセグメント数にすればprecise=trueより見た目を良くできます。
 
[追記 10/03/17]
soundkitchenさんが検証ソースをwonderflでも動くようにしてくれたので、実際に試してみたい方は以下からFork

 
ソースは以下。
 

■アニメーションの見え方比較

ACTIONSCRIPT:
  1. package {
  2.     import flash.display.Sprite;
  3.     import flash.events.Event;
  4.     import org.papervision3d.cameras.Camera3D;
  5.     import org.papervision3d.render.BasicRenderEngine;
  6.     import org.papervision3d.scenes.Scene3D;
  7.     import org.papervision3d.view.Viewport3D;
  8.     import org.papervision3d.materials.BitmapAssetMaterial;
  9.     import org.papervision3d.objects.DisplayObject3D;
  10.     import org.papervision3d.objects.primitives.Plane;
  11.    
  12.     public class Main extends Sprite {
  13.        
  14.         private var camera:Camera3D;
  15.         private var scene:Scene3D;
  16.         private var viewport:Viewport3D;
  17.         private var renderer:BasicRenderEngine;
  18.        
  19.         private var _plane1:Plane;
  20.         private var _plane2:Plane;
  21.         private var _plane3:Plane;
  22.        
  23.         public function Main() {
  24.             scene = new Scene3D();
  25.             viewport = new Viewport3D(510, 240, true, true);
  26.             renderer = new BasicRenderEngine();
  27.             camera = new Camera3D();
  28.             addChild(viewport);
  29.            
  30.             camera.focus = 100;
  31.             camera.zoom = 2;
  32.             camera.y = -80;
  33.             camera.z = -600;
  34.            
  35.             init();
  36.         }
  37.        
  38.         private function init():void {
  39.             var _picmaterial1:BitmapAssetMaterial = new BitmapAssetMaterial("Pic");
  40.             var _picmaterial2:BitmapAssetMaterial = new BitmapAssetMaterial("Pic", true);
  41.             _picmaterial1.doubleSided = true;
  42.             _picmaterial2.doubleSided = true;
  43.             _plane1 = new Plane(_picmaterial1);
  44.             _plane2 = new Plane(_picmaterial1, 300, 300, 4, 4);
  45.             _plane3 = new Plane(_picmaterial2, 300, 300);
  46.            
  47.             _plane1.x = -450;
  48.             _plane3.x = 450;
  49.             scene.addChild(_plane3);
  50.             scene.addChild(_plane1);
  51.             scene.addChild(_plane2);
  52.            
  53.             addEventListener(Event.ENTER_FRAME, renderHandler);
  54.         }
  55.        
  56.         private function renderHandler(e:Event):void {
  57.             _plane1.rotationY += 2;
  58.             _plane2.rotationY += 2;
  59.             _plane3.rotationY += 2;
  60.             renderer.renderScene(scene, camera, viewport);
  61.         }
  62.     }
  63. }

 
 
■セグメント数4,4にした時のスピード検証

ACTIONSCRIPT:
  1. package {
  2.     import flash.display.Sprite;
  3.     import flash.events.Event;
  4.     import org.papervision3d.cameras.Camera3D;
  5.     import org.papervision3d.render.BasicRenderEngine;
  6.     import org.papervision3d.scenes.Scene3D;
  7.     import org.papervision3d.view.Viewport3D;
  8.     import org.papervision3d.materials.BitmapAssetMaterial;
  9.     import org.papervision3d.objects.DisplayObject3D;
  10.     import org.papervision3d.objects.primitives.Plane;
  11.    
  12.     import net.hires.debug.Stats;
  13.    
  14.     public class Main2 extends Sprite {
  15.        
  16.         private var camera:Camera3D;
  17.         private var scene:Scene3D;
  18.         private var viewport:Viewport3D;
  19.         private var renderer:BasicRenderEngine;
  20.         private var _planeList:Array = [];
  21.        
  22.         public function Main2() {
  23.             scene = new Scene3D();
  24.             viewport = new Viewport3D(510, 280, true);
  25.             renderer = new BasicRenderEngine();
  26.             camera = new Camera3D();
  27.             addChild(viewport);
  28.            
  29.             camera.focus = 50;
  30.             camera.zoom = 1;
  31.             camera.x = 2000;
  32.             camera.y = 1100;
  33.             camera.z = -700;
  34.            
  35.             init();
  36.         }
  37.        
  38.         private function init():void {
  39.             //メモリ表示
  40.             addChild(new Stats());
  41.            
  42.             var _picmaterial:BitmapAssetMaterial = new BitmapAssetMaterial("Pic");
  43.             _picmaterial.doubleSided = true;
  44.            
  45.             for (var i:int = 0; i <= 6; i++) {
  46.                 for (var j:int = 0; j <= 8 ; j++) {
  47.                     var plane:Plane = new Plane(_picmaterial, 300, 300, 4, 4);
  48.                     plane.x = 500 * j;
  49.                     plane.y = 420 * i;
  50.                     scene.addChild(plane);
  51.                     _planeList.push(plane);
  52.                 }
  53.             }
  54.             addEventListener(Event.ENTER_FRAME, renderHandler);
  55.         }
  56.        
  57.         private function renderHandler(e:Event):void {
  58.             renderer.renderScene(scene, camera, viewport);
  59.             for (var i:int = 0; i <_planeList.length; i++) {
  60.                 _planeList[i].rotationY += 2;
  61.             }
  62.         }
  63.     }
  64. }

 
 
■presize=trueにした時のスピード検証

ACTIONSCRIPT:
  1. package {
  2.     import flash.display.Sprite;
  3.     import flash.events.Event;
  4.     import org.papervision3d.cameras.Camera3D;
  5.     import org.papervision3d.render.BasicRenderEngine;
  6.     import org.papervision3d.scenes.Scene3D;
  7.     import org.papervision3d.view.Viewport3D;
  8.     import org.papervision3d.materials.BitmapAssetMaterial;
  9.     import org.papervision3d.objects.DisplayObject3D;
  10.     import org.papervision3d.objects.primitives.Plane;
  11.    
  12.     import net.hires.debug.Stats;
  13.    
  14.     public class Main3 extends Sprite {
  15.        
  16.         private var camera:Camera3D;
  17.         private var scene:Scene3D;
  18.         private var viewport:Viewport3D;
  19.         private var renderer:BasicRenderEngine;
  20.         private var _planeList:Array = [];
  21.        
  22.         public function Main3() {
  23.             scene = new Scene3D();
  24.             viewport = new Viewport3D(510, 280, true);
  25.             renderer = new BasicRenderEngine();
  26.             camera = new Camera3D();
  27.             addChild(viewport);
  28.            
  29.             camera.focus = 50;
  30.             camera.zoom = 1;
  31.             camera.x = 2000;
  32.             camera.y = 1100;
  33.             camera.z = -700;
  34.            
  35.             init();
  36.         }
  37.        
  38.         private function init():void {
  39.             //メモリ表示
  40.             addChild(new Stats());
  41.            
  42.             var _picmaterial:BitmapAssetMaterial = new BitmapAssetMaterial("Pic", true);
  43.             _picmaterial.doubleSided = true;
  44.            
  45.             for (var i:int = 0; i <= 6; i++) {
  46.                 for (var j:int = 0; j <= 8 ; j++) {
  47.                     var plane:Plane = new Plane(_picmaterial, 300, 300);
  48.                     plane.x = 500 * j;
  49.                     plane.y = 420 * i;
  50.                     scene.addChild(plane);
  51.                     _planeList.push(plane);
  52.                 }
  53.             }
  54.             addEventListener(Event.ENTER_FRAME, renderHandler);
  55.         }
  56.        
  57.         private function renderHandler(e:Event):void {
  58.             renderer.renderScene(scene, camera, viewport);
  59.             for (var i:int = 0; i <_planeList.length; i++) {
  60.                 _planeList[i].rotationY += 2;
  61.             }
  62.         }
  63.     }
  64.    
  65. }

COMMENTS [2]

  1. morteza :

    tnx java me from iran

    4 月 17th, 2013 at 2:21:22
  2. amir mehdi zaheri :

    Hello.Thanks for your site!
    your site is the best of all!
    I am iranian.
    Please visit my web site and give a commenet.
    I visit your site on fridays.
    Good bye.See you soon!

    11 月 28th, 2014 at 16:20:31

トラックバック URL :