Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 放大2D场景中的对象?_C++ - Fatal编程技术网

C++ 放大2D场景中的对象?

C++ 放大2D场景中的对象?,c++,C++,现在,我的相机转换到相机位置,然后按比例因子进行缩放 al_identity_transform(&mTransform); al_translate_transform(&mTransform,-mPosition.x, -mPosition.y); al_scale_transform(&mTransform,mScale,mScale); al_use_transform(&mTransform); 因此,如果我有一个40040

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

  al_identity_transform(&mTransform);
    al_translate_transform(&mTransform,-mPosition.x, -mPosition.y);
    al_scale_transform(&mTransform,mScale,mScale);
    al_use_transform(&mTransform);
因此,如果我有一个400400的对象,我想放大它(使400400成为屏幕的中心),我需要对相机位置做什么,并缩放每一帧?此时,简单地增加mScale会越来越接近原点(屏幕左上角)


谢谢

您需要有两个矩阵:一个是摄影机矩阵,用于转换摄影机视图中世界空间中的任何点;另一个是模型矩阵,用于平移/缩放/旋转任何对象

最终的顶点位置方程为:

摄影机矩阵*模型视图矩阵*顶点位置(顶点位置为初始顶点坐标)

如果您需要一些帮助来构建矩阵,我将在当前项目中使用自定义矩阵。您将在找到来源。模型视图矩阵位于src/中的matrix4.cpp中,相机矩阵位于src/中的scene.cpp中


祝您好运:)

如果屏幕宽且高,且原点位于左上角,正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);
也就是说

  • 从身份开始
  • 将点(a,b)移动到原点
  • mScale
  • 将原点处的任何内容移动到屏幕中间