2015-01-13 26 views
1

我有一个包含在控件中的xna窗口窗体,现在我有两个模型在屏幕的一个区域。事情是我需要同时旋转两个模型,我可以旋转一个对象,这是一个坦克,另一个是在盒子中渲染的天空盒(风景)。地图旋转(天空盒)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; 
    } 

我认为这个问题是在该行part.Effect.Parameters [ “世界”]的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 [“查看”]的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++;    
    } 

我希望它可以帮助任何人,谢谢你的建议家伙。

+0

对不起,我没有看到任何帽,也许我的键盘配置可能是你的问题?但我看到所有没有帽子。 –

+0

ahh好的谢谢你的建议,我在这里是新的 –

+0

这不是一个答案,而是一个建议。 [XNA](http://en.wikipedia.org/wiki/Microsoft_XNA)不再开发。我建议转移到当前蓬勃发展的Unity,并且开箱即用,以照顾游戏的许多方面,例如,天空盒。 –

回答

0

您可以按照方向旋转地图,方法是将skyboxeffect中的世界参数乘以“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

+0

非常感谢你的队友,你给我的光,现在我更新了答案 –