トップページ > 3D > 簡易3D(2) - 位置の変更



概要


前回はzposの値に応じて、オブジェクトのサイズ(スケール)を変更しました。
今回はオブジェクトの位置も変更するように設定してみましょう。


位置の変更

何で位置を変更する必要があるのかというと、3Dには消失点があるからです。
z(pos)の値を増やし続けると消失点に向かってサイズが小さくなるのは「消失点」の記事で解説しましたね。

なので値に応じて位置を変更してみましょう。


位置の計算

仮に、消失点が(200, 200)、円を描いた位置が(100, 100)だとします。

zの値が0だと、等倍になるということで、そのまま(100, 100)のところに円が配置されます。
zの値が前回設定したZ_MAX(1000)だと、消失点の位置に円が配置されます。

z(pos) (x, y)
0 (100, 100)
Z_MAX(1000) (200, 200)
になりますね。
後は前回と同じように計算するだけです。

zが0だと位置は変わりません。
zが500だと、z / Z_MAXが0.5になります。

0.5ということは、100~200のちょうど真ん中の位置にある値を取り出すわけですから、
計算式は、100 + (200 - 100) * 0.5になりますね。

一般化すると、x + (消失点 - x) * z / Z_MAXになります。(yも同じです)


private var Z_MAX:Number = 1000;
 
private var zpos:Number = 900;
private var vp:Point = new Point(stage.stageWidth / 2, stage.stageHeight / 2);
private var rect:Sprite;
private var rx:Number = 0; // z=0 時の位置x
private var ry:Number = 0; // z=0 時の位置y
 
public function Main()
{
	rect = new Sprite();
	rect.graphics.lineStyle(5.0);
	rect.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
	rect.graphics.endFill();
	addChild(rect);
 
	var scale:Number = zpos / Z_MAX;
	rect.scaleX = rect.scaleY = 1.0 - scale;
	rect.x = rx + (vp.x - rx) * scale;
	rect.y = ry + (vp.y - ry) * scale;
}
 
コードで書くとこのようになります。
Point型のvpが消失点です。(Vanishing Point)

消失点を考慮に入れた実際の表示位置x, yと、z=0(等倍)のときの表示位置x, yを分けておかないといけません。
なので、新しくrx, ry変数を用意しています。

zposやvpの値を弄って、どう変化するのかを確かめてみましょう。


検証用コード

package
{
	import flash.display.Sprite;
 
	import flash.geom.Point;
 
	public class Main extends Sprite
	{
		private var Z_MAX:Number = 1000;
 
		private var zpos:Number = 900;
		private var vp:Point = new Point(stage.stageWidth / 2, stage.stageHeight / 2);
		private var rect:Sprite;
		private var rx:Number = 0; // z=0 時の位置x
		private var ry:Number = 0; // z=0 時の位置y
 
		public function Main()
		{
			rect = new Sprite();
			rect.graphics.lineStyle(5.0);
			rect.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
			rect.graphics.endFill();
			addChild(rect);
 
			var scale:Number = zpos / Z_MAX;
			rect.scaleX = rect.scaleY = 1.0 - scale;
			rect.x = rx + (vp.x - rx) * scale;
			rect.y = ry + (vp.y - ry) * scale;
		}
	}
}
 

|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|