سہ رخی کثیر الجہت کی نمائش

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

خلاصہ

یہ تھری ڈی اسپیس میں سہ رخی کثیر الجہت دکھاتا ہے۔

3角形ポリゴンの表示

آپریٹنگ ماحول

ضروری شرائط

XNA ورژن کی حمایت کی
  • 4.0
حمایت یافتہ پلیٹ فارم
  • ونڈوز (ایکس پی ایس پی 2 یا اس کے بعد، وسٹا، 7)
  • ایکس بکس 360
  • ونڈوز فون 7
Windows Required Vertex Shader Version 2.0
Windows Required پکسل شادer Version 2.0

آپریٹنگ ماحول

پلیٹ فارم
  • ونڈوز 7
  • ایکس بکس 360
  • ونڈوز فون 7 ایمولیٹر

مادہ

ایک کثیر الجہتی کیا ہے؟

کثیر الجہتی ایک ایسا چہرہ ہے جو متعدد ورٹیکس تعریفوں سے پیدا ہوتا ہے۔ عام طور پر ، ایک کثیر الجہتی ایک سہ رخی چہرہ ہے جو تین سروں پر مشتمل ہوتا ہے۔ اور ٹرائیگون کثیر الجہت کی سب سے چھوٹی اکائی ہے۔ کچھ ماڈلنگ سافٹ ویئر کثیر الجہتی یا کثیر الجہتی کے طور پر کثیر الجہتی کو ظاہر کرسکتے ہیں ، لیکن یہ آخر کار سہ رخی کثیر الجہت میں ضم ہوجائیں گے۔

گیمز میں دکھایا جانے والا ماڈل ان سہ رخی کثیر الجہتوں میں سے متعدد کو ملا کر تشکیل دیا جاتا ہے۔

最小単位のポリゴン

کثیر الجہت سروں سے تشکیل پاتے ہیں۔ سروں میں پوزیشن اور رنگ جیسے اعداد و شمار ہوسکتے ہیں۔ یہ نمونہ "پوزیشن" اور "رنگ" ڈیٹا سے بھی بنایا گیا ہے.

ポリゴンと頂点

اس مثال میں چہرے کا رنگ ہر سرے کے لئے مقرر کردہ رنگ اور فاصلے کے ذریعہ اچھی طرح سے داخل کیا جاتا ہے ، لیکن آپ اسے آزادانہ طور پر اپنے شیڈر پروگرام کے ساتھ تبدیل کرسکتے ہیں (دوسری بار شیڈر پروگراموں پر زیادہ)۔

Vertex Data Definitions

کثیر الجہتی کو ظاہر کرنے کے لئے ، "ورٹیکس ڈیٹا" کی ضرورت ہوتی ہے ، اور پروگرامر کو یہ فیصلہ کرنا ہوگا کہ اس سرٹیکس میں کون سے عناصر شامل کرنا ہیں۔ کثیر الجہتی کھینچتے وقت ، آپ کو آلہ کو بتانا ہوگا ، جو ڈرائنگ انجن ہے ، کس ورٹیکس ڈیٹا کے ساتھ کثیر الجہت کھینچنا ہے۔ ایسا کرنے کے لئے ، "ورٹیکس ڈیکلیئریشن" کلاس بنائیں اور "ورٹیکس ڈیٹا ڈیفینیشن" سیٹ کریں۔

