0

C#でXNAを使用してグラフィックを描画します

View = Matrix.CreateLookAt(new Vector3(0f, 100f, 0f), Vector3.Zero, Vector3.Forward);

Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(20.0f), ((Game1)Game).graphics.GraphicsDevice.Viewport.AspectRatio, 1.0f, 10000.0f);

私のカメラは決して動かず、私のゲームオブジェクトだけが動きます。スムーズな動きを得るために、次のように動かします

float speed = 0.001f;
pos.Z = pos.Z + (gameTime.ElapsedGameTime.Milliseconds * speed);

しかし、私は道路タイル(Primitives VertexPositionTexture)を次々にレンダリングして、運転する道路の感覚を与えています。

それは機能しますが、時々それは私が望まない私の道路タイル間のピクセル間隔です。浮動小数点座標と関係があると思います。

これをどのように回避する必要がありますか?

前もって感謝します!私の問題についての説明が明確であったことを願っています。

編集1:誰かがこの投稿に投票したい場合は、理由をコメントしてください。フィードバックなしで開発することは困難です。

編集2:プリミティブに関する情報。

rod1の解像度400x50

ここに画像の説明を入力してください

using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace WindowsGame1
{
    class Rod
    {
        public static Microsoft.Xna.Framework.Graphics.VertexBuffer buffer;
        public static Texture2D[] tex;
        public static BasicEffect effect;

        public Vector3 pos;
        public int typ;

        public const float Width = 24f;
        public const float Height = 5;

        public Rod(Vector3 pos,Random r)
        {
            this.pos = pos;
            typ = r.Next(tex.Length);
        }

        static public void Initialize(GraphicsDevice g)
        {
            buffer = new VertexBuffer(g, VertexPositionTexture.VertexDeclaration, 6, BufferUsage.WriteOnly);

            VertexPositionTexture[] vertices = new VertexPositionTexture[6];

            vertices[0].Position = new Vector3(-Width, 0f, -Height);
            vertices[0].TextureCoordinate.X = 0;
            vertices[0].TextureCoordinate.Y = 0;

            vertices[1].Position = new Vector3(Width, 0f, Height);
            vertices[1].TextureCoordinate.X = 1;
            vertices[1].TextureCoordinate.Y = 1;

            vertices[2].Position = new Vector3(-Width, 0f, Height);
            vertices[2].TextureCoordinate.X = 0;
            vertices[2].TextureCoordinate.Y = 1;



            vertices[3].Position = new Vector3(Width, 0f, Height);
            vertices[3].TextureCoordinate.X = 1;
            vertices[3].TextureCoordinate.Y = 1;

            vertices[4].Position = new Vector3(-Width, 0f, -Height);
            vertices[4].TextureCoordinate.X = 0;
            vertices[4].TextureCoordinate.Y = 0;

            vertices[5].Position = new Vector3(Width, 0f, -Height);
            vertices[5].TextureCoordinate.X = 1;
            vertices[5].TextureCoordinate.Y = 0;

            buffer.SetData<VertexPositionTexture>(vertices);
            effect = new BasicEffect(g);
            effect.TextureEnabled = true;
        }

        public void SetTyp(Random r)
        {
            typ = r.Next(tex.Length);
        }

        public void Update(GameTime gameTime, Double speed)
        {
           // pos = new Vector3(pos.X, pos.Y, pos.Z + (gameTime.ElapsedGameTime.Milliseconds * speed) );
            pos.Z = pos.Z + (float)(gameTime.ElapsedGameTime.Milliseconds * speed);
        }

        public void Draw(Matrix View, Matrix Projection, GraphicsDevice g)
        {
            effect.World = Matrix.CreateScale(1.01f) * Matrix.CreateTranslation(pos);
            effect.View = View;
            effect.Projection = Projection;
            effect.Texture = tex[typ];

            foreach (EffectPass pass in effect.CurrentTechnique.Passes)
            {
                g.SetVertexBuffer(buffer);
                pass.Apply();
                g.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);
            }
        }
    }
}
4

2 に答える 2

4

詳細がなければ問題を特定することはできませんが、これはおそらく起こっていることです:

たとえば、2 つの長方形を描いているとします。したがって、それぞれを個別に描画すると、次のようになります。

+--------+
|        |
|        |
+--------+  < gap greatly exaggerated
+--------+  <
|        |
|        |
+--------+

これにより、目に見える隙間が生じる可能性があります。

代わりに、次のようなものが必要です。

+--------+
|        |
|        |
+--------+
|        |
|        |
+--------+

隙間がないという意味ではなく、頂点を共有しているという意味で。

上の図では、8 つの頂点があります。下部には、頂点が長方形間で共有されているため、6 つあります。これは、2 つの間にエッジが 1 つしかないため、理論上でもギャップがあることは不可能であることを意味します。

必要なのは、コードをリファクタリングして、長方形間で頂点を共有することです。

グラフィックス プログラミングでは、これはクワッド ストリップまたはトライアングル ストリップと呼ばれることがよくあります。Riemer には、XNA のコンテキストでトライアングル ストリップを説明するページがあります。

于 2013-02-12T15:09:14.910 に答える
0

Matrix.CreateScale(1.01f) でテクスチャを変換してみることができます

また、ペイント プログラムで最初に作成したとき、テクスチャは正しくスケーリングまたはサイズ設定されていますか? フロートによるテクスチャのスケーリングは、エッジの不正確さを引き起こす可能性があるため、可能な限り避ける必要があります。

于 2013-02-12T15:04:35.940 に答える