Matrix 围绕自定义轴心点旋转

Matrix 围绕自定义轴心点旋转,matrix,dart,flutter,linear-algebra,perspective,Matrix,Dart,Flutter,Linear Algebra,Perspective,我真的不懂线性代数,因为这个问题,我正在努力学习它。 我敢肯定,对于那些懂线性代数的人来说,这是一个简单的问题 我将尝试解释并展示一些图片、视频和代码,以便更好地描述它 首先,乍一看,我的目标很简单。 就是创造 现在我设法做到了 正如你所看到的,我现在用“幻数”移动每个“页面”,我称之为幻数,因为我在线性代数方面非常在行,我在这里所做的是在我几乎没有理解的情况下+尝试和错误。显然不是正确的方式 我有一个delta,它基本上是从用户的delta中得到的一个偏移量 现在,我看到了这个立方体转换的所有

我真的不懂线性代数,因为这个问题,我正在努力学习它。 我敢肯定,对于那些懂线性代数的人来说,这是一个简单的问题

我将尝试解释并展示一些图片、视频和代码,以便更好地描述它

首先,乍一看,我的目标很简单。 就是创造

现在我设法做到了

正如你所看到的,我现在用“幻数”移动每个“页面”,我称之为幻数,因为我在线性代数方面非常在行,我在这里所做的是在我几乎没有理解的情况下+尝试和错误。显然不是正确的方式

我有一个delta,它基本上是从用户的delta中得到的一个偏移量

现在,我看到了这个立方体转换的所有示例,比如说在CSS中,它们只是旋转/转换了每一面。然后移动/旋转“摄影机”或我猜是父对象

我也尝试过这种方法:

像这样:

Widget getWidget(Type type)
{
    AlignmentGeometry alignmentGeometry;
    Matrix4 matrix4;

    switch (type)
    {
        case Type.PREVIOUS:
            alignmentGeometry = FractionalOffset.center;
            matrix4 = Matrix4.identity()
                ..setEntry(3, 2, 0.001) // perspective
                ..rotateY(-90.0 * math64.degrees2Radians)
                ..translate(deviceWidth / 2, 0.0, deviceWidth / 2);
            break;

        case Type.CURRENT:
            alignmentGeometry = FractionalOffset.center;
            matrix4 = Matrix4.identity()
                ..setEntry(3, 2, 0.001);
            break;

        case Type.NEXT:
            alignmentGeometry = FractionalOffset.center;
            matrix4 = Matrix4.identity()
                ..setEntry(3, 2, 0.001) // perspective
                ..rotateY(90.0 * math64.degrees2Radians)
                ..translate(-deviceWidth / 2, 0.0, deviceWidth / 2);
            break;
    }

    return new Transform(
        alignment: alignmentGeometry,
        transform: matrix4,
        child: new Container(
            color: type == Type.NEXT ? Colors.green : type == Type.PREVIOUS ? Colors.red : Colors.black.withOpacity(0.5),
        ),
    );
}
然后让我们简单地旋转父对象,对吗

Widget build(BuildContext context)
{
    List<Widget> widgets = [];

    widgets.add(getWidget(Type.PREVIOUS));
    widgets.add(getWidget(Type.CURRENT));
    widgets.add(getWidget(Type.NEXT));

    return new Scaffold(
        key: _scaffoldKey,
        body: new Container(
            color: Colors.black,
            child: new GestureDetector(
                child: new Container(
                    color: Colors.white,
                    child: new Transform(
                        alignment: FractionalOffset.center,
                        transform: Matrix4.identity()
                            ..setEntry(3, 2, 0.0001)
                            ..rotateY(45.0 * math64.degrees2Radians),
                            child: new Stack(
                                children: widgets,
                            ),
                    )
                ),
            )
        )
    );
}
小部件构建(构建上下文)
{
列表小部件=[];
add(getWidget(Type.PREVIOUS));
add(getWidget(Type.CURRENT));
add(getWidget(Type.NEXT));
归还新脚手架(
钥匙:_scaffoldKey,
主体:新容器(
颜色:颜色,黑色,
儿童:新的手势检测器(
子容器:新容器(
颜色:颜色,白色,
孩子:新的转变(
对齐:分馏loffset.center,
转换:Matrix4.identity()
..设置条目(3,2,0.0001)
..旋转(45.0*64度半径),
子:新堆栈(
孩子们:小部件,
),
)
),
)
)
);
}
否:

90度会让它消失

现在,我明白了,我需要一种“枢轴旋转点”,或者改变“原点”或“锚定点”,甚至不知道如何调用它

因此,为了描述它,让我们举例来说,我们也有一个底部。所以我想要底部的中心(比如说在立方体中)。所以它看起来是这样的:

现在,如果我在Y轴上旋转“原点”,我应该得到正确的动画,对吗

Widget build(BuildContext context)
{
    List<Widget> widgets = [];

    widgets.add(getWidget(Type.PREVIOUS));
    widgets.add(getWidget(Type.CURRENT));
    widgets.add(getWidget(Type.NEXT));

    return new Scaffold(
        key: _scaffoldKey,
        body: new Container(
            color: Colors.black,
            child: new GestureDetector(
                child: new Container(
                    color: Colors.white,
                    child: new Transform(
                        alignment: FractionalOffset.center,
                        transform: Matrix4.identity()
                            ..setEntry(3, 2, 0.0001)
                            ..rotateY(45.0 * math64.degrees2Radians),
                            child: new Stack(
                                children: widgets,
                            ),
                    )
                ),
            )
        )
    );
}