Feedback

C# - DirectX-Form

Veröffentlicht von am 20.01.2010
(2 Bewertungen)
Dieses Snippet enthält eine Klasse namens DXObject, welche ein mit DirectX zu zeichnendes Objekt definiert, bestehend aus:
Mesh Model : Das DirectX-Mesh
Vector3 Position : Die Position des Objekts
Material MeshMaterial : Das Material des Objekts

Außerdem eine Klasse namens DirectXForm, die von System.Windows.Forms.Form erbt und DirectX implementiert. Sie besitzt folgende öffentliche Member:
Device D3DDevice : Das DirectX-Device
event Rendered : Wird ausgelöst, wenn eine Szene gerendert wurde
List<DXObject> Meshes : Die zu zeichnende Liste von DXObjects
Vector3 CameraPosition : Die Position der Kamera
Vector3 LookAtPoint : Der Look-At-Vektor
Microsoft.DirectX.DirectInput.Device DXKeyboard : Die Tastatur
Color BackgroundColor : Die Hintergrundfarbe
Anderen Änderungen lassen sich direkt am Device D3DDevice ändern.

Nötig sind folgende Assemblyverweise (alle aus dem DirectX-SDK):
Microsoft.DirectX,
Microsoft.DirectX.Direct3DX,
Microsoft.DirectX.DirectInput

und folgende Using-Direktiven:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using Microsoft.DirectX.DirectInput;

Verwendet wird es wie eine normale Form.

Dieses Snippet soll jediglich die Verwendung von DirectX vereinfachen!

Hier möchte ich auf das C#-DirectX Tutorial auf
http://www.riemers.net/eng/Tutorials/dxcsharp.php
verweisen, welches mir das nötige Wissen verschafft hat, ohne welches ich dieses Snippet nicht hätte schreiben können.
GFU-Schulungen  [Anzeige]

C# 2017/2015/2013 Grundlagen

Nach Abschluss des Kurses sind Ihnen die Datentypen und Klassenbibliotheken von C# bekannt. Außerdem sind Sie in der Lage, mit Variablen umzugehen und deren Typen zu konvertieren. Sie definieren Namespaces und setzen diese ein, Sie erstellen eigene Klassen  und bauen Trouble Shooting ein.

VB.NET 2017/2015/2013 Komplett

Ziel des Seminars ist der flexible Umgang mit VB.NET, wie z.B. die damit verbundene eigenständige Entwicklung von Programmen oder das Verwenden von Datenbanken.

public class DXObject
    {
        public DXObject() { }
        public DXObject(Mesh model, Vector3 position, Material meshMaterial)
        {
            Model = model;
            Position = position;
            MeshMaterial = meshMaterial;
        }
        public Mesh Model { get; set; }
        public Vector3 Position { get; set; }
        public Material MeshMaterial { get; set; }
    }

    public class DirectXForm : System.Windows.Forms.Form
    {
        #region Private members

        private Vector3 cameraPosition = new Vector3(0, 0, -25);
        private Vector3 lookAtPoint = new Vector3(0, 0, 0);
        private Vector3 upVector = new Vector3(0, 1, 0);
        Microsoft.DirectX.DirectInput.Device keyboard = null;
        private Color backgroundColor = Color.Blue;

        #endregion


        #region Public members

        public event EventHandler Rendered;

        public Microsoft.DirectX.Direct3D.Device D3DDevice = null;

        public List<DXObject> Meshes = new List<DXObject>();

        public Vector3 CameraPostition
        {
            get { return cameraPosition; }
            set { cameraPosition = value; }
        }

        public Vector3 LookAtPoint
        {
            get { return lookAtPoint; }
            set { lookAtPoint = value; }
        }

        public Microsoft.DirectX.DirectInput.Device DXKeyboard
        {
            get { return keyboard; }
        }

        public Color BackgroundColor
        {
            get { return backgroundColor; }
            set { backgroundColor = value; }
        }

        #endregion


        #region Constructors

        public DirectXForm() : this(new Size(640, 480)) { }

        public DirectXForm(Size size)
        {
            this.ClientSize = size;
            this.Text = "";
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
            this.FormBorderStyle = FormBorderStyle.FixedDialog;
            Caps caps = Microsoft.DirectX.Direct3D.Manager.GetDeviceCaps(Microsoft.DirectX.Direct3D.Manager.Adapters.Default.Adapter, Microsoft.DirectX.Direct3D.DeviceType.Hardware);
            CreateFlags flags;
            if (caps.DeviceCaps.SupportsHardwareTransformAndLight)
                flags = CreateFlags.HardwareVertexProcessing;
            else
                flags = CreateFlags.SoftwareVertexProcessing;
            PresentParameters presParams = new PresentParameters();
            presParams.BackBufferFormat = Format.Unknown;
            presParams.SwapEffect = SwapEffect.Discard;
            presParams.Windowed = true;
            presParams.EnableAutoDepthStencil = true;
            presParams.AutoDepthStencilFormat = DepthFormat.D16;
            D3DDevice = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, this, flags, presParams);
            D3DDevice.DeviceReset += new System.EventHandler(this.OnResetDevice);
            OnResetDevice(D3DDevice, null);
            D3DDevice.RenderState.Lighting = true;
            D3DDevice.Lights[0].Type = LightType.Directional;
            D3DDevice.Lights[0].Direction = new Vector3(0, 0, 1f);
            D3DDevice.Lights[0].Diffuse = Color.White;
            D3DDevice.Lights[0].Enabled = true;
            D3DDevice.RenderState.FillMode = FillMode.Solid;
            keyboard = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Keyboard);
            keyboard.SetCooperativeLevel(this, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
            keyboard.Acquire();
        }

        #endregion


        #region Methods

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            this.Render();
            this.Invalidate();
        }

        protected void OnResetDevice(object sender, EventArgs e)
        {
            Microsoft.DirectX.Direct3D.Device device = (Microsoft.DirectX.Direct3D.Device)sender;
            device.Transform.Projection =
                Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(45.0f),
                (float)this.ClientSize.Width / this.ClientSize.Height,
                0.1f, 100.0f);
            device.RenderState.CullMode = Cull.None;
        }

        private void Render()
        {
            D3DDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.DarkBlue, 1.0f, 0);

            D3DDevice.BeginScene();

            D3DDevice.Transform.View = Matrix.LookAtLH(cameraPosition, lookAtPoint, new Vector3(0.0f, 1.0f, 0.0f));
            foreach (DXObject dxo in this.Meshes)
            {
                D3DDevice.Transform.World = Matrix.Translation(dxo.Position);
                D3DDevice.Material = dxo.MeshMaterial;
                dxo.Model.DrawSubset(0);
            }
            D3DDevice.EndScene();
            D3DDevice.Present();
            if (this.Rendered != null)
                Rendered(this, new EventArgs());
        }
        #endregion
    }
Abgelegt unter DirectX, Form, Direct3D, Fenster.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!