1

コントロールに xna を含むウィンドウ フォームがあります。現在、画面の 1 つの領域に 2 つのモデルがあります。問題は、両方のモデルを同時に回転させる必要があることです。一方のオブジェクトはタンクで、もう一方はボックスでレンダリングされたスカイボックス (風景) を回転させることができます。

戦車はリアルタイムでシリアル ポートから提供されるデータを使用して移動します。戦車は完全に移動しますが、マップを回転させることはできません。

(地面はタンクと一緒に移動する必要があります)。

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));

2 行目を見ると、角度を使用してタンクを回転させていることがわかります (そのようにする必要があります...)。アイデアや提案はありますか?

更新: 解決済み、どうやって?

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++;             
    }

提案してくれてありがとう、誰にでも役立つことを願っています。

4

1 に答える 1

0

スカイボックス効果のワールド パラメーターに「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

于 2015-01-14T08:04:13.430 に答える