Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
PrendiOggetti.cs
using UnityEngine;
using System.Collections;
using System;
public class PrendiOggetti : MonoBehaviour
{ public int Monete = 0;
public int vitedisponibili = 3;
public int energia = 30;
string senergia= "";
bool finish = false;
bool win = false;
bool vita1 = false;
bool vita2 = false;
GUIStyle style = new GUIStyle();
public GUIStyle iconamonete;
public GUIStyle iconavite;
public GUIStyle iconaenergia;
void Start()
{ Monete = 0;
vitedisponibili = 3;
InvokeRepeating("decreaseEnergy", 1, 1);
InvokeRepeating("IncreaseCoins", 1, 1);
senergia = "||||||||||||||||||||||||||||||";
style.alignment = TextAnchor.MiddleLeft;
}
void Update()
{ if(Monete >= 10)
{ win = true;
}
}
void OnGUI()
{ if (energia > 0 && vitedisponibili > 0 && !win)
{ if (GUI.Button(new Rect(1210, 650, 130, 30), "Back To Menu"))
{ Application.LoadLevel("Menu");
}
GUI.Label(new Rect(10, 10, 80, 80), "Coins " + Monete, iconamonete);
GUI.Label(new Rect(10, 620, 80, 80), "Life " + vitedisponibili, iconavite);
GUI.color = Color.yellow;
GUI.Label(new Rect(1100, 10, 80, 80), "Energy " , iconaenergia);
GUI.Box(new Rect(1200, 22, 130, 20), senergia);
}
if (finish)
Application.LoadLevel ("Game_over");
if (win)
Application.LoadLevel ("Win");
} 8
void decreaseEnergy()
{ energia--;
if(energia >= 0)
senergia = senergia.Substring(0, senergia.Length - 1);
if (energia == 0 && vitedisponibili>0)
{ vitedisponibili -= 1;
energia = 30;
senergia = "||||||||||||||||||||||||||||||";
} if (vitedisponibili == 0)
finish = true;
}
void IncreaseCoins()
{ if ((Monete == 4) && vita1 == false)
{ vita1 = true;
vitedisponibili += 1;
}
if ((Monete == 8) && vita2 == false)
{ vita2 = true;
vitedisponibili += 1;
}
}
private int strlen(string senergia)
{ throw new NotImplementedException();
}
public void PrendiMonetina(int mon)
{ Monete += mon;
}
}
Tale script è associato ad Ethan, personaggio animato incluso negli standard Assets di Unity 5.
Ad Ethan sono associati anche altri script che permettono l’animazione e il movimento, il quale
avviene attraverso l’utilizzo dei tasti di direzione. 9
Su Ethan è posizionata una camera che permette la visione del gioco in terza persona. 10
L’oggetto Monetina è stato scaricato dall’Asset Store
Ad esso sono associati:
Lo script che permette l’animazione e quindi la rotazione delle monetine:
RotazioneOggetto.cs
using UnityEngine;
using System.Collections;
public class Rotazioneoggetto : MonoBehaviour {
public float Rotazione = 50.0f;
void Update ()
{ transform.Rotate(Vector3.up * Rotazione * Time.deltaTime);
}
} Lo script che permette al personaggio di raccogliere l’oggetto:
Monetina.cs
using UnityEngine;
using System.Collections;
public class Monetina : MonoBehaviour 11
{ public int aggiungimonetina = 1;
public PrendiOggetti prendioggetti;
void OnTriggerEnter(Collider other)
{
if (other.GetComponent<Collider>().tag == "Player")
{ other.GetComponent<Collider>().gameObject.SendMessage("PrendiMonetina",
aggiungimonetina, SendMessageOptions.DontRequireReceiver);
Destroy(gameObject);
}
}
} Tourist Guide
Il gioco prevede anche una guida turistica con la possibilità di scegliere tra tre lingue: Italiano,
Inglese e Francese. 12
Una volta scelta la lingua, il giocatore potrà ascoltare la voce guida e allo stesso tempo scorrere il
testo informativo ed osservare l’immagine del tempio.
I componenti della scena sono:
Nella sezione Tourist Guide è possibile anche:
1) Effettuare una passeggiata virtuale all’interno del Tempio (nella realtà questo non è
possibile), con la possibilità di recepire altre informazioni.
Ad esempio, come mostrato in figura, se il personaggio si avvicinerà al cartello, esso
sarà illuminato e saranno mostrate delle immagini riguardanti il bene culturale flegreo;
tale operazioni vengono effettuate mediante l’ausilio di Intelligenza Artificiale. 13
LightScript.js (script per l’accensione della luce)
#pragma strict
private var LightShow : boolean = false;
var myLight : Light;
function OnTriggerStay (Col : Collider)
{ if(Col.tag == "Player")
LightShow = true;
}
function OnTriggerExit (Col : Collider)
{ if(Col.tag == "Player")
LightShow = false;
}
function Update() {
if (LightShow == true ) { myLight.enabled = true;
}
else if (LightShow == false) { myLight.enabled = false;
}
} 14
GUIAppear.js (script per la visione intelligente delle immagini)
#pragma strict
private var guiShow : boolean = false;
var riddle1 : Texture;
var riddle2 : Texture;
function OnTriggerStay (Col : Collider)
{ if(Col.tag == "Player")
guiShow = true;
}
function OnTriggerExit (Col : Collider)
{ if(Col.tag == "Player")
guiShow = false;
}
function OnGUI()
{ if(guiShow == true){
GUI.DrawTexture(Rect(400, 10, 250, 320), riddle1);
GUI.DrawTexture(Rect(700, 10, 257, 318), riddle2);
}
} Il giocatore per terminare la passeggiata virtuale e per ritornare al Main Menu, dovrà
aprire il cancello cliccando sul tasto “P”. Tale interazione viene anch’essa effettuata
attraverso Intelligenza Artificiale. 15
Gate.js (script per l’apertura/chiusura del cancello)
#pragma strict
var smooth = 0.5;
var DoorOpenAngle = 90.0;
private var open : boolean;
private var enter : boolean;
private var defaultRot : Vector3;
private var openRot : Vector3;
function Start(){
defaultRot = transform.eulerAngles;
openRot = new Vector3 (defaultRot.x, defaultRot.y + DoorOpenAngle, defaultRot.z);
}
function Update (){
if(open){
//Open door
transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, openRot, Time.delt
aTime * smooth);
}
else{ //Close door
transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, defaultRot, Time.d
eltaTime * smooth); }
if(Input.GetKeyDown("p") && enter){
open = !open;
}
}
function OnGUI(){
if(enter){
GUI.Box(new Rect(Screen.width/2 - 75, Screen.height -
100, 335, 30), "Press 'P' to open/close the gate and go to Menu");
}
}
//Activate the Main function when player is near the door
function OnTriggerEnter (other : Collider){
if (other.gameObject.tag == "Player") {
enter = true;
}
}
//Deactivate the Main function when player is go away from door
function OnTriggerExit (other : Collider){
if (other.gameObject.tag == "Player") {
enter = false; 16
}
}
Esci.js (script per l’uscita dal Tempio)
#pragma strict
private var Exit : boolean = false;
function OnTriggerStay (Col : Collider)
{ if(Col.tag == "Player")
Exit = true;
}
function Update()
{ if(Exit == true){
Application.LoadLevel("Menu");
}
}
2) Modificare la luminosità e il contrasto dell’immagine del Tempio.
Setting Image
Per completezza, nel progetto, è stata inserita una sezione dedicata alle tecniche di Image
Processing. L’ambiente di sviluppo adoperato per tali operazioni è Eclipse; la libreria software
utilizzata per l’Image Processing è OpenCV. 17
OpenCV
OpenCV Library acronimo di Open Computer Vision Library è una libreria che colleziona algoritmi
open source per la computer vision e l’image processing. Questa libreria, scritta in C e C++,
sviluppata inizialmente da Intel, è disponibile su diverse piattaforme (Windows, Unix, MacOs e
ultimamente anche per Android).
Abbiamo utilizzato la suddetta libreria per applicare alle immagini delle tecniche di Image
Processing, nello specifico abbiamo utilizzato tecniche di Image Enhancement :
Increase Brightness
Increase Contrast
Sostanzialmente l’obiettivo dell’Image Enhancement è quello di elaborare le immagini per il loro
miglioramento; il concetto di miglioramento è molto vago e non oggettivo, in quanto è legato
all’applicazione nella quale utilizzeremo l’immagine.
Le operazioni fatte possono essere descritte rigorosamente come funzioni matematiche e di
conseguenza rappresentate graficamente.
Increase Brightness
Alcune trasformazioni di tipo point to point possono essere facilmente utilizzate per
incrementare/decrementare la luminosità di un’immagine. Ad esempio la seguente
trasformazione per un’immagine a colori (con k=8 bit per banda): 18
permette di incrementare la luminosità dell’immagine stessa, essendo La funzione di
trasformazione in questo caso si presenta come una retta rialzata di un valore che andrà ad
incrementare i valori di intensità di colore dei pixel dell’immagine, con un salto esatto di livelli.
Ad un certo punto si ha un tratto costante, detto di saturazione, dove ad ogni profondità di colore
dell’immagine di
partenza si fa corrispondere la massima luminosità (bianco).
Il codice Java per l’incremento di luminosità di un’immagine a colori è il seguente :
package enhancing;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
public class Brightness {
static int width;
static int height;
static double alpha = 1;
static double beta = 50
public static void main( String[] args ) {
try{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 19
Mat source =
Highgui.imread("C:\\Users\\home\\Desktop\\universita\\SMU\\Seminari\\Image
Processing\\immagini\\Tempio_Serapide.jpg",Highgui.CV_LOAD_IMAGE_COLOR);
Mat destination = new
Mat(source.rows(),source.cols(),source.type());
source.convertTo(destination, -1, alpha, beta);
Highgui.imwrite("C:\\Users\\home\\Desktop\\universita\\SMU\\Seminari\\Image
Processing\\immagini\\Brightness.jpg", destination);
}catch(Exception e){
System.out.println("error: " + e.getMess age());
}
}
}
Increase Contrast
Il contrasto di un’immagine può essere visto come il rapporto tra la luminosità degli oggetti in essa
rappresentati e quella del background.
L’incremento del contrasto corrisponde a “risaltare” gli oggetti rispetto allo sfondo
evidenziandone i dettagli.
L’aumento di contrasto avviene introducendo due zone di saturazione. I pixel “scuri” sono resi
ancora più