Tutti gli articoli di leonardo

.Net CF 3.5: Unable to read project file, C:\Windows \Microsoft.NET\Framework\ v3.5\Microsoft .CompactFramework.CSharp .targets OR (VisualBasic) was not foundWind

If you got this error opening Visual Studio after update to Windows 10 Anniversary Update,
you have to install the .Net Compact Framework PowerToys into your Windows 10 OS!!

Download it from Microsoft’s site: https://www.microsoft.com/en-us/download/confirmation.aspx?id=13442

Enjoy

How to generate a Unity 3D Terrain from height map image

Hi all,

In this tutorial I’m trying to explaing how to create an Unity 3D terrain, using a simple Height Map Image.

Height Map Image.

What is this height map image? Wikipedia says:

“In computer graphics, a heightmap or heightfield is a raster image used to store values, such as surface elevation data, for display in 3D computer graphics. A heightmap can be used in bump mapping to calculate where this 3D data would create shadow in a material, in displacement mapping to displace the actual geometric position of points over the textured surface, or for terrain where the heightmap is converted into a 3D mesh.”

http://en.wikipedia.org/wiki/Heightmap

For my tutorial I searched on Internet an height map image of Australia and I found this image:

Height-map-image-of-Australia
very nice image of Australia

In this image you can see this: darker areas correspond to areas of lower heights, and the  lighter areas correpond to higher zones.
So, when I see a white zone, there there is a mountain. Black zones are plain or sea.

Processing the image

For using the image in Unity 3D some simple image processing work has to be done. So, open the image in a Photo Processing software ( I used Photoshop TM ).

03-image-in-photoshop

And convert the image in grayscale – mode, better to reduce the size to 512×512 px.
Pay attention to use always 2 power sizes for this images, because Unity 3D optimize them very efficently with this sizes.

The next step is to save the image in a raw format. (Photoshop raw format *.RAW ). I named my image australia-gray.raw
04-save-photoshop-raw

Importing the image in Unity 3D

Now it’s time to play with Unity 3D and import the image that we’ve done.

Open Unity in a new scene, and create a new Terrain.
For Unity 5 the Terrain object creation from menu is here:

Game Object -> 3D Object -> Terrain

and a new terrain will be created:

01-Unity-NewTerrain

If you select the terrain GameObject from the Hierarchy, the inspector will show many options that you can play with.

For our Pourpose is important to select the “gear icon” in the inspector that opens many parameters.

05-ingranaggio-inspector

In this tab there are the setting for importing the raw image of Australia height map.
Press the button Import Raw.. and select the saved raw image

06-Import-Raw

07-import-raw-heightmap

A new import setting windows opens after you have selected the file, I modified the sizes of importing accordling with the image dimensions.

08-import-settings

Change Width and Height to 512×512 and also terrain size to 512 by 512.

Now you will have the new imported terrain:

09-adjust-terrain-height-1

There are some problems with the height due to the setting of “Terrain Height” in the inspector. Change the value to a better number, for exanple 60 or 50, and the terrain will display better:

10-adjust-terrain-height-2

Here we have the Australia with mountains in our Terrain Object!!! Hurraay!!

Then I played a little with some textures of grass, rocks and sea and I colored the map:

11-adding-texture

WOW! better.

You can download my unity 3D project from here, for Unity 3D v.5. and above versions.

Bye

Unity 3D: Singleton Design Pattern

Affrontiamo l’implementazione di un design pattern fondamentale della letteratura informatica: il Singleton.

L’implementazione sarà effettuata in Unity 3D, utilizzando il linguaggio C#.

Cos’è un singleton

Brevemente, il singleton  garantisce che una classe venga istanziata una e una sola volta in tutta l’esecuzione di un programma, accessibile da ogni punto del programma.

Implementazione

Per l’implementazione in C# si sfruttano i qualificatori static e public di una classe.

public class MySingleton : MonoBehaviour {
    // private fields
    private static MySingleton instance = null; // attenzione, i minuscola iniziale
 
    public bool MyBoolValue = true;
    //--------------------------------------------------
    // constructor field: Instance
    //--------------------------------------------------
    // Creates an instance of GamScreen if one does not exists
    //--------------------------------------------------
    // con la I maiuscola, indica il method
    public static MySingleton Instance {
        get {
            if (instance == null) {
                instance = new GameObject("MySingleton").AddComponent<MySingleton>();
            }
            return instance;
        }
    }
 
 
    //--------------------------------------------------
    // Unity method: OnApplicationQuit()
    //--------------------------------------------------
    // Called when you quit the application or stop the editor player
    //--------------------------------------------------
    public void OnApplicationQuit() {
        DestroyInstance();
    }
 
