纹理旋转没有正确

时间:2013-07-31 01:52:13

标签: actionscript-3 stage3d

我正在尝试构建一个在stage3d中工作的2D精灵类,缩放和平移是正常的,但旋转不正确。当我使用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),任何内容输出该区域将被削减,我该怎么办?

更新

在第二阶段绘制四个区块可以解决问题,需要更好的方法。

UPDATE2:

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

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

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

UPDATE3:

最后我得到了正确的答案。你需要使用matrix3d将((0,0),(1,0),(0,1))坐标世界中的每个像素转换为((0,0),( 0.5 / stage3dwidth,0),( - 0.5 / stage3dHeight,0))cordinate world.here是翻译矩阵,建议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);

2 个答案:

答案 0 :(得分:1)

最后我得到了正确的答案。你需要使用matrix3d将((0,0),(1,0),(0,1))坐标世界中的每个像素转换为((0,0),( 0.5 / stage3dwidth,0),( - 0.5 / stage3dHeight,0))cordinate world.here是翻译矩阵,建议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);

答案 1 :(得分:0)

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

它得到了Adobe的大力支持,可能是您在性能和可用性方面取得的成就的缩影。

如果你真的想让自己有效,你至少可以看看Starling的来源。