カメラ

3Dモデルと3Dシーンで作成した、物と空間が存在する3DCGの世界見るためにはカメラを設置する必要があります。設置するカメラには、3DCG空間でのカメラの位置と撮影する方向などを設定します。撮影したい3Dモデルがあっても、カメラがその3Dモデルの方向に正しく向いていないと思ったような結果を得る事ができません。

  カメラは動かすこともできますし、被写体にズームする事もできます。

  また、複数台設置する事もできますので、カメラを複数台設置して、カメラを切り替える(3DCGの世界を見る視点を替える)事もできます。

 

[カラフルな立方体]の作例を加工して、カメラの切り替えが分かるようにしてみました。"カメラ切り替え”ボタンを押すと、カメラが切り替わります。ソースコードを修正した箇所は赤字にしてあります。

INFO: Papervision3D Public Beta 2.0 - Great White (December 3rd, 2008)

//importするpapervisionのクラス
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;

 

//グローバル変数
var scene:Scene3D;
var viewport:Viewport3D;
var camera01:Camera3D; //マウスの動きに反応するカメラ
var camera02:Camera3D; //Cubeの回りを旋回するカメラ
var camera03:Camera3D; //固定カメラ

var render:BasicRenderEngine;
var cube:Cube;
var camera_num:uint = 0 ; //カメラの切り替え制御用変数
 

init3d();

 

function init3d():void{
         
    // cubeに着色するためのマテリアルを作成
    var material_front:ColorMaterial = new ColorMaterial(0x00ff00);
    var material_back:ColorMaterial = new ColorMaterial(0xfe9926);
    var material_right:ColorMaterial = new ColorMaterial(0x89bdde);
    var material_left:ColorMaterial = new ColorMaterial(0x0000ff);
    var material_top:ColorMaterial = new ColorMaterial(0xff0000);
    var material_bottom:ColorMaterial = new ColorMaterial(0x000000);  
  
    //マテリアルのリストを作成
    var material_list:MaterialsList = new MaterialsList({
                                                       front : material_front,
                                                       back : material_back,
                                                       right: material_right,
                                                       left : material_left,
                                                       top : material_top,
                                                       bottom : material_bottom
                                                       });
  
    // プリミティブのキューブを作成し、座標を設定する。
    cube = new Cube(material_list,150,150,150);
    cube.x =  0;
    cube.y =  0;
    cube.z =  0;
 
    // シーンを作成しキューブをシーンに加える
    scene = new Scene3D();
    scene.addChild(cube);
 
    // カメラの作成とカメラ座標の設定
    camera01 = new Camera3D();
    camera01.x = 500;
    camera01.y = 0;
    camera01.z = 500;
     
    camera02 = new Camera3D();
    camera02.x = 500;
    camera02.y = 0;
    camera02.z = 500; 
 
    camera03 = new Camera3D();
    camera03.x = 500;
    camera03.y = 500;
    camera03.z = 500;
 
    //カメラの選択状況を表示するTextFieldに初期値を設定
    camera_text.htmlText = "カメラ1:マウスに反応するカメラ";
  
    //ビューポートを作成
    viewport = new Viewport3D(200, 200);
    this.addChild(viewport);

    // レンダラの作成
    render = new BasicRenderEngine();  
 
    //カメラの切り替えボタンを押した時のイベント
    camera_button.addEventListener(MouseEvent.CLICK,select_camera, false, 0, true);
   
     //ENTER_FRAMEにてレンダリングを行う
    this.addEventListener(Event.ENTER_FRAME, render3D);
}


function select_camera(event:Event):void {

     camera_num++ ;
     camera_num = camera_num  %  3;
 
    if(camera_num == 0 ){
         camera_text.htmlText = "カメラ1:マウスに反応するカメラ";
    }else if(camera_num == 1){
         camera_text.htmlText = "カメラ2:旋回カメラ";
    }else{
         camera_text.htmlText = "カメラ3:固定カメラ";
    }
}


function render3D(event:Event):void {
  
   if (camera_num == 0 ){ //カメラの上下左右移動
      camera01.y =  (mouseY - stage.stageHeight * 0.5) *10 ;
      camera01.x = (mouseX - stage.stageWidth * 0.5) * 5  ;
      camera01.lookAt(cube);
      render.renderScene(scene, camera01, viewport);
  
   }else if(camera_num == 1){  //カメラがキューブの回りを旋回
      camera02.y =  (mouseY - stage.stageHeight * 0.5) *10 ;  
      var angleY:Number = (mouseX - stage.stageWidth * 0.5) *0.005 ;
      var cosY:Number = Math.cos(angleY);
      var sinY:Number = Math.sin(angleY);
      var x1:Number = camera02.x * cosY - camera02.z * sinY;
      var z1:Number = camera02.z * cosY + camera02.x * sinY;  
      camera02.x = x1;
      camera02.z = z1;
      camera02.lookAt(cube);
      render.renderScene(scene, camera02, viewport);
  
 }else{ //固定カメラ
      camera03.lookAt(cube);
      render.renderScene(scene, camera03, viewport);


 }

}