Вращение карты (скайбокс) 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 ["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++;             
    }

Я надеюсь, что это может помочь кому угодно, спасибо за предложение, ребята.


person Andres Diaz De Valdes    schedule 13.01.2015    source источник
comment
извините, я не вижу заглавных букв, может быть, моя конфигурация клавиатуры может быть проблемой для вас? но вижу все без заглавных букв.   -  person Andres Diaz De Valdes    schedule 13.01.2015
comment
ааа ладно спасибо за совет, я здесь новенький   -  person Andres Diaz De Valdes    schedule 13.01.2015
comment
Это не ответ, а предложение. XNA больше не разрабатывается. Я предлагаю перейти на Unity, которая в настоящее время процветает и из коробки заботится о многих аспектах игры, например скайбокс.   -  person Amadeusz Wieczorek    schedule 14.01.2015
comment
спасибо за предложение, я знаю, что xna больше не разрабатывается, но мне приходится работать с оконной формой, и самый простой способ - попытаться интегрировать один рендеринг элемента управления из xna ... Поддерживает ли единство оконные формы? или мне придется переосмыслить всю свою программу? заранее спасибо   -  person Andres Diaz De Valdes    schedule 14.01.2015
comment
Кажется возможным. Быстрый поиск в Google подтверждает , что есть несколько способов   -  person Amadeusz Wieczorek    schedule 14.01.2015
comment
То есть вы в основном хотите вращать не объект, а камеру? Затем вам следует адаптировать преобразование вида. В любом случае вам нужно установить общую матрицу (будь то мировая матрица или матрица просмотра) для обоих объектов.   -  person Nico Schertler    schedule 14.01.2015


Ответы (1)


Вы можете повернуть карту по ориентации, умножив параметр мира в 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

person Peethor    schedule 14.01.2015
comment
спасибо большое, дружище, ты дала мне свет, теперь я обновил ответ - person Andres Diaz De Valdes; 14.01.2015