1

3軸XYZとモデルを描画して、空間内のどこにあり、どのように動くかを確認したかった

単純な回転で立方体を描くだけで、すべてが大丈夫です

しかし、軸描画メソッドを追加すると

レンドリングは大丈夫ではありません

using System;
using System.Collections.Generic;
using System.Linq;
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 WindowsGame2
{

    public class Game1 : Microsoft.Xna.Framework.Game
    {
    //Some declaration 
    float x = 30f;
    float y = 0f;
    float z = 30f;

    //GraphicsDevice device;
    VertexBuffer vertexBuffer;
    VertexPositionColor[] lines;

    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Model model;
    Matrix view;
    Matrix progection;
    float xTans = 0.0f;
    float yTans = 0.0f;
    float zTans = 0.0f;
    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }

    protected override void Initialize()
    {

        //device = graphics.GraphicsDevice;
        base.Initialize();
        this.IsMouseVisible = true;
    }

    protected override void LoadContent()
    {
        // Create a new SpriteBatch, which can be used to draw textures.

        spriteBatch = new SpriteBatch(GraphicsDevice);
        model = Content.Load<Model>("cube");

        DrawLines();

        createCamera();

    }

    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == 
                ButtonState.Pressed)
            this.Exit();

        // TODO: Add your update logic here

        base.Update(gameTime);

        //update camera
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.Azure);

        foreach (ModelMesh mesh in model.Meshes)
        {
            foreach (BasicEffect fx in mesh.Effects)
            {
                fx.View = view;

                //fx.World = Matrix.CreateRotationX(xTans);
                fx.World = Matrix.CreateRotationY(yTans);
                //fx.World = Matrix.CreateRotationZ(zTans);

                fx.Projection = progection;
                fx.EnableDefaultLighting();

            }
            mesh.Draw();

        }
        //xTans += 0.01f;
        yTans += 0.01f;
        //zTans += 0.01f;

        BasicEffect effect = new BasicEffect(graphics.GraphicsDevice);
        effect.VertexColorEnabled = true;

        effect.View = view;
        effect.Projection = progection;

        effect.World = Matrix.Identity;

        foreach (EffectPass pass in effect.CurrentTechnique.Passes)
        {
            // Begin Drawing
            pass.Apply();
            // Set the vertex buffer to graphic device
            graphics.GraphicsDevice.SetVertexBuffer(vertexBuffer, 0);
            // Draw the axes with LineList Type
            graphics.GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(
            PrimitiveType.LineList, lines, 0, 3);
            //pass.Apply();
        }
        base.Draw(gameTime);
    }

    protected void DrawLines()
    {
        lines = new VertexPositionColor[6];

        //Setting Size and Width and Color of the X axis
        lines[0] = new VertexPositionColor(new Vector3(50, 0, 0), Color.Red);
        lines[1] = new VertexPositionColor(new Vector3(-50, 0, 0), Color.Red);

        //Setting Size and Width and Color of the Y axis
        lines[2] = new VertexPositionColor(new Vector3(0, 50, 0), Color.Green);
        lines[3] = new VertexPositionColor(new Vector3(0, -50, 0), Color.Green);

        //Setting Size and Width and Color of the Z axis
        lines[4] = new VertexPositionColor(new Vector3(0, 0, 50), Color.Blue);
        lines[5] = new VertexPositionColor(new Vector3(0, 0, -50), Color.Blue);

        vertexBuffer = new VertexBuffer(graphics.GraphicsDevice,
            VertexPositionColor.VertexDeclaration, 6, BufferUsage.None);
        vertexBuffer.SetData<VertexPositionColor>(lines);
    }

    protected void createCamera()
    {
        view = Matrix.CreateLookAt(
            new Vector3(0f, 60.0f, 60f), 
            Vector3.Zero, 
            Vector3.Up);
        progection = Matrix.CreatePerspectiveFieldOfView(
            MathHelper.ToRadians(8.0f), 
            graphics.GraphicsDevice.Viewport.AspectRatio, 
            10.0f, 
            1000.0f);
    }        
} //end game class
} //end namespace

軸を描画する関数はdrawLines()です

メソッドdraw()内

私は本当に軸を描くためにこれを持っています

