1

我正在尝试构建一个在 stage3d 中工作的 2d sprite 类,缩放和平移都还可以,但是旋转不正确。当我使用 matrix3d 附加旋转时,就像这些一样。

        var m:Matrix3D = new Matrix3D();
        m.appendRotation(getTimer()/40, Vector3D.Z_AXIS);
        context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, m, true);

好像它旋转了整个 3d 上下文,因为 3d 上下文有它自己的宽度和高度,所以图片看起来像是被拉伸了,哈哈,当我写到这里时,我得到了答案,所以将 context3D 设置为正方形大小解决了这个问题

        context3D.configureBackBuffer(1600, 1600, 1, true);

所以我的新问题是如何将 context3D 设置为仅存在于特定区域。如果 swf 舞台大小为 1900x1000,我配置一个后台缓冲区 1900x1900,希望它只存在于矩形(200,200,1200,600)中,该区域外的任何内容会被剪掉,我该怎么办?

更新:

在二维舞台上画四个块可以解决问题,需要更好的方法。

更新2:

使用 scissor api 也可以解决这个问题

context3D.setScissorRectangle(new Rectangle(0,0,1600,900));

但是建一个广场仍然是一个巨大的浪费,需要更好的方法

更新3:

最后我得到了正确的答案。你需要使用 matrix3d 将每个像素从 ((0,0),(1,0),(0,1)) 坐标世界转换为 ((0,0),(0.5/stage3dwidth ,0),(-0.5/stage3dHeight,0)) 坐标世界。这里是平移矩阵,建议 3d 舞台大小为 1600x900

    var m2:Matrix3D = new Matrix3D();
    m2.appendScale(1,-1,1);
    m2.appendTranslation(-800,450,0);
    m2.appendScale(1/800,1/450,1);
    m.append(m2);
4

2 回答 2

1

最后我得到了正确的答案。你需要使用 matrix3d 将每个像素从 ((0,0),(1,0),(0,1)) 坐标世界转换为 ((0,0),(0.5/stage3dwidth ,0),(-0.5/stage3dHeight,0)) 坐标世界。这里是平移矩阵,建议 3d 舞台大小为 1600x900

var m2:Matrix3D = new Matrix3D();
m2.appendScale(1,-1,1);
m2.appendTranslation(-800,450,0);
m2.appendScale(1/800,1/450,1);
m.append(m2);
于 2013-08-27T05:27:25.740 回答
0

不确定您是否已经知道,但Starling可以减轻您在尝试创建自己的包含 Stage3D 的 2D 库时遇到的痛苦。

它得到了 Adob​​e 的大力支持,并且可能是您在性能和可用性方面可以实现的缩影。

如果你真的想让它自己工作,你至少可以看看 Starling 的来源。

于 2013-07-31T04:25:49.583 回答