カメラの設定

カメラ

 3D空間がただ有るだけではドコを表示すればいいのか分かりません。
そこで、作成した3D空間にTVカメラを設置して撮影した風景をモニターに映し出してやるような イメージで、モニターに映し出す場所を設定します。
深く考えず名前通りにビデオカメラを設置すると思ってください。

 カメラを設定して使うのは簡単です。
ですが、同じ映像でもカメラアングルの工夫しだいで映画のような構図や迫力のある映像 が表示できるあたり、実は非常におくの深い機能だったりします。
この辺はカメラや映画撮影テクニックとかの本とか読んで調べてください。私はわかりません。(^ ^;

カメラの設定

カメラの位置や向きなどの設定方法を覚えれば、カメラを自由に動かすことが出来るようになります。

カメラのデフォルト位置
通常、設定するのは次の3つです。

  • カメラの位置
  • カメラの向き
  • カメラの姿勢

 これらは最初は特に設定しなくてもデフォルトの値が設定されています。
おおよそ右のような状態になっています。(距離は違うかもしれませんが…。)
カメラの頭がY方向を向いていて、カメラは座標(0,0,0)の方向を向いている。


 さて、デフォルト設定のままで使っていてもしょうがないので、設定を変えてみましょう。
カメラの設定位置はメインループの内側と外側どちらでもかまいません。
カメラの設定をする命令や状態を取得する命令などいろいろありますんで、状況に合わせて使い分けてください。
E3DSetCameraDeg カメラの向きを指定する。
E3DSetCameraPos カメラの位置を指定する。
E3DSetCameraTarget カメラの注視点を指定する。
E3DSetCameraTwist カメラをツイスト(ロール)させます。
etc...

普通に使う分にはE3DSetCameraPosでカメラを置く場所を設定して、E3DSetCameraTargetで、カメラが捕らえる 座標(PCなどの座標)などを設定すれば十分だと思います。

サンプル

 タコのモデルを表示させるだけのサンプルにカメラを設定しました。
パラメータをデフォルト位置にあわせてあるので数値を適当に変えたりしてみてください。

 タコのモデルファイルはEasy3Dのサンプルにtako.sigというファイル名で含まれています。
tako.sigとtako01.bmpをmediaフォルダ内に入れてから実行してください。

;
;	カメラを設定する
;

#include "e3dhsp3.as"

	;/////////////////
	;
	;	初期化
	;
	wid = 0		;ウインドウID
	objid = -1	;オブジェクトID
	fullscreenflag = 0		;フルスクリーンフラグ
	bits = 16	;色数ビット数(fullscreenflag = 1 のときのみ有効)
	multisamplenum = 0		;アンチエイリアスのマルチサンプル数(0,2~16)
	;scid	スワップチェインID
	E3DInit wid, objid, fullscreenflag, bits, multisamplenum, scid


	;/////////////////
	;
	;	形状データのロード
	;
	sdim mediadir, 2048
	mediadir = dir_cur + "\\Media\\tako.sig"
	E3DSigLoad mediadir, hsid1
;	E3DSetPos hsid1, 0, 0, 0
	frameno1 = 0	;モーションは使用しない。

	;/////////////////
	;
	;	カメラの初期化
	;
	camposx = 0 : camposy = 1000 : camposz = -4200
;	camposx = 0 : camposy = 0 : camposz = 4200	;デフォルト値
	E3DSetCameraPos camposx, camposy, camposz	;カメラ座標を設定
	targetx = 0		;注視点座標
	targety = 0
	targetz = 0
	upvecx = 0		;カメラの上方向のベクトル
	upvecy = 1
	upvecz = 0
	E3DSetCameraTarget targetx, targety, targetz, upvecx, upvecy, upvecz	;カメラの注視点を設定


;/////////////////
;
;	メインループ
;
*main
	E3DBeginScene	;-----シーンスタート
		E3DChkInView scid, hsid1	;モデルが、視野内にあるか判定
		;バックバッファへの書き込み作業を行う

		stick key
		if key&128 : goto *bye
		;不透明部分の描画をする
		E3DRender scid1, hsid1, 0, frameno1, 0	;バックバッファにレンダリングする。(タコ描画)
		;半透明部分の描画をする
		E3DRender scid1, hsid1, 1, frameno1, 0, 0, 0, 1

	E3DEndScene			;-----シーン終了
	E3DPresent scid1	;バックバッファの内容を、プライマリバッファに転送。描画する。

	E3DWaitByFPS 60, chkfps1 : await 0
	title ""+chkfps1 + " FPS"

goto *main


;
;	終了処理
;
*bye
	E3DBye
	end