تاہم ، ایکس این اے گیم اسٹوڈیو 4.0 سے شروع کرتے ہوئے ، اس سیٹ اپ کو آسان بنا دیا گیا ہے ، اور آپ کو اس ٹپ کے لئے ورٹیکس ڈیکلریشن کلاس تیار کرنے کی ضرورت نہیں ہے۔ (اس کی وجہ یہ ہے کہ تعریف کی معلومات پہلے ہی فریم ورک کے ذریعہ فراہم کردہ ورٹیکس ڈیٹا میں شامل ہے۔

Vertex data

میں نے لکھا ہے کہ کثیر الجہتی کھینچنے کے لئے ورٹیکس ڈیٹا کی ضرورت ہوتی ہے ، لیکن پہلے ہمیں یہ فیصلہ کرنا ہوگا کہ ہم کس قسم کا ڈیٹا حاصل کرنا چاہتے ہیں۔ اس صورت میں ، ہم "پوزیشن" اور "رنگ" ڈیٹا استعمال کریں گے۔ ایک بار جب آپ فیصلہ کر لیتے ہیں کہ آپ کون سا ڈیٹا رکھنا چاہتے ہیں تو ، آپ کو اس ڈیٹا کو رکھنے کے لئے ایک ڈھانچہ بنانے کی ضرورت ہے۔ آپ کو یہ فیصلہ کرنے کی کچھ آزادی ہے کہ ورٹیکس ڈیٹا کیا ہے ، لیکن عام طور پر استعمال ہونے والا ورٹیکس ڈیٹا پہلے ہی ایکس این اے فریم ورک میں بیان کیا گیا ہے ، لہذا نمونہ اسے استعمال کرتا ہے۔

"پوزیشن" اور "رنگ" کے ساتھ ورٹیکس ڈیٹا کو "ورٹیکس پوزیشن کلر" ڈھانچے کے طور پر بیان کیا گیا ہے۔ چونکہ ایک کثیر الجہت کی تشکیل کے لئے متعدد سروں کی ضرورت ہوتی ہے ، لہذا ہم اسے ایک صف کے طور پر اعلان کرتے ہیں۔

/// <summary>
/// 頂点データリスト
/// </summary>
private VertexPositionColor[] vertices = null;

اثر

ایکس این اے میں ، جب آپ ایک کثیر الجہتی کھینچتے ہیں تو ، آپ کو یہ فیصلہ کرنے کے لئے ایک علیحدہ شیڈر پروگرام لکھنا پڑتا ہے کہ اسے کس طرح کھینچنا ہے۔ ایسا کرنے کے لئے ، ایک علیحدہ اثر فائل بنائیں ، ایک پروگرام لکھیں ، اسے اثر کلاس کے طور پر لوڈ کریں ، اور شیڈر پروگرام چلائیں۔

تاہم ، اگر آپ کو اس طرح کے سادہ سہ رخی کثیر الجہتی ، یا پیچیدہ ڈرائنگ اثرات کھینچنے کی ضرورت نہیں ہے تو ، یہ ایک بہت مشکل کام ہوسکتا ہے۔

اس وجہ سے ، ایکس این اے توسیعی اثرات کی وضاحت کرتا ہے جو آپ کو مطلوبہ اشیاء کو خصوصیات کے طور پر سیٹ کرنے کی اجازت دیتا ہے تاکہ آپ کو بنیادی ڈرائنگ کے لئے شیڈر پروگرام نہ لکھنا پڑے۔ یہ "بنیادی اثر" کلاس ہے. چونکہ اس مضمون کا مقصد کثیر الجہتی کھینچنا ہے ، لہذا ہم "بنیادی اثر" کا استعمال کریں گے جس کو کھینچنے میں زیادہ کوشش نہیں ہوتی ہے۔

/// <summary>
/// 基本エフェクト
/// </summary>
private BasicEffect basicEffect = null;

میں کسی اور وقت اثرات اور بنیادی اثرات کے بارے میں مزید بات کروں گا.

ویسے ، ونڈوز فون 7 آپ کو اپنے اثرات استعمال کرنے کی اجازت نہیں دیتا ہے ، صرف وہ جو بنیادی اثر جیسے فریم ورک میں بنائے گئے ہیں۔

ورٹیکس ڈیٹا کی تعریف بنائیں

ایکس این اے فریم ورک 3.1 تک ، آپ کو واضح طور پر انہیں پروگرامی طور پر بنانا پڑتا تھا ، لیکن 4.0 سے شروع کرتے ہوئے ، فریم ورک کی بلٹ ان ورٹیکس معلومات پہلے ہی ورٹیکس معلومات میں "آئی ورٹیکس ٹائپ ڈاٹ ورٹیکس ڈیکلریشن" کے طور پر شامل ہے ، لہذا ہم اسے استعمال کریں گے۔

اثرات پیدا کرنا

ایک بنیادی اثر کلاس بنائیں. ورٹیکس رنگوں کو برقرار رکھنے کے لئے بنیادی اثر.ورٹیکس کلر اینایبل پراپرٹی کو سچ پر سیٹ کریں۔

// エフェクトを作成
this.basicEffect = new BasicEffect(this.GraphicsDevice);

// エフェクトで頂点カラーを有効にする
this.basicEffect.VertexColorEnabled = true;

BasicEffect constructor

ایفیکٹ کلاس "بنیادی اثر" کی ایک مثال بنائیں جو شیڈر ماڈل 2.0 کا استعمال کرتے ہوئے ورٹیکس رنگ، ساخت اور روشنی کا مظاہرہ کرتا ہے۔

آلہ GraphicsDevice اثر تخلیق کرنے کے لئے گرافکس ڈیوائس کی وضاحت کرتا ہے

میٹرکس اور پروجیکشن میٹرکس دیکھیں

ویو میٹرکس اور پروجیکشن میٹرکس میں بنیادی اثر سیٹ کریں۔ ہر ایک کی تصوراتی وضاحت کے لئے، ذیل کے لنکس دیکھیں.

// ビューマトリックスをあらかじめ設定 ((0, 0, 15) から原点を見る)
this.basicEffect.View = Matrix.CreateLookAt(
        new Vector3(0.0f, 0.0f, 15.0f),
        Vector3.Zero,
        Vector3.Up
    );

// プロジェクションマトリックスをあらかじめ設定
this.basicEffect.Projection = Matrix.CreatePerspectiveFieldOfView(
        MathHelper.ToRadians(45.0f),
        (float)this.GraphicsDevice.Viewport.Width /
            (float)this.GraphicsDevice.Viewport.Height,
        1.0f,
        100.0f
    );

ویو میٹرکس پیدا کرنے کے لئے ، "میٹرکس.تخلیق کریں" طریقہ استعمال کریں۔

پہلی دلیل کیمرے کی پوزیشن کی وضاحت کرتی ہے ، دوسری دلیل کیمرے کی دلچسپی کے نقطہ کی وضاحت کرتی ہے ، اور تیسری دلیل کیمرے کی اوپر کی سمت کی وضاحت کرتی ہے۔

اس معاملے میں ، یہ پوزیشن (0، 0، 15) سے اصل کو دیکھنے کے لئے تیار ہے.

Matrix.CreateLookAt طریقہ

ایک ویو میٹرکس بنائیں۔

کیمرے کی پوزیشن Vector3 کیمرے کی پوزیشن
cameraTarget Vector3 کیمرہ پوائنٹ آف انٹرسٹ
cameraUpVector Vector3 کیمرے کی اوپر کی سمت

پروجیکشن میٹرکس پیدا کرنے کے لئے ، "میٹرکس.تخلیق فیلڈ آف ویو" طریقہ استعمال کریں۔

پہلی دلیل ریڈین میں دیکھنے کا زاویہ ہے۔ نمونے میں ، ڈگری یونٹ کو "میتھ ہیلپر ڈاٹ ٹو ریڈیئنز" طریقہ کار کا استعمال کرتے ہوئے ریڈیئن میں تبدیل کیا جاتا ہے۔ ریڈیان اور ڈگری کے بارے میں مزید معلومات کے لئے، ریڈین اور ڈگری ملاحظہ کریں.

دوسری دلیل پہلو تناسب (پہلو تناسب) کی وضاحت کرتی ہے۔ عام طور پر ، آپ ویو چوڑائی ÷ اونچائی کے لئے ایک قدر کی وضاحت کرتے ہیں۔ نمونے میں ، اس کا حساب ڈیوائس کے ویو پورٹ کے لئے مقرر چوڑائی اور اونچائی سے کیا جاتا ہے۔

تیسری دلیل فارورڈ کلپنگ پوزیشن کی وضاحت کرتی ہے ، اور چوتھی دلیل پچھلی کلپنگ پوزیشن کی وضاحت کرتی ہے۔

Matrix.CreatePerspectiveFieldOfView طریقہ

ویو فیلڈ کی ترتیبات کی بنیاد پر ایک نقطہ نظر پروجیکشن میٹرکس بناتا ہے۔

فیلڈ آف ویو تیرتا ہے دیکھنے کا زاویہ۔ ریڈین اکائیوں میں بیان کیا گیا ہے۔
aspectRatio تیرتا ہے پہلو تناسب (پہلو تناسب). عام طور پر ، آپ "چوڑائی ÷ اونچائی دیکھیں" کے لئے ایک قدر کی وضاحت کرتے ہیں۔
ہوائی جہاز کے فاصلے کے قریب تیرتا ہے فارورڈ کلپ پوزیشن۔ اس پوزیشن کے سامنے موجود اشیاء کھینچی نہیں جاتی ہیں۔
far جہاز کا فاصلہ تیرتا ہے پیچھے کلپ کی پوزیشن۔ اس پوزیشن سے باہر کی اشیاء کھینچی نہیں جاتی ہیں۔

Vertex Data پیدا کرنا

تین ورٹیکس ڈیٹا بنائیں۔ سب سے پہلے، ہم ایک سرے بنائیں گے اور ہر سرے کو بنائیں گے.

// 頂点データを作成する
this.vertices = new VertexPositionColor[3];

this.vertices[0] = new VertexPositionColor(new Vector3(0.0f, 3.0f, 0.0f),
                                           Color.Red);
this.vertices[1] = new VertexPositionColor(new Vector3(3.0f, -2.0f, 0.0f),
                                           Color.Blue);
this.vertices[2] = new VertexPositionColor(new Vector3(-3.0f, -2.0f, 0.0f),
                                           Color.Green);

ورٹیکس ڈیٹا بنانے کے لئے ، "ورٹیکس پوزیشن کلر" کے کنسٹریکٹر میں "ورٹیکس پوزیشن" اور "ورٹیکس رنگ" کی وضاحت کریں۔

VertexPositionColor constructor

پوزیشن اور رنگ ورٹیکس ڈیٹا کے ساتھ ڈھانچے "ورٹیکس پوزیشن کلر" کی ایک مثال بنائیں۔

پوزیشن Vector3 Vertex Position
رنگ رنگ Vertex رنگ

سروں کی پوزیشن کو اس حد پر سیٹ کریں جو کیمرے سے دیکھا جاسکتا ہے۔ اس کے علاوہ ، ورٹیکس ترتیب کو "گھڑی کے لحاظ سے (گھڑی کے لحاظ سے)" مقرر کریں۔ اگر آپ اسے "کاؤنٹر کلاک وائز" پر سیٹ کرتے ہیں تو ، کثیر الجہتی نظر نہیں آئے گا۔ اس کی وضاحت کے لئے ، کھینچنے کے لئے ایک کثیر الجہتی کے چہروں کی وضاحت دیکھیں۔

کثیر الجہت کی ڈرائنگ

// パスの数だけ繰り替えし描画 (といっても直接作成した BasicEffect は通常1回)
foreach (EffectPass pass in this.basicEffect.CurrentTechnique.Passes)
{
    // パスの開始
    pass.Apply();

    // ポリゴンを描画する
    this.GraphicsDevice.DrawUserPrimitives(
        PrimitiveType.TriangleList,
        this.vertices,
        0,
        1
    );
}

// 登録された DrawableGameComponent を描画する
base.Draw(gameTime);

اثرات کی دو قسمیں ہیں ، جنہیں "تکنیک" اور "راستے" کہا جاتا ہے ، جس کے ذریعے آپ اصل ڈرائنگ پروگرام چلاتے ہیں۔ چونکہ ایک ہی اثر میں متعدد راستے ہوسکتے ہیں ، لہذا میں انہیں بار بار پیش کرنے کی کوشش کرتا ہوں۔ تاہم ، بنیادی اثر میں ، ایک تکنیک اور ایک راستہ ہے ، لہذا آپ راستے کے انڈیکس کی براہ راست وضاحت کرسکتے ہیں ، لیکن مندرجہ بالا وضاحت صاف ہوگی کیونکہ آپ اسے دوسرے اثرات کے لئے تبدیل کرسکتے ہیں۔

اصل ڈرائنگ شروع کرنے سے پہلے ، پاس شروع کرنے کے لئے "ایفیکٹ پاس. لاگو کریں" طریقہ کال کریں۔ اس طریقہ کار کو کال کرکے ، اس بار استعمال ہونے والے اثر کے پیرامیٹرز گرافکس ڈیوائس پر لاگو ہوتے ہیں۔

ایک بار جب آپ راستہ شروع کر دیتے ہیں تو ، "گرافکس ڈیوائس ڈاٹ ڈراو یوزر پرائمیٹس" طریقہ کار کے ساتھ کثیر الجہتی کھینچیں۔

پہلی دلیل یہ واضح کرتی ہے کہ کس قسم کی ابتدائی تصویر کھینچی جائے گی۔ اس صورت میں ، ہم ایک سہ رخی کثیر الجہتی کھینچیں گے ، لہذا "ابتدائی ٹائپ. ٹرائی اینگل لسٹ" کی وضاحت کریں۔

دوسری دلیل تخلیق کردہ ورٹیکس ڈیٹا کی وضاحت کرتی ہے۔

تیسری دلیل اس سرے کی وضاحت کرتی ہے جس سے اخذ کیا جائے۔ عام طور پر، یہ 0 ہے.

چوتھی دلیل میں ابتدائی افراد کی تعداد کی وضاحت کی گئی ہے۔ اس معاملے میں ، صرف ایک سہ رخی کثیر الجہت ہے ، لہذا 1 کی وضاحت کریں۔ نوٹ کریں کہ یہ سروں کی تعداد نہیں ہے.

GraphicsDevice.DrawUserPrimitives طریقہ

صارفین کی طرف سے فراہم کردہ ورٹیکس ڈیٹا کی بنیاد پر ابتدائی اعداد و شمار کھینچتا ہے۔

T کوئی حد نہیں ورٹیکس ڈیٹا ڈھانچے
Primitive ٹائپ Primitive ٹائپ کھینچنے کے لئے قدیم کی قسم
vertexData T[] کھینچنے کے لئے ورٹیکس ڈیٹا کی ایک فہرست
vertexOffset int ڈرائنگ کے لئے استعمال ہونے والے ورٹیکس ڈیٹا کی تعداد کی وضاحت کریں
PrimitiveCount int کھینچنے کے لئے ابتدائی افراد کی تعداد.

یہ ڈرائنگ پروگرام کے لئے ہے. اگر آپ واقعی اسے چلاتے ہیں اور ایک مثلث ظاہر ہوتا ہے تو ، آپ نے کام مکمل کرلیا ہے۔

تمام کوڈز

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;
#if WINDOWS_PHONE
using Microsoft.Xna.Framework.Input.Touch;
#endif

namespace DrawTriangle
{
    /// <summary>
    /// ゲームメインクラス
    /// </summary>
    public class GameMain : Microsoft.Xna.Framework.Game
    {
        /// <summary>
        /// グラフィックデバイス管理クラス
        /// </summary>
        private GraphicsDeviceManager graphics = null;

        /// <summary>
        /// スプライトのバッチ化クラス
        /// </summary>
        private SpriteBatch spriteBatch = null;

        /// <summary>
        /// 頂点データリスト
        /// </summary>
        private VertexPositionColor[] vertices = null;

        /// <summary>
        /// 基本エフェクト
        /// </summary>
        private BasicEffect basicEffect = null;


        /// <summary>
        /// GameMain コンストラクタ
        /// </summary>
        public GameMain()
        {
            // グラフィックデバイス管理クラスの作成
            this.graphics = new GraphicsDeviceManager(this);

            // ゲームコンテンツのルートディレクトリを設定
            this.Content.RootDirectory = "Content";

#if WINDOWS_PHONE
            // Windows Phone のデフォルトのフレームレートは 30 FPS
            this.TargetElapsedTime = TimeSpan.FromTicks(333333);

            // バックバッファサイズの設定
            this.graphics.PreferredBackBufferWidth = 480;
            this.graphics.PreferredBackBufferHeight = 800;

            // フルスクリーン表示
            this.graphics.IsFullScreen = true;
#endif
        }

        /// <summary>
        /// ゲームが始まる前の初期化処理を行うメソッド
        /// グラフィック以外のデータの読み込み、コンポーネントの初期化を行う
        /// </summary>
        protected override void Initialize()
        {
            // TODO: ここに初期化ロジックを書いてください

            // コンポーネントの初期化などを行います
            base.Initialize();
        }

        /// <summary>
        /// ゲームが始まるときに一回だけ呼ばれ
        /// すべてのゲームコンテンツを読み込みます
        /// </summary>
        protected override void LoadContent()
        {
            // テクスチャーを描画するためのスプライトバッチクラスを作成します
            this.spriteBatch = new SpriteBatch(this.GraphicsDevice);

            // エフェクトを作成
            this.basicEffect = new BasicEffect(this.GraphicsDevice);

            // エフェクトで頂点カラーを有効にする
            this.basicEffect.VertexColorEnabled = true;

            // ビューマトリックスをあらかじめ設定 ((0, 0, 15) から原点を見る)
            this.basicEffect.View = Matrix.CreateLookAt(
                    new Vector3(0.0f, 0.0f, 15.0f),
                    Vector3.Zero,
                    Vector3.Up
                );

            // プロジェクションマトリックスをあらかじめ設定
            this.basicEffect.Projection = Matrix.CreatePerspectiveFieldOfView(
                    MathHelper.ToRadians(45.0f),
                    (float)this.GraphicsDevice.Viewport.Width /
                        (float)this.GraphicsDevice.Viewport.Height,
                    1.0f,
                    100.0f
                );

            // 頂点データを作成する
            this.vertices = new VertexPositionColor[3];

            this.vertices[0] = new VertexPositionColor(new Vector3(0.0f, 3.0f, 0.0f),
                                                       Color.Red);
            this.vertices[1] = new VertexPositionColor(new Vector3(3.0f, -2.0f, 0.0f),
                                                       Color.Blue);
            this.vertices[2] = new VertexPositionColor(new Vector3(-3.0f, -2.0f, 0.0f),
                                                       Color.Green);
        }

        /// <summary>
        /// ゲームが終了するときに一回だけ呼ばれ
        /// すべてのゲームコンテンツをアンロードします
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: ContentManager で管理されていないコンテンツを
            //       ここでアンロードしてください
        }

        /// <summary>
        /// 描画以外のデータ更新等の処理を行うメソッド
        /// 主に入力処理、衝突判定などの物理計算、オーディオの再生など
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Update(GameTime gameTime)
        {
            // Xbox 360 コントローラ、Windows Phone の BACK ボタンを押したときに
            // ゲームを終了させます
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            {
                this.Exit();
            }

            // TODO: ここに更新処理を記述してください

            // 登録された GameComponent を更新する
            base.Update(gameTime);
        }

        /// <summary>
        /// 描画処理を行うメソッド
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Draw(GameTime gameTime)
        {
            // 画面を指定した色でクリアします
            this.GraphicsDevice.Clear(Color.CornflowerBlue);

            // パスの数だけ繰り替えし描画 (といっても直接作成した BasicEffect は通常1回)
            foreach (EffectPass pass in this.basicEffect.CurrentTechnique.Passes)
            {
                // パスの開始
                pass.Apply();

                // ポリゴンを描画する
                this.GraphicsDevice.DrawUserPrimitives(
                    PrimitiveType.TriangleList,
                    this.vertices,
                    0,
                    1
                );
            }

            // 登録された DrawableGameComponent を描画する
            base.Draw(gameTime);
        }
    }
}