我如何才能 push/pop 只是上下文的 2d/3d 转换,而不是完整的上下文?
How can I push/pop just the context's 2d/3d transformation, not the full context?
到目前为止我只使用
var context = canvas.getContext('2d');
但将来某个时候我也会使用 3d,所以我正在寻求更多的理解以做好准备。
OpenGL 中的 glPushMatrix()
调用非常便宜,用 glPushMatrix()
—glPopMatrix()
括起代码段是标准做法,只有微不足道的损失。
我正在将这个习惯带到 canvas 中的二维上下文中,并用 context.save()
—context.restore()
对包装代码块,但这样做至少有一个 的严重问题。最简单的解决方案是避免这种做法,直接明确设置转换。
这在 2d 中不会太糟糕,但它会违背标准 3d 编码的原则。所以我想知道:
- 是否可以 push/pop 只是上下文的二维变换?
- 是否可以 push/pop 只是上下文的 3d 转换?
glPushMatrix
和 glPopMatrix
已经 25 岁了,早就被弃用了
是的,您在很多 OpenGL 示例中看到它们,它们被认为是旧的不良做法。
WebGL 基于现代 OpenGL 实践。因此它只是一个栅格化 API,不包括 glPushMatrix
和 glPopMatrix
。相反,它只提供着色器,您可以提供自己的数学库。
所以
Is it possible to push/pop just the context's 2d transformation?
是的,context.save
和 context.restore
这样做。它们还保存和恢复上下文状态的所有其余部分,例如当前的 fillStyle
、strokeStyle
、lineWidth
、globalCompositingOperation
等...
如果您只想 save/restore 转换本身,答案是否定的,它不是内置的,但是您可以自己实现。 Here's some code that wraps the canvas to track the transformation。重点是 而不是 以提供更快的 save/restore。关键是只提供当前转换,因为 CanvasRenderingContext2D
api 不提供查询当前转换的方法,如果某些应用程序想要进行碰撞检测或其他操作,则需要这种方法。
使用一些类似的代码,您可以轻松地提供仅推送和弹出的转换。是否会增加净速度尚不清楚,因为它必须在 JavaScript 中对所有转换命令进行矩阵数学运算(例如:translate
、rotate
、scale
)
Is it possible to push/pop just the context's 3d transformation?
WebGL 中没有这样的东西。如果你想要那个,你可以编写自己的数学库并向其添加推送和弹出功能,或者找到一个已经具有该功能的库。您是否认为答案是“否”(WebGL 中没有这样的事情)或“是”(您可以自己实现)取决于您。
到目前为止我只使用
var context = canvas.getContext('2d');
但将来某个时候我也会使用 3d,所以我正在寻求更多的理解以做好准备。
OpenGL 中的 glPushMatrix()
调用非常便宜,用 glPushMatrix()
—glPopMatrix()
括起代码段是标准做法,只有微不足道的损失。
我正在将这个习惯带到 canvas 中的二维上下文中,并用 context.save()
—context.restore()
对包装代码块,但这样做至少有一个
这在 2d 中不会太糟糕,但它会违背标准 3d 编码的原则。所以我想知道:
- 是否可以 push/pop 只是上下文的二维变换?
- 是否可以 push/pop 只是上下文的 3d 转换?
glPushMatrix
和 glPopMatrix
已经 25 岁了,早就被弃用了
是的,您在很多 OpenGL 示例中看到它们,它们被认为是旧的不良做法。
WebGL 基于现代 OpenGL 实践。因此它只是一个栅格化 API,不包括 glPushMatrix
和 glPopMatrix
。相反,它只提供着色器,您可以提供自己的数学库。
所以
Is it possible to push/pop just the context's 2d transformation?
是的,context.save
和 context.restore
这样做。它们还保存和恢复上下文状态的所有其余部分,例如当前的 fillStyle
、strokeStyle
、lineWidth
、globalCompositingOperation
等...
如果您只想 save/restore 转换本身,答案是否定的,它不是内置的,但是您可以自己实现。 Here's some code that wraps the canvas to track the transformation。重点是 而不是 以提供更快的 save/restore。关键是只提供当前转换,因为 CanvasRenderingContext2D
api 不提供查询当前转换的方法,如果某些应用程序想要进行碰撞检测或其他操作,则需要这种方法。
使用一些类似的代码,您可以轻松地提供仅推送和弹出的转换。是否会增加净速度尚不清楚,因为它必须在 JavaScript 中对所有转换命令进行矩阵数学运算(例如:translate
、rotate
、scale
)
Is it possible to push/pop just the context's 3d transformation?
WebGL 中没有这样的东西。如果你想要那个,你可以编写自己的数学库并向其添加推送和弹出功能,或者找到一个已经具有该功能的库。您是否认为答案是“否”(WebGL 中没有这样的事情)或“是”(您可以自己实现)取决于您。