BasicEffect effect = new BasicEffect(graphics.GraphicsDevice);
effect.VertexColorEnabled = true;

effect.View = view;
effect.Projection = progection;

effect.World = Matrix.Identity;

foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
    // Begin Drawing
    pass.Apply();
    // Set the vertex buffer to graphic device
    graphics.GraphicsDevice.SetVertexBuffer(vertexBuffer, 0);
    // Draw the axes with LineList Type
    graphics.GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(
    PrimitiveType.LineList, lines, 0, 3);
    //pass.Apply();
}

回転のレンディングの速度が遅い理由がわかりません

4

1 に答える 1

1

良い知らせと悪い知らせがあります。良いニュースは、プロジェクトをスムーズに実行できることです。ビルダーが私のようにfbxモデルを配置している限り、プロジェクトをビルドするのに十分なコードを投稿しました。これは必要な変更です。

// take this out of your Draw() method.
BasicEffect effect = new BasicEffect(graphics.GraphicsDevice);

// put this in your class variables
BasicEffect effect;

//and put this at the end of LoadContent()
effect = new BasicEffect(graphics.GraphicsDevice);

投稿の最後に説明があります。

悪いニュースは、あなたが悪いコードの山をたくさん持っているということです。コンパイルされて実行されますが、うまく実行されません。XNAプロジェクトの作成に少し慣れていないことを前提としています。つまり、ゲームプログラムのコンポーネントについて一般的に理解していない可能性があります。

そして、私はあなたが間違ってしたことのいくつかを説明しようとしますが、あなたの投稿はSOにとって本当に良いものではありません。これは、技術的な難問ではなく、単純な不十分な実践の結果です。gamedev.stackexchange.comでは、特定のテクノロジーを使用してゲームをプログラムする(しない)方法の良い例を示しているため、このような質問が受け入れられることがあります。回答が終わったら、投稿にフラグを付けてそこに移動します。改造はそれがそれに値しないと決定するかもしれません。

とにかく、これが私の最善の努力です:

この関数は、コンテンツの読み込みメソッドで呼び出します。

protected override void LoadContent()
    ...
    DrawLines();
    ...
}

デフォルトのテンプレートコメントにあるように、コンテンツの読み込み方法はコンテンツを読み込むためのものです。描画用ではありません。一度だけ呼び出されるので、とにかくそこから1つのフレームを描画するのはばかげています。しかし、それはあなたがその方法でしていることではありません。そこで、いくつかのプリミティブデータを宣言しています。それは大丈夫ですが、最後の2行は不要です。

protected void DrawLines()
{
    lines = new VertexPositionColor[6];
    lines[0] = new VertexPositionColor(new Vector3(50, 0, 0), Color.Red);
    // ...

    vertexBuffer = new VertexBuffer(graphics.GraphicsDevice,
        VertexPositionColor.VertexDeclaration, 6, BufferUsage.None);
    vertexBuffer.SetData<VertexPositionColor>(lines);
    ...

その頂点バッファも使用しません。を使用DrawUserPrimitives<T>()します。これにより、頂点バッファが設定されます。つまり、描画メソッドからこの線も必要ありません。

graphics.GraphicsDevice.SetVertexBuffer(vertexBuffer, 0);

エフェクトパスを開始した後、頂点データを設定します。

これは悪い考えです。動作を開始した後、グラフィックハードウェアを中断します。これは、ゲームのパフォーマンスのボトルネックになることがよくあります。あなたの場合、それはそうではありませんが、それでも悪い考えです。

フレームごとに新しいエフェクトを作成します。

上で書いたように、これはあなたが変更する必要がある唯一のものです。その名前にもかかわらず、aBasicEffectは、構成可能な多数のシェーダーフラグメント、および複数のテクスチャ、マテリアル、およびエフェクトを使用して複雑なジオメトリを描画するために必要なその他すべての複雑なOOコンテナです。そして、それらのオブジェクトの1つを1秒間に60回割り当てようとします。

私のアドバイスはこれです:より多くのブログ投稿を読み、より多くのサンプルコードを研究し、そしてメモリプロファイラーの使い方を学びます。

于 2013-02-12T06:03:46.860 に答える