二维矩阵变换(带有播放器和接地)

时间:2013-02-01 11:43:30

标签: c++ matrix directx transformation directx-9

我有一个简单的游戏,我正在尝试用于学习目的,但矩阵有点难,尤其是在DirectX中。

我目前有一个瓷砖系统,可以在屏幕上渲染瓷砖,在中心渲染一个角色位置(启动时)

当玩家向左移动时,地面应该向右移动,因此他总是在屏幕的中心。我使用Sprite来改造Tiles和玩家,但是由于地面在移动并且玩家仍然站在仍然位于中心的地面上而遇到麻烦。

这是一个自上而下的2D游戏,所以我只需要转换位置(也许是旋转)

My Camera类有这个方法:

D3DXMatrixTransformation2D(&View, NULL, 0, &Scale, &Center, D3DXToRadian(Rotation), &Position);

我也试过(对于相机):

D3DXMatrixTranslation(&View, Position.x, Position.y, 0);

然后当我渲染地面精灵时,我将它设置为变换到相机,但玩家拥有它在移动时使用的自己的矩阵。

与上面的那个完全一样,但是他的位置,轮换等等......

我缺少什么,我需要什么?

我只有一个适合屏幕宽度/高度的瓷砖系统,所以我应该看看他什么时候移动,但是他仍然站在中心和地面,玩家正在移动。

我是否需要反转矩阵以使地面朝相反方向移动?

只有玩家移动到这里,世界才会在他周围转变。

Example

我必须说,作为游戏编程中的第一语言,很少有简单的指南可以解释为“2D中的TopDown相机”......

2 个答案:

答案 0 :(得分:2)

对于您的问题,您应该阅读有关不同空间的内容:对象空间,世界空间和相机空间。 (主要涉及3D空间,但我会尝试解释它为2D)

对象空间 每个对象都应该建模,或者在您的情况下绘制为对象空间。这意味着对于每个对象,它们是一个矩阵,它决定了中心,例如你的球员。

世界空间 这是你的游戏世界。它描述了场景中每个对象的位置和方向。

相机空间 这描述了游戏世界的当前视图。假设相机固定在屏幕中间,您可以移动整个世界以适应当前视点(例如,使用负位置进行平移)。

对于您的情况,这意味着您需要每个对象的矩阵,它描述图像在位置(对象空间)正确居中的偏移量。然后你需要将对象转换为世界空间。因此,您需要一个矩阵,其中包含对象的位置和方向,并将其与objectmatrix相乘。最后,您必须考虑视点并将相机矩阵相乘,以便将对象从世界空间转换为视图空间。生成的矩阵是您用于渲染的矩阵。

希望有所帮助:)

答案 1 :(得分:0)

在聊天的人的帮助下,我意识到我的系统出了什么问题,尽管我尝试过类似的东西,但可能是错误的方式/顺序。

对于只有定位的简单2D TopDown相机:

Camera2D翻译:

D3DXMatrixTranslation(&CameraView, Position.x, Position.y, 0);

对于相机视图中的每个对象:

D3DXMATRIX ObjectWorld;
D3DXMatrixTransformation2D(&ObjectWorld, NULL, 0, NULL, NULL, 0, &Position);

D3DXMATRIX Translation;
D3DXMatrixMultiply(&Translation, ObjectWorld, CameraView);

然后渲染精灵:

sprite->SetTransform(&Translation);
sprite->Draw(Texture, NULL, NULL, NULL, Color);

尽管这种方法要求我以与玩家移动方向相反的方向移动相机,因此如果玩家移动+100,则相机应移动-100仍然位于相对于玩家的相同位置。 / p>