放大2D场景中的对象?

时间:2011-07-13 14:25:32

标签: c++

现在,我的相机转换为相机位置,然后按比例因子缩放。

  al_identity_transform(&mTransform);
    al_translate_transform(&mTransform,-mPosition.x, -mPosition.y);
    al_scale_transform(&mTransform,mScale,mScale);
    al_use_transform(&mTransform);

所以,如果我有一个400,400的物体并且我想要放大它(使400,400在屏幕的中心),我需要对相机位置做什么并缩放每一帧?目前,简单地增加mScale越来越接近原点(屏幕的左上角)。

由于

2 个答案:

答案 0 :(得分:1)

你需要有2个矩阵:一个摄像机矩阵,可以转换摄像机视图中世界空间中的任何一个点,以及一个可以平移/缩放/旋转任何对象的模型矩阵。

最终的顶点位置方程是:

camera_matrix * modelview_matrix * Vertex_position(顶点位置是您的初始顶点坐标)。

如果您需要一些帮助来构建矩阵,我在当前项目中使用自定义矩阵。您可以在http://www.github.com/tuxerr/City找到来源。 modelview矩阵在src /中的matrix4.cpp中,相机矩阵在src /中的scene.cpp中。

祝你好运:)

答案 1 :(得分:1)

如果屏幕 W 宽且 H 高,原点位于左上角,右侧是 x ,正向 y 向下,然后为了确保在(a,b)处呈现的像素位于屏幕的中心,您需要将该点转换为(<强> W / 2 下,* H / 2 *)。这很简单:

al_identity_transform(&mTransform);
al_translate_transform(&mTransform,W/2-a, H/2-b);

如果要放大该点,则必须将该点转换为原点,应用比例,然后将该点转换回屏幕中心:

al_translate_transform(&mTransform,-W/2, -H/2);
al_scale_transform(&mTransform,mScale,mScale);
al_translate_transform(&mTransform, W/2, H/2);

当然,您可以将前两个翻译结合起来:

al_identity_transform(&mTransform);
al_translate_transform(&mTransform,-a, -b);
al_scale_transform(&mTransform,mScale,mScale);
al_translate_transform(&mTransform, W/2, H/2);

其中说,

  1. 以身份开始,
  2. 将点(a,b)移动到原点
  3. mScale
  4. 缩放原点
  5. 将原点处的任何内容移动到屏幕中间。