    //--------------------------------------------------
    // DestroyInstance()
    //--------------------------------------------------
    public void DestroyInstance() {
        Debug.Log("Screen Border Instance destroyed");
        instance = null;
    }
    //--------------------------------------------------
    // Initialize()
    //--------------------------------------------------
    public void Initialize() {
        Debug.Log("MySingleton initialized");
    }

    public void DoStuff() {
      Debug.Log("MySingleton stuff");
    }
    
}

Quindi per instanziare la prima volta il singleton sarà sufficente scrivere:

MySingleton.Instance.DoStuff();

e dopo quella riga di codice la classe sarà instanziata e accessibile da qualsiasi parte del programma.

Unity3d: Salvataggio delle impostazioni in modo persistente con PlayerPrefs

In questo rapido tutorial vediamo come rendere persistenti le impostazioni di gioco in Unity 3d.
Per “rendere persistenti” si intende che le impostazioni verranno mantenute anche se si chiude e si riapre l’applicazione.

Allo scopo, il framework Unity ci fornisce la classe PlayerPrefs (namespace UnityEngine).
Un’importante limitazione da segnalare per questo sistema di memorizzazione persistente è che abbiamo a disposizione solo 1 megabyte.

Il sistema funziona tramite la logica della memorizzazione di chiave-valore.

