【问题标题】:Map rotation (skybox) XNA地图旋转(天空盒)XNA
【发布时间】:2015-03-11 21:00:12
【问题描述】:

我有一个包含 xna 的窗口窗体,现在我在屏幕的一个区域中有两个模型。问题是我需要同时旋转两个模型,我可以旋转一个物体,它是一个坦克,另一个是渲染在一个盒子里的天空盒(风景)。

坦克移动是通过串口实时提供的数据,坦克移动完美,但我无法旋转地图。

(地面应该与坦克一起移动)。

http://i61.tinypic.com/2efqrvc.jpg

我使用这段代码来渲染风景:

private void SkyBoxRender()
    {
        RasterizerState originalRasterizerState = GraphicsDevice.RasterizerState;
        RasterizerState rasterizerState = new RasterizerState();
        rasterizerState.CullMode = CullMode.None;
        GraphicsDevice.RasterizerState = rasterizerState;

        aspectRatio = GraphicsDevice.Viewport.AspectRatio;
        orientacion = Matrix.CreateFromYawPitchRoll(MathHelper.ToRadians(-85.0f), MathHelper.ToRadians(TiempoReal.rollPitch[1]), MathHelper.ToRadians(TiempoReal.rollPitch[0]));
        cameraPositionSkyBox = distance * new Vector3((float)Math.Sin(angle), 0, (float)Math.Cos(angle));

        foreach (EffectPass pass in skyBoxEffect.CurrentTechnique.Passes)
        {
            pass.Apply();
            foreach (ModelMesh mesh in skyBox.Meshes)
            {
                foreach (ModelMeshPart part in mesh.MeshParts)
                {
                    part.Effect = skyBoxEffect;
                    part.Effect.Parameters["World"].SetValue(Matrix.CreateScale(50.0f) * Matrix.CreateTranslation(cameraPositionSkyBox));
                    part.Effect.Parameters["View"].SetValue(view);
                    part.Effect.Parameters["Projection"].SetValue(Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 10000.0f));
                    part.Effect.Parameters["SkyBoxTexture"].SetValue(skyBoxTexture);
                    part.Effect.Parameters["CameraPosition"].SetValue(cameraPositionSkyBox);
                }
                mesh.Draw();
            }
        }
        GraphicsDevice.RasterizerState = originalRasterizerState;
    }

我认为问题出在部分.Effect.Parameters["World"].SetValue..... 我不知道该放什么来使地图使用所有轴旋转。

我使用以下代码旋转水箱:

orientacion = Matrix.CreateFromYawPitchRoll(MathHelper.ToRadians(-85.0f), 
              MathHelper.ToRadians(floatAngle1), MathHelper.ToRadians(floatAngle2));

如果您查看第二行,您会注意到我使用角度来旋转水箱(必须以这种方式...),有什么想法或建议吗?

更新: 解决了,怎么解决的?

在 SkyBoxRender 方法中我添加了以下内容:

orientacionCamara = Matrix.CreateFromYawPitchRoll(MathHelper.ToRadians(0.0f), MathHelper.ToRadians(floatAngle1), MathHelper.ToRadians(floatAngle2));

然后我存档以使用以下方法在地图中移动相机: part.Effect.Parameters["View"].SetValue(Matrix.CreateLookAt(yourCameraPosition) * orientacionCamara);

现在要像模型一样以相同的角度同时移动相机,我旋转模型,而不是这次的相机。

private void BeginRender3D()
    {
        GraphicsDevice.BlendState = BlendState.Opaque;
        GraphicsDevice.DepthStencilState = DepthStencilState.Default;

        Matrix[] transforms = new Matrix[modelo.Bones.Count];
        modelo.CopyAbsoluteBoneTransformsTo(transforms);

        **orientacion** = Matrix.CreateFromYawPitchRoll(MathHelper.ToRadians(-85.0f), MathHelper.ToRadians(floatAngle1), MathHelper.ToRadians(floatAngle2);

        foreach (ModelMesh mesh in modelo.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.EnableDefaultLighting();
                effect.PreferPerPixelLighting = true;
                effect.World = transforms[mesh.ParentBone.Index] * **orientacion**;  //* orientacion
                effect.View = Matrix.CreateLookAt(camaraPosicion, Vector3.Zero, Vector3.Up);
                effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 10000.0f);
            }
            mesh.Draw();
        }
        fps++;             
    }

希望对大家有帮助,谢谢大家的建议。

【问题讨论】:

  • 对不起,我没有看到任何大写字母,也许我的键盘配置可能对您有问题?但我看到的都是没有大写的。
  • 啊,好的,谢谢你的建议,我是新来的
  • 这不是一个答案,而是一个建议。 XNA 不再开发。我建议迁移到目前正在蓬勃发展的 Unity,它可以处理游戏的许多方面,例如天空盒。
  • 感谢您的建议,我知道 xna 已不再开发,但我必须使用窗口窗体,最简单的方法是尝试从 xna 集成一个控件渲染... unity 是否支持 windows形式?或者我必须重新考虑我的所有程序?提前致谢
  • 这似乎是可能的。快速谷歌搜索确认that there are a few ways

标签: c# winforms 3d xna skybox


【解决方案1】:

您可以通过将天空盒效果中的世界参数乘以“orientacion”来按方向旋转地图。不过,您必须确保它围绕坦克位置旋转,方法是将整行更改为:

part.Effect.Parameters["World"].SetValue(Matrix.CreateScale(50.0f) * matrix.createtranslation(TankPosition) * orientacion * Matrix.CreateTranslation(cameraPositionSkyBox - TankPosition));

假设“TankPosition”是你的坦克的位置。

我不确定你想要实现什么,但如果你试图模拟围绕坦克旋转相机,我会通过设置围绕坦克旋转相机

view = matrix.CreatePerspectiveFieldOfView()

在此处阅读:http://msdn.microsoft.com/en-us/library/bb195667.aspx

【讨论】:

  • 非常感谢你,你给了我光明,现在我更新了答案
猜你喜欢
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多