Question

i was trying to build a 2d sprite class that working in stage3d,the scale and translation was ok, but rotation is not right.when i use matrix3d to append a rotation,like these one.

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

it seems like it rotate the whole 3d context,since 3d context has it own width and height,so the picture looks like being stretched ,ha i got the answer when i write to here,so set context3D to a square size solved the problem

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

so my new question is how to set context3D only present in a specific area.if the swf stage size is 1900x1000 i configure a back buffer 1900x1900, hope it only present in rectangle(200,200,1200,600),any content out of the area would be clipped ,what can i do?

update:

draw four block on the 2d stage would solve the problem,need better approaches.

update2:

use a scissor api can solve this problem too

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

but it's still a huge waste for build a square,need better approaches

update3:

finally i got the right answer.you need to use matrix3d to transform every pixel from((0,0),(1,0),(0,1)) coordinate world to ((0,0),(0.5/stage3dwidth,0),(-0.5/stage3dHeight,0)) cordinate world.here's the translate matrix,suggest the 3d stage size is 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);
Was it helpful?

Solution

finally i got the right answer.you need to use matrix3d to transform every pixel from((0,0),(1,0),(0,1)) coordinate world to ((0,0),(0.5/stage3dwidth,0),(-0.5/stage3dHeight,0)) cordinate world.here's the translate matrix,suggest the 3d stage size is 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);

OTHER TIPS

Not sure if you know already, but Starling is around to alleviate the pain that you're experiencing in trying to create your own 2D library wrapping Stage3D.

It has strong support from Adobe and is likely the epitome of what you can achieve in terms of performance and usability.

If you do really want to get it working yourself, you can at least look at Starling's source.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top