ESEMPIO (C#)

Salviamo il punteggio del gioco:
PlayerPrefs.SetInt(“Score”1000); // salvataggio di 1000 nella chiave “Score”

Successivamente, per andare a rileggere il valore salvato:
int score = PlayerPrefs.GetInt(“Score”);

Unity 3D – Come sparare con un fucile, visualizzando i fori del proiettile

In questo articolo vedremo come aggiungere una texture che simulerà un foro su una superfice di un oggetto che è stato “colpito da un proiettile”.

( Pulsante sinistro mouse = SPARA   Frecce= spostati )

Procuriamoci una scena di base in cui ci sono i nostri oggetti da colpire.
Nel mio caso ho creato a partire da una scena vuota un piano (plane)  che fa da pavimento ( aggiungendo una texture per l’erba ) e quattro cubi (cube), a cui ho aggiunto una texture di legno.
Ho importato dagli asset standard il First Person Controller.
Ho impilato i cubi.
Ottenendo la scena nell’immagine:
tut_bulletholes_01

A questo punto per simulare uno sparo di un fucile aggiungiamo uno script all’oggetto First Person Controller, utilizzando un RayCast per identificare l’oggetto colpito.

void Update () {
        // If the Button “Fire1” is pressed down it will return true and so we enter the if condition
        if(Input.GetButton("Fire1") && Time.time > nextFire)
        {
      // è stato premuto il bottone "Fire1", che per default è associato al bottone sinistro del mouse.
  
            nextFire = Time.time + fireRate; // piccolo filtro di tempo per evitare che ad ogni frame venga sparato un raggio

            // Vector2 è usato per avere le coordinate del puntatore sullo schermo al momento della pressione del muose sinistro.
            // Il centro dello schermo è calcolato dividendo per due le dimensioni dello schermo
            Vector2 screenCenterPoint = new Vector2(Screen.width/2, Screen.height/2);
            
            // Camera.main è la camera di default della scena ( deve avere il Tag MainCamera )
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            if(Physics.Raycast(ray, out hit, Camera.main.farClipPlane)) // spara il raggio dalla camera
            {
                // E' stata rilevata la collisione del raggio con un oggetto dotato di Collider
                // qui possiamo gestire la collisione
                Debug.DrawLine (transform.position, hit.point, Color.red);
                Debug.Log("hit the object:" + hit.transform.name);
            }
        }
    }

Premendo play vedremo il raggio ROSSO uscire dalla camera e colpire un cubo.

Ora, procuriamoci una texture che faccia da “foro”:
bullethole

Io l’ho creata velocemente con un programma di grafica qualsiasi.
Aggiungiamo un quad alla scena e trasciniamoci sopra la texture del foro di proiettile.tut_bulletholes_02tut_bulletholes_03

Costruiamo un prefab con questo quad, chiamandolo ad esmpio: BulletHole.

Quindi aggiungiamo allo script che gestisce il raycast una variabile public per assegnargli il prefab appena creato.

public GameObject bulletHolePrefab; // bullet hole prefab to instantiate

e aggiungiamo il codice di gestione:

if(Physics.Raycast(ray, out hit, Camera.main.farClipPlane)) { // spara il raggio dalla camera

  // E' stata rilevata la collisione del raggio con un oggetto dotato di Collider
  // qui possiamo gestire la collisione
  Debug.DrawLine (transform.position, hit.point, Color.red);
  Debug.Log("hit the object:" + hit.transform.name);
  
  Vector3 bulletHolePosition = hit.point + hit.normal * 0.01f;  // posizione di collisione del raycast sull'oggetto colpito
  // notare la normale all'oggetto è l'offset di 0.01f per non avere intersecazioni di textures.

  // ci serve una variabile per salvarci la rotazione del prefab
  // La rotazione sarà data dall'unione del vettore forward e la normale al punto di impartto
  Quaternion bulletHoleRotation = Quaternion.FromToRotation(-Vector3.forward, hit.normal);

  // instanziamo il prefab
  GameObject hole = (GameObject)GameObject.Instantiate(bulletHolePrefab, bulletHolePosition, bulletHoleRotation);
  hole.transform.parent = hit.transform; // assegniamo anche il parent del foro per fare in modo che l'oggetto colpito, 
                                         // se si sposta, ha sempre il foro posizionato correttamente.

  // chicca: se ho un rigdbody sull'aggotto applico una forza per simulare l'impatto del proiettile
  if ( hit.rigidbody != null ) {
    hit.rigidbody.AddForceAtPosition (150 * ray.direction, hit.point);

    // riproduzione dell'audio attaccato all'aggetto.
    if ( audio != null ) {
      audio.Play();
    }

  }

}

Scarica da qui il progetto demo Unity3D

Arduino con WiFi shield

Hello WiFi ( Arduino )

Testiamo oggi il modulo (Shield) Arduino WI-FI.

Shield_Arduino1

Questo shield utilizza un controllore WiFi prodotto da Microchip il MRF24WB0MA, molto semplice da utilizzare, che comunica con un microcontrollore attraverso la porta SPI.
Tale controllore è classificato sul sito ufficiale Microchip come “mature” quindi molto affidabile e robusto.

WiFiShield

Hardware

Il chip Integra uno stack TCP/IP e un connection manager con lo standard 802.11, non necessita di memoria RAM esterna.
Questo e’ il link alla pagina ufficiale sul sito Microchip: http://www.microchip.com/wwwproducts/Devices.aspx?product=MCW1001A

La scheda e’ arrivata con i connettori da saldare, quindi, dotandoci di saldatore e stagno, procediamo al lavoro “sporco”. Dopo aver saldato i vari connettori ( headers in English ), proviamo a connettere fisicamente la scheda Arduino UNO con lo shield WiFi.

Arduino con WiFi shield

Perfetto, i connettori della scheda Arduino Uno e WIFI Shield combaciano.
Proviamo ora a dare alimentazione alla scheda… FIUUU niente fumo, tutto OK!

In aggiunta prepariamo un led VERDE di test con una resistenza e colleghiamolo al PIN 8 di Arduino. Il LED ci servirà per testare la connessione WiFi e avere un feedback sull’avvenuta esecuzione dei comendi da wifi.

Passiamo quindi alla parte di configurazione software.

 Firmware

Scarichiamo le librerie appositamente scritte per questo modulo ( WiShield by Async Labs ), e copiamo la directory della libreria nella radice di

c:\Program Files (x86)\Arduino\libraries\

Se tutto e’ configurato correttamente, dovremmo vedere aprendo l’IDE Arduino in

File->Esempi->WiShield

dei nuovi esempi per testare lo shield.
Apriamo lo scketch SimpleServer che dimostra come configurare e utilizzare il modulo per farlo funzionare da web server.

L’impostazione fondamentale da esiguire nello sketch e’ quella relativa alla rete WiFi casalinga, in cui bisogna specificare il nome della rete la password di accesso e la porta http per l’accesso al web server.

// Wireless configuration parameters ---------------------
unsigned char local_ip[] = {192,168,1,2};    // IP address of WiShield
unsigned char gateway_ip[] = {192,168,1,1};    // router or gateway IP address
unsigned char subnet_mask[] = {255,255,255,0};    // subnet mask for the local network
const prog_char ssid[] PROGMEM = {"surfer's wifi"};        // max 32 bytes

unsigned char security_type = 3;    // 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2

// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = {"wireless.321"};    // max 64 characters

Proviamo quindi a scaricare il firmware  in Arduino. Se tutto e’ configurato correttamente dovremmo vedere il led verde che si accende sullo shield, il che indica la connessione alla rete WiFi.

HTML

Quindi passiamo a costruire una pagina web che accende e spegne il led tramite la pressione di pulsanti, con la tecnologia AJAX.

<!DOCTYPE HTML><html><head><title>Arduino | LED CONTROL</title>
<style type="text/css">
.btn { width:180px; height:40px; font-size:150%; color:#0075c7; margin: 0.5em; }
</style>
<script type='text/javascript'>
var ledStatus = 0;var myRequest;
function CreateXmlHttpReq(handler) {
  var xmlhttp = null;
  xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = handler;
  return xmlhttp;
}
function setLed(ledNo, status) {
    myRequest = CreateXmlHttpReq(myHandler);
    myRequest.open('GET','192.168.1.2/setled?ld'+ledNo+'='+status);
    myRequest.send(null);
}
function myHandler() {    if (myRequest.readyState == 4 && myRequest.status == 200) {    } }
</script>
</head>
<body>
<center>
    <h2>accendi / spegni LED (pin 8)</h2>
    <div><input type='button' class="btn" name='ledOn' value='LED ON' onclick='setLed(0, 1)' /><input type='button' class="btn" name='ledOff' value='LED OFF' onclick='setLed(0, 0)' /></div>
    <footer>
        <p>Arduino with WiFi board <br /> libreria WiShield by Async Labs Inc.<br /> Leonardo Benini 2014 &copy;</p>
    </footer>
</center>
</body>
</html>

VERIFICA FUNZIONAMENTO

Programmiamo Arduino… e testiamo!!!

Hello Arduino

Premessa

Essendo completamente alle prime armi con il mondo Arduino ( ma non nella programmazione di microcontrollori in generale) scrivo questo articolo per spiegare come iniziare lo sviluppo con questo famoso sistema di sviluppo a microcontrollore.

Vediamo innanzitutto l’ hardware:
Arduino UNO dotato di microcontrollore ATMEGA328P
Arduino-uno-small

Installazione dell’ambiente di sviluppo IDE

Andando sul sito web ufficiale di arduino: http://arduino.cc/en/Main/Softwarescarichiamo e installiamo l’ambiente di sviluppo integrato ( IDE ), nel mio caso installo la versione Windows 1.06, che servirà per programmare (e debuggare) il microcontrollore attraverso il linguaggio, installare i drivers USB.

Installato l’ambiente di sviluppo per prima cosa collego alla posrta USB la scheda Arduino e attendo la configurazione dei drivers USB, che fallisce.
Bisogna quindi installare i drivers MANUALMENTE da Gestione Dispositivi.
Si vedrà una porta COM6 Arduino Uno

Installa-Drivers-Arduino

Installare quindi il driver manualmente selezionando Installa nuovo Driver e cercandolo nel computer manualmente, nella directory di installazione Programmi(x86)Arduino\drivers ( Attenzione, non FTDI drivers ) -> arduino.inf

Una volta installato il driver aprire l’IDE menu-arduino dal menu.

L’ambiente di sviluppo Arduino è dotato di comodi esempi utili in questo caso per provare la scheda.

Apriamo lo Sketch ( è così che vengono chiamati i programmi arduino ) Blink da
File->Esempi->01. Basic -> Blink

Quindi scegliamo il nostro dispositivo da Strumenti->Tipo di Arduino->Arduino Uno

Premiamo il tasto di upload dello sketch pulsant-uploadi

E se tutto è andato bene si vedranno i led di TX/RX sulla scheda lampeggiare.

Dopodichè verrà eseguito lo sketch di esempio sulla scheda che fa lampeggiare il led L

COMPLIMENTI!! avete una scheda Arduino funzionante e pronta per essere programmata!!!!

 

OLYMPUS DIGITAL CAMERA

Unity 3D – Come riprodurre un audio quando due oggetti si scontrano

 

E’ possibile generare un effetto sonoro quando due oggetti collidono fra loro in modo semplice.

esempio live

in questo esempio viene riprodotto un rumore quando la palla si scontra con un altro oggetto ( pavimento )

La classe MonoBehaviour, classe padre di ogni oggetto nella scena di unity3d, offre un intertessante metodo ( method ):

OnCollisionEnter(Collision)

OnCollisionEnter è chiamato dal framework quando l’oggetto ( con un collider/rigidbody ) ha cominciato a toccare un altro oggetto dotato di collider/rigidbody.

Il parametro passato Collision contiene informazioni utili sull’altro oggetto, il punto di collisione e altre utili informazioni come ad esempio la velocità di impatto.

Quello che interessa a noi è appunto la velocità di impatto, che la sfrutteremo nel seguente modo:

void OnCollisionEnter(Collision collision) {    
    if ( (collision.relativeVelocity.magnitude > 2) && (audio != null) )
       audio.Play();
}

Quindi se la velocità di impatto supererà il valore 2 verrà riprodotto l’audio attached all’oggetto.
Quindi è necessario che l’oggetto abbia uno script Audio associato.

Osservazioni:

  • Entrambi gli oggetti devono avere un component rigidbody/collider.
  • Se l’audio riprodotto vi sembra basso controllate le proprietà del file audio, molto probabilmente lo volete con proprietà 2D.
  • Regolate sempre il valore di confronto con il collision.relativeVelocity.magnitude ( nell’esempio è > 2 ) per evitare suoni non voluti.