我有一个包含在控件中的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++;
}
我希望它可以帮助任何人,谢谢你的建议家伙。
对不起,我没有看到任何帽,也许我的键盘配置可能是你的问题?但我看到所有没有帽子。 –
ahh好的谢谢你的建议,我在这里是新的 –
这不是一个答案,而是一个建议。 [XNA](http://en.wikipedia.org/wiki/Microsoft_XNA)不再开发。我建议转移到当前蓬勃发展的Unity,并且开箱即用,以照顾游戏的许多方面,例如,天空盒。 –