Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash透视图_Flash_Actionscript 3_3d_Haxe - Fatal编程技术网

Flash透视图

Flash透视图,flash,actionscript-3,3d,haxe,Flash,Actionscript 3,3d,Haxe,我有一个2D图像,我想在真3D中绘制,并围绕其中心旋转 我使用的是ActionScript3代码(实际上是Haxe,没有IDE),我正在努力通过实验发现这些值 我有一个显示对象。如果我使用rotateZ=45,对象将围绕其左上角旋转,而不是围绕中心旋转;更复杂的Display.transform.matrix类似rotate(Math.PI/4)的工作方式也一样。如何绕DisplayObject的XY中心在Z轴上旋转 那么,我该如何让视角发挥作用呢?透视图是相对于父对象还是旋转后的对象 我在Di

我有一个2D图像,我想在真3D中绘制,并围绕其中心旋转

我使用的是ActionScript3代码(实际上是Haxe,没有IDE),我正在努力通过实验发现这些值

我有一个显示对象。如果我使用
rotateZ=45
,对象将围绕其左上角旋转,而不是围绕中心旋转;更复杂的
Display.transform.matrix
类似
rotate(Math.PI/4)
的工作方式也一样。如何绕DisplayObject的XY中心在Z轴上旋转

那么,我该如何让视角发挥作用呢?透视图是相对于父对象还是旋转后的对象


我在DisplayObject实例上使用什么旋转和位置?透视变换的值是什么,我应该在什么对象上应用它们?

您可以使用
rotationX、rotationY、rotationZ
对象属性来更改透视,但它只在flashplayer>9中起作用,如果您没有更多的控制权,我建议您使用papervision3d库(例如相机视野、缩放等).

我对你的问题有点困惑,但这是一个有趣的问题

您是否有一些等轴测工作,并希望渲染透视投影视图或其他方式?您有透视视图,是否要进行等轴测

在Flash CS4 IDE中,您可以使用“3D”几个参数进行播放。我把一堆电影剪辑成一个立方体来说明这一点

这是立方体,在Y轴上旋转45度,然后在X轴上旋转45度,如“变换”面板中所示:

这是同一个立方体,其透视角度在右侧“特性检查器”的“三维位置和视图”组中更改

IDE中的属性可以通过actionscript进行控制。每个DisplayObject都有一个transform属性,该属性保存控制2D和3D属性的对象的引用,如:矩阵、矩阵3D、透视投影等

您可以通过PerspectiveProjection属性控制透视失真

假设长方体剪辑名为box,我可以将其视野设置为非常小的值(仅允许值大于0小于180),就是这样

e、 g

关于轨道飞行,看看这个。它还解释了一种绕轨道运行的方法。取决于你想要达到的目标,它可能是

这里有一些as3等轴测库,比如和,但是 我不确定你到底需要什么。正如antpaw所说,如果您正在开发更大的东西,您可能会使用灵活的3D API,如或

我们制作了一个有趣的等距界面,用于可视化tweets,名为。我们用了papervision

更新

似乎您需要围绕枢轴动态旋转。可以使用变换矩阵来实现这一点。以下是如何在2D中执行此操作的

/**
     * Rotates a matrix about a point defined inside the matrix's transformation space.
     * This can be used to rotate a movie clip around a transformation point inside itself. 
     *
     * @param m A Matrix instance.
     *
     * @param x The x coordinate of the point.
     *
     * @param y The y coordinate of the point.
     *
     * @param angleDegrees The angle of rotation in degrees.
     * @playerversion Flash 9.0.28.0
     * @langversion 3.0
     * @keyword Matrix, Copy Motion as ActionScript    
     * @see flash.geom.Matrix         
     */
    public static function rotateAroundInternalPoint(m:Matrix, x:Number, y:Number, angleDegrees:Number):void
    {
        var point:Point = new Point(x, y);
        point = m.transformPoint(point);
        m.tx -= point.x;
        m.ty -= point.y;
        m.rotate(angleDegrees*(Math.PI/180));
        m.tx += point.x;
        m.ty += point.y;
    }



    /**
     * Rotates a matrix about a point defined outside the matrix's transformation space.
     * This can be used to rotate a movie clip around a transformation point in its parent. 
     *
     * @param m A Matrix instance.
     *
     * @param x The x coordinate of the point.
     *
     * @param y The y coordinate of the point.
     *
     * @param angleDegrees The angle of rotation in degrees.
     * @playerversion Flash 9.0.28.0
     * @langversion 3.0
     * @keyword Matrix, Copy Motion as ActionScript    
     * @see flash.geom.Matrix       
     */
    public static function rotateAroundExternalPoint(m:Matrix, x:Number, y:Number, angleDegrees:Number):void
    {
        m.tx -= x;
        m.ty -= y;
        m.rotate(angleDegrees*(Math.PI/180));
        m.tx += x;
        m.ty += y;
    }
不过代码不是我的,它是Adobe的(我猜是Robert Penner的),是类的一部分

现在,对于3D,更容易了,因为Matrix3D类有像和这样的旋转方法,它们接受3个参数:

  • 学位:数字
  • 轴:矢量3D
  • 枢轴点:Vector3D
因此,您可以轻松地将长方体在X轴上旋转30度,大约0,0,0,如下所示:

var m:Matrix3D = box.transform.matrix3D;
m.prependRotation(30,Vector3D.X_AXIS,new Vector3D(0,0,0));
再次查看devnet文章、和类

如果你想获得关于向量、矩阵和变换的更深入的知识,你可以检查一下,整个事情都解释得很好,而且只是数学,所以你学到的东西在任何3d设置中都很方便(纯as3、away3d、papervision、openGL等)

嗯,,
George

一种非常常见的方法是使用pivot DisplayObjectContainer,将实际平面添加到该容器中,并将其从中心偏移。然后实际旋转容器

var pivot : DisplayObjectContainer;

// plane is a display object (e.g. Sprite) that has been created previuosly
// and contains your 2D image.
plane.x = -plane.width/2;
plane.y = -plane.height/2;
pivot.addChild(plane);

pivot.rotationY = 45;
在这里,平面放置在名为pivot的容器中,并偏移其宽度和高度的一半。这意味着平面显示对象的中心将与容器的注册点(原点)对齐。现在围绕原点旋转容器(轴)将围绕同一点旋转其所有子对象,包括平面

这通常比矩阵变换更容易处理。尤其是当3D矩阵很容易变得难以理解时,除非你对数学很熟悉

此外,在重置矩阵之前,仅修改plane.transform.matrix3D矩阵对象不会影响显示对象。例如,如果您使用的是tween引擎,那么这可能非常乏味,您可能需要一个每次重置矩阵的更新事件处理程序,如下所示:

plane.transform.matrix3D = myModifiedMatrix3D;

使用轴方法,您可以简单地在rotationX/Y/Z属性之间切换。

是的,但是值是什么?我是否必须按特定顺序设置它们,例如,在添加位图之前将透视变换设置为场景,或者?谢谢George;我试着稍微改变我的问题的措辞,以避免等距。我也修改了我的答案,正如你在更新中看到的。祝你好运!听起来像是围绕对象左上角的注册点旋转。这是最简单的方法。已确认,适用于我,并大大简化了我的代码。
plane.transform.matrix3D = myModifiedMatrix3D;