2015-01-13 88 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

非常感謝你的隊友,你給我的光,現在我更新了答案 –