概要
簡易3D(1) - サイズの変更
の続きです。
の続きです。
前回はzposの値に応じて、オブジェクトのサイズ(スケール)を変更しました。
今回はオブジェクトの位置も変更するように設定してみましょう。
今回はオブジェクトの位置も変更するように設定してみましょう。
位置の変更
なので値に応じて位置を変更してみましょう。
位置の計算
仮に、消失点が(200, 200)、円を描いた位置が(100, 100)だとします。
zの値が0だと、等倍になるということで、そのまま(100, 100)のところに円が配置されます。
zの値が前回設定したZ_MAX(1000)だと、消失点の位置に円が配置されます。
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になります。
zが500だと、z / Z_MAXが0.5になります。
0.5ということは、100~200のちょうど真ん中の位置にある値を取り出すわけですから、
計算式は、100 + (200 - 100) * 0.5になりますね。
計算式は、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)
Point型のvpが消失点です。(Vanishing Point)
消失点を考慮に入れた実際の表示位置x, yと、z=0(等倍)のときの表示位置x, yを分けておかないといけません。
なので、新しくrx, ry変数を用意しています。
なので、新しく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;
}
}
}
このwikiの更新情報RSS