Slant/Skew 一个纹理 - Monogame
Slant/Skew a Texture - Monogame
我正在尝试 Slant/Skew 纹理来为我的游戏创建一些阴影。
我已经阅读了 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 矩阵。我已经尝试将它应用于阴影精灵、castingShadow 精灵,并将它们相乘并应用于阴影,但没有成功。
我也尝试过使用其他方法,例如 Matrix.CreateRotationX(MathHelper.ToRadians(0.87f))
,但没有成功。
实际上也有一个 Matrix.CreateShadow()
方法,但它需要一个 Plane,我的游戏中没有它。
任何人都可以帮我找出这个 倾斜 所需的矩阵,或者为我指出一些资源的方向吗?
谢谢!
好的,所以我找到了一个转换来获得所需的倾斜度。
感谢@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 是根据 "sun" X 位置设置的,loc 向量是我希望对象和对象的阴影出现的位置。
我正在尝试 Slant/Skew 纹理来为我的游戏创建一些阴影。 我已经阅读了 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 矩阵。我已经尝试将它应用于阴影精灵、castingShadow 精灵,并将它们相乘并应用于阴影,但没有成功。
我也尝试过使用其他方法,例如 Matrix.CreateRotationX(MathHelper.ToRadians(0.87f))
,但没有成功。
实际上也有一个 Matrix.CreateShadow()
方法,但它需要一个 Plane,我的游戏中没有它。
任何人都可以帮我找出这个 倾斜 所需的矩阵,或者为我指出一些资源的方向吗?
谢谢!
好的,所以我找到了一个转换来获得所需的倾斜度。
感谢@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 是根据 "sun" X 位置设置的,loc 向量是我希望对象和对象的阴影出现的位置。