【发布时间】:2022-01-12 12:01:29
【问题描述】:
我们正在渲染一个带有火焰的等距网格,其中每个图块都是一个组件,但我们在 Transform2D 的源代码中找到了这条注释
用户不得修改返回的矩阵。
/// The total transformation matrix for the component. This matrix combines
/// translation, rotation, reflection and scale transforms into a single
/// entity. The matrix is cached and gets recalculated only as necessary.
///
/// The returned matrix must not be modified by the user.
Matrix4 get transformMatrix {
if (_recalculate) {
// The transforms below are equivalent to:
// _transformMatrix = Matrix4.identity()
// .. translate(_position.x, _position.y)
// .. rotateZ(_angle)
// .. scale(_scale.x, _scale.y, 1)
// .. translate(_offset.x, _offset.y);
final m = _transformMatrix.storage;
final cosA = math.cos(_angle);
final sinA = math.sin(_angle);
m[0] = cosA * _scale.x;
m[1] = sinA * _scale.x;
m[4] = -sinA * _scale.y;
m[5] = cosA * _scale.y;
m[12] = _position.x + m[0] * _offset.x + m[4] * _offset.y;
m[13] = _position.y + m[1] * _offset.x + m[5] * _offset.y;
_recalculate = false;
}
return _transformMatrix;
}
它似乎确实有效,所有图块都是它自己的组件,每个组件只呈现一个彩色矩形。 (Matrix4.isometric() 是我们的扩展)。
IsometricGrid 扩展了 PositionComponent
IsometricGrid({
this.tiles = const [],
this.rows = 1,
this.columns = 1,
this.tileWidth = 1,
this.tileHeight = 1,
}) : super() {
final isometricMatrix = Matrix4.isometric();
transformMatrix.multiply(isometricMatrix);
projectionMatrix = isometricMatrix;
inverseProjectionMatrix = Matrix4.inverted(projectionMatrix);
}
我们得到
但我们后来想用 IsometricGrid.addActor 向网格中添加一个演员
addActor(PositionComponent actor) {
actor.transform.transformMatrix.multiply(inverseProjectionMatrix);
add(actor);
}
哪个广告角色直立在网格上。但是一旦我们通过改变它的位置将actor移动到第2列第3行,矩阵似乎为actor重置了。
在火焰引擎中修改矩阵的惯用方法是什么?似乎在某些情况下矩阵只是重置。我认为这是因为它只是在您进行旋转、位置或缩放等转换时重新计算矩阵。
我们正在使用 Flutter web 构建它,我们还注意到有时当使用 alt 选项卡时,矩阵会重置。
【问题讨论】: