LoginSignup
2
2

More than 5 years have passed since last update.

Away3D Tips "Transformation of 3D coords and 2D coords"

Last updated at Posted at 2013-02-28

Utility

/**
 * 床のマウス座標(2D座標)から3D座標を求める
 * 用途: マウスカーソルに追随する床の目印など 
 */
public function get3DcoordsFrom2D():Vector3D
{
    if (!isNaN(mouseX) && !isNaN(mouseY)){
        var pico:PickingCollisionVO = view.mousePicker.getViewCollision(mouseX, mouseY, view);
        if (pico){
            return new Vector3D(pico.localPosition.x, pico.localPosition.y, pico.localPosition.z);
        }
    }
    return null;
}

/**
 * メッシュの3D座標からスクリーン2D座標を求める
 * 用途: キャラクターの頭上に表示する2Dのインジケータなど
 */
public function get2DcoordsFromMesh(mesh:Mesh):Point
{
    var pos2D:Vector3D = view.project(mesh.sceneTransform.position);
    return new Point(pos2D.x, pos2D.y);
}

準備

view.mousePickerに反応させるためには、床オブジェクトに対して以下の操作が必要です。

floor.mouseEnabled = true;

使い方

enterframe内

var vec:Vector3D = get3DcoordsFrom2D();
if(vec){
    mesh.x = vec.x;
    mesh.z = vec.z;
}
var p:Point = get2DcoordsFromMesh(mesh);
square.x = p.x - square.width/2;
square.y = p.y - square.height; //高さに調整必要
view.render();

その他

  • 実際に使う際はreturn で newさせるのではなくお好みで値を設定させるなどしてください
  • キャラの頭に設定したいときは、インジケータ用ダミーのMeshを頭に設定するときれいにハマります
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2