Software di simulazione

di il
15 risposte

Software di simulazione

Ciao a tutti

Devo fare un programma in cui far interagire tra di loro alcuni modelli 3d di parti meccaniche.
Volevo un consiglio su quale ambiente utilizzare C#, C++, DirectX, Xna.
La mia idea era di usare C# e DirectX ma vorrei un parere.

15 Risposte

  • Re: Software di simulazione

    Ciao Franco1,

    dipende, se la tua applicazione è prevalentemente 3d ti consiglio XNA. Nella sezione 'articoli' di questo sito trovi dei bei tutorial su XNA. Ti dico che sono belli perché li avevo seguiti a suo tempo.

    Se invece ti serve una applicazione standard in cui fai largo uso dei componenti di WindowsForm e il 3d è ad esempio in un riquadro la soluzione C# + DirectX è una buona soluzione. Useresti un pannello come superfice di rendering.
  • Re: Software di simulazione

    Mi andrebbe bene la soluzione C# e DirectX, la parte DirectX va messa in una dll C++?
  • Re: Software di simulazione

    In realtà non è necessario, puoi fare tutto in C# usando questi namespace:
    
    using Microsoft.DirectX;
    using Microsoft.DirectX.Direct3D;
    using Direct3D = Microsoft.DirectX.Direct3D;
    
    ad esempio per creare un cubo:
    
    Mesh cube = Mesh.Box(device, 1, 1, 1);
    
  • Re: Software di simulazione

    La soluzione C# mi interessa molto. non mi è chiaro dove va messo il loop di rendering.
  • Re: Software di simulazione

    Puoi semplicemente usare un timer:
    
    private void timer3d_Tick(object sender, EventArgs e)
    {
        if (Visible && (WindowState != FormWindowState.Minimized))
        {
             my3D.Render();
        }
    }
    
  • Re: Software di simulazione

    Grazie, sapresti indicarmi un sito dove trovare un esempio di base già fatto.
  • Re: Software di simulazione

    Franco1 ha scritto:


    Grazie, sapresti indicarmi un sito dove trovare un esempio di base già fatto.
    Il sito migliore è questo dove ti trovi!

    Questo esempio ti mostra un cubo che ruota:
    
    public partial class Form1 : Form
    {
        My3d my3d;
            
        public Form1()
        {
            InitializeComponent();
    
            my3d = new My3d(Handle);
            timer1.Enabled = true;
        }
    
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (Visible && (WindowState != FormWindowState.Minimized))
            {
                my3d.Render();
            }
        }
    }
    
    
    public class My3d
    {
        protected Device myDevice;
        protected Mesh myCube = null;
    
        public My3d(IntPtr handle)
        {
            PresentParameters m_presentParams = new PresentParameters();
            m_presentParams.Windowed = true;
            m_presentParams.SwapEffect = SwapEffect.Discard;
            m_presentParams.EnableAutoDepthStencil = true;
            m_presentParams.AutoDepthStencilFormat = DepthFormat.D16;
    
            myDevice = new Device(0, DeviceType.Hardware, handle,
                CreateFlags.SoftwareVertexProcessing, m_presentParams);
    
            myDevice.DeviceReset += new System.EventHandler(this.OnResetDevice);
            OnResetDevice(myDevice, null);
    
            myCube = Mesh.Box(myDevice, 1, 1, 1);
        }
    
        protected void OnResetDevice(object sender, EventArgs e)
        {
            Device device = (Device)sender;
            device.RenderState.ZBufferEnable = true;
            device.RenderState.Ambient = System.Drawing.Color.White;
            myDevice.RenderState.Lighting = true;
        }
    
        protected void SetupLights()
        {
            myDevice.Lights[0].Diffuse = Color.White;
            myDevice.Lights[0].Direction = new Vector3(1, -1, 1);
            myDevice.Lights[0].Enabled = true;
    
            myDevice.RenderState.Ambient = Color.FromArgb(0x888888);
        }
    
        protected void SetDeviceMaterial(Color color)
        {
            Material material = myDevice.Material;
            material.Diffuse = color;
            material.Ambient = color;
            myDevice.Material = material;
        }
    
        public void Render()
        {
            myDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.Blue, 1.0f, 0);
            myDevice.BeginScene();
    
            SetupLights();
            myDevice.Transform.View = Matrix.LookAtLH(new Vector3(2.0f, 2.0f, -2.0f),
                new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
    
            myDevice.Transform.Projection = Matrix.PerspectiveFovLH((float)(Math.PI / 4), 1.0f, 1.0f, 100.0f);
    
            SetDeviceMaterial(Color.Orange);
            myDevice.Transform.World = Matrix.RotationY(Environment.TickCount/1000f);
            myCube.DrawSubset(0);
    
            myDevice.EndScene();
            myDevice.Present();
        }
    }
    
  • Re: Software di simulazione

    Conosco le DirectX in C++ per cui questo codice mi è chiaro, grazie.
    Mi dicevi che di potrebbe visualizzare il 3d in un pannello, come di fa?
  • Re: Software di simulazione

    È molto semplice, inserisci un Panel nel form e poi invece di passare l' Handle del form, passi quello del panel.
    
    device = new Device(0, DeviceType.Hardware, panel1.handle,
                CreateFlags.SoftwareVertexProcessing, m_presentParams);
    
  • Re: Software di simulazione

    Mi stai risparmiando un sacco di lavoro, non so come ringraziarti!
  • Re: Software di simulazione

    Potresti offrirmi una birretta.
  • Re: Software di simulazione

    Questo è il minimo!
  • Re: Software di simulazione

    Grazie,
    poi potresti ringraziare il forum cercando di aiutare qualcun altro.
  • Re: Software di simulazione

    Ok, non mancherò.
Devi accedere o registrarti per scrivere nel forum
15 risposte