【问题标题】:Slant/Skew a Texture - Monogame倾斜/倾斜纹理 - Monogame
【发布时间】:2019-12-15 12:34:47
【问题描述】:

我正在尝试倾斜/倾斜纹理以为我的游戏创建一些阴影。 我已经阅读了this helpful answer,这表明这可以通过将矩阵传递给 spriteBatch.Begin() 来完成。

因为我的线性代数技能不是很发达,我在达到我想要的结果时遇到了一些麻烦。我希望扭曲我的阴影,使其看起来类似于以下内容。阴影倾斜了一个角度,但阴影的底部与精灵的底部(在本例中为脚)对齐。

我原来是绑定了上面解决方案中提供的偏斜矩阵:

Matrix skew = Matrix.Identity;
skew.M12 = (float)Math.Tan(MathHelper.ToRadians(36.87f));

但这最终会使阴影相对于世界的原点旋转。我看到解决方案也注意到了这一点,并提供了跟随以再次旋转精灵。

Matrix myMatrix = Matrix.CreateTranslation(-100, -100, 0)
                * Matrix.CreateScale(2f, 0.5f, 1f)
                * Matrix.CreateTranslation(100, 100, 0);

虽然我不确定在哪里应用这个 myMatrix 矩阵。我已经尝试将它应用于阴影精灵、铸造阴影精灵,并将它们相乘并应用于阴影,但没有成功。

我也尝试过使用其他方法,例如Matrix.CreateRotationX(MathHelper.ToRadians(0.87f)),但没有成功。

实际上也有一个Matrix.CreateShadow() 方法,但它需要一个平面,而我在我的游戏中没有这种方法。

谁能帮我找出这个倾斜所需的矩阵,或者指出一些资源的方向?

谢谢!

【问题讨论】:

    标签: matrix xna textures monogame matrix-transform


    【解决方案1】:

    好的,所以我找到了一个用于获得所需倾斜度的变换。

    感谢@David Gouveia 和@AndreRussell 来自post

    Matrix matrix = Matrix.CreateRotationX(MathHelper.ToRadians(60)) * 
                    Matrix.CreateRotationY(MathHelper.ToRadians(30)) * 
                    Matrix.CreateScale(1,1,0);
    

    编辑:

    所以上面的解决方案解决了我想要倾斜纹理的方式,但是有一些奇怪的定位副作用。为了解决这个问题,我最终进行了如下转换:

        Matrix slant = Matrix.CreateTranslation(-loc.X + angleX, -loc.Y, 0f) *
                Matrix.CreateRotationX(MathHelper.ToRadians(angleX)) *
                Matrix.CreateRotationY(MathHelper.ToRadians(30)) *
                Matrix.CreateScale(1.4f, 1f, 0) *
                Matrix.CreateTranslation(loc.X + angleX, loc.Y, 0f);
    

    angleX 是根据“太阳”X 位置设置的,而 loc 向量是我希望对象和对象阴影出现的位置。

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 2023-03-23
      • 2016-12-25
      • 2016-12-23
      • 1970-01-01
      • 2016-02-03
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多