Five3d パッケージを使用して 3D でスプライトを描画し、それをアニメーション化してから、アプリのルートにシェイプを作成し、それを 3D でスプライトの上に重ねて移動しようとしています。私はそれを機能させるためにあらゆることを試みましたが、正しく並べることができないようです。視点がずれているように見えます。3d x、y とグローバル x、y の関係を調べた後、以下に示すメソッド 'local3dToGlobalXY' を作成しましたが、これはステージが 1024 / 768 の場合にのみ機能しました。Five3d パッケージの Sprite2d はこれを行うが、それも機能しないと言われました。私の「local3dToGlobalXY」メソッドと同じ結果になります。
赤い星は 3D のスプライトで、2 つの十字線は異なるスコープに描画されます。1 つは私が推奨された Sprite2d に描画され、もう 1 つはルートに描画されます。
誰かがこれに遭遇したか、私が間違ったことを指摘できることを願っています。
ありがとう、J
/**
* ...
* @author James Jordan
*/
public class Main extends Sprite
{
private var s3D:Sprite3D;
private var _scene:Scene3D;
private var _s:Sprite3D;
private var star3D:Shape3D;
private var t:Timer;
private var crossHairs2D:Sprite;
private var otherPlane:Sprite2D;
private var _plane:Sprite3D;
private var crossHairsRoot:Sprite;
private var animationPlane:Sprite3D;
private var crossHairsPlane:Sprite2D;
private var starsPlane:Sprite3D;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
animationPlane = new Sprite3D();
starsPlane = new Sprite3D();
animationPlane.addChild(starsPlane);
crossHairsPlane = new Sprite2D();
animationPlane.addChild(crossHairsPlane);
_scene = new Scene3D();
_scene.x = stage.stageWidth / 2;
_scene.y = stage.stageHeight / 2;
_scene.addChild(animationPlane);
addChild(_scene);
star3D = drawStar(starsPlane);
crossHairs2D = drawGlobalShape(crossHairsPlane, 0xff000, 10);
crossHairsRoot = drawGlobalShape(root, 0x0000ff, 5);
t = new Timer(1000, 0);
t.addEventListener(TimerEvent.TIMER, onTimer);
t.start();
}
private function onTimer(e:TimerEvent):void
{
TweenLite.to(star3D, 1, { x:(Math.random() * stage.stageWidth) - (stage.stageWidth/2), y:(Math.random() * stage.stageHeight) - (stage.stageHeight / 2), z:(Math.random() * 500), onUpdate:onTweenUpdate } );
}
private function onTweenUpdate():void
{
var p:Point = local3dToGlobalXY(starsPlane, new Point3D(star3D.x, star3D.y, star3D.z));
crossHairs2D.x = p.x - stage.stageWidth / 2;
crossHairs2D.y = p.y - stage.stageHeight / 2;
crossHairsRoot.x = p.x;
crossHairsRoot.y = p.y;
}
private function local3dToGlobalXY(_s:Sprite3D, p3d:Point3D):Point
{
var m:Matrix3D = _s.concatenatedMatrix;
var newP3d:Point3D = m.transformPoint(p3d);
var globalPoint:Point = _s.local3DToGlobal(new Vector3D(newP3d.x, newP3d.y, newP3d.z));
return globalPoint;
}
private function drawStar(parent:Sprite3D):Shape3D {
var starShape:Shape3D = new Shape3D();
DrawingUtils.star(starShape.graphics3D, 5, 30, 20, (45 / 180) * Math.PI, 0xff0000);
parent.addChild(starShape);
return starShape;
}
private function drawGlobalShape(p:*, c:uint, lineWeight:Number):Sprite
{
var d:Sprite = new Sprite();
d.graphics.lineStyle(lineWeight, c);
d.graphics.moveTo( -20, 0);
d.graphics.lineTo(20, 0);
d.graphics.moveTo( 0, -20);
d.graphics.lineTo(0, 20);
d.graphics.endFill();
p.addChild(d);
return d;
}
}