スタートページJavascriptCANVASWebGL

WebGL Three.js  カメラの位置と特性


図のように、点 (100, 100, 0) を中心とした一辺 200 の立方体があり、 (0,0,1000) の位置(原点と垂直に手前に1000の位置)にカメラがあります。そのカメラの位置や特性を変えたときの、立方体の見え方を調べます。

カメラ特性 ctype = 視角 fov= 縦横比 aspect= 最近距離 near= 最遠距離 far=
位置 positionx= positiony= positionz=
回転 rotationx= rotationy= rotationz=
撮影方向 lookatx= lookaty= lookatz=
注 ctype=0 PerspectiveCamera  遠近法を用いているので、カメラとの距離で物体の大小が変わります。
  ctype=1 OrthographicCamera 平行法を用いているので、距離による変化は発生しません。
  回転では、どれかに30や45など2以上の値があれば、その回転位置に移動して固定、
  すべてが0・1ならば、1を付けた方向に連続的に回転します。(ここだけのルールです。)

設定 
  ここでの基準となる標準ケースに戻します。
特性 ctype 
  0 PerspectiveCamera(遠近法)、1 OrthographicCamera(平行法)
視角 fov 
  視角を大にすると、広角撮影になり、物体が小さくなります。
  視角を小にすると、望遠撮影になり、物体が大きくなります。
縦横比 aspect 
  通常は CANVAS の width/height の値にします。それより大だと縦長(正確には横圧縮)になります。
距離 near, far 
  カメラからの距離が near ~ far の間の部分だけを表示します。
  近くの遮蔽物や遠方の邪魔物を排除するときに有用です。
位置 positionz 
  カメラの位置は、横 = positionx, 高さ = positiony から垂直に positionz 手前の位置にあります。
  positionz を小にすれば、カメラが近距離にあることになり、物体が大きくなります。
  しかし、カメラは座標空間の外にあることが必要なので、それより小さくすることはできません。
位置 positionx 
  横にずれた位置に置いた場合です。物体は反対側に移動したように見えます。
  positiony についても同様です。
回転 rotation(指定角度) 
  rotation のいずれかに1より大の値があると、カメラがその角度に移動して原点に向かって撮影します。
回転 rotation(連続回転) 
    0を指定した方向は固定、1を指定した方向に連続的に360°回転して撮影した動画になります。
撮影方向 lookat  
  回転をしたとき、カメラをどの方向に向けるかの指定です。

カメラに関する記述方法

        :
    // ========================================== シーンの作成
        :
    // ========================================== カメラの作成
    // カメラの撮影特性
    if (ctype == 0) var camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
    else camera = new THREE.OrthographicCamera(-400, 400, 400, -400, near, far);
    // カメラの初期位置
    camera.position.set(positionx, positiony, positionz);

    //  オブジェクト(被写体)を作成

    // ====================== カメラの移動
    // 平行移動
    camera.position.x = positionx;
       :
    // 回転移動
    var radian = rotationx *  Math.PI / 180;  // 度表示の rotationx をラジアン表示にする
    camera.position.x = positionz * Math.sin(radian); // 新X座標の値
       :
    // 撮影方向
    camera.lookAt(new THREE.Vector3(lookatx, lookaty, lookatz));
          // 単にcamera.lookAt(100,200,0) のような記述は不可
    // ====================== 撮影
    renderer.render(scene, camera);