2017年11月30日 星期四

AR meets IoTs: 當擴增實境遇到物聯網-讀取感知訊息程式解析

AR meets IoTs: 當擴增實境遇到物聯網相關文章,如下:
初接觸
用網頁來控制LED亮滅
發佈感知訊息程式解析

在上圖我們可以清楚地看到在IoT content目錄下,有三個原始程式:
  1. IoT.cs
  2. ReadStream.cs
  3. WebStreamReader.cs

當您點選右上角的codeContainer,只看到兩個腳本程式,分別是IoT.cs和ReadStream.cs,但沒有看到WebStreamReader.cs。其實WebStreamReader是被宣告在ReadStream程式內,如下:


public class ReadStream : MonoBehaviour
{
public string PhotonParticleURL = "https://api.particle.io/v1/devices/events?access_token=649e7d09d0980e4b649e42f6dcff79887d9570e2";
WebStreamReader request = null;

我們以在ReadStream程式中找到WRequest()函式,您就可以看到程式是如何建立物件new WebStreamReader(),如何啟動網站連結Start(PhotonParticleURL),如何取得網站資料request.GetNextBlock(),再解析出溫度的資料Contains ("temperature"),最後再顯示在AR畫面上gameObject.GetComponent ().microTemperatureVal
IEnumerator WRequest()
{
request = new WebStreamReader();
request.Start(PhotonParticleURL); //https://www.ourtechart.com//wp-content/uploads/2016/04/jsonAllData.txt");
string stream = "";
while (true)
{
string block = request.GetNextBlock();
if (!string.IsNullOrEmpty(block))
{
stream += block;
//Debug.Log ("Stream1: " + stream);
string[] data = stream.Split(new string[] { "\n\n" }, System.StringSplitOptions.None);
//Debug.Log ("Data length: " + data.Length);
stream = data[data.Length - 1];

for (int i = 0; i < data.Length - 1; i++)
{
if (!string.IsNullOrEmpty(data[i]))
{
// Debug.Log ("Data: " + data [i]); // print all block of data (event + data)
if (data [i].Contains ("light")) {
lightTrue = true;
string output = data [i].Substring(data [i].IndexOf("{"));
parseDataLight = JsonUtility.FromJson (output);
//Debug.Log ("Data of Photoresistor: " + parseData.data);
//text.text = parseData.data.ToString ();
//gameObject.GetComponent ().microPhotoresistorVal = parseDataLight.data;
}
if (data [i].Contains ("temperature")) {
temperatureTrue = true;
string output = data [i].Substring(data [i].IndexOf("{"));
parseDataTemperature = JsonUtility.FromJson (output);
//Debug.Log ("Data of Temperature sensor: " + parseData.data);
//text.text = parseData.data.ToString ();
//gameObject.GetComponent ().microTemperatureVal = parseDataTemperature.data;
}
if (data [i].Contains ("motion")) {
motionTrue = true;
string output = data [i].Substring(data [i].IndexOf("{"));
parseDataMotion = JsonUtility.FromJson (output);
//Debug.Log ("Data of PIR sensor: " + parseData.data);
//text.text = parseData.data.ToString ();
//gameObject.GetComponent ().motionDetectedBool = Convert.ToBoolean(parseDataMotion.data);
}
if (data [i].Contains ("ultraviolet")) {
ultravioletTrue = true;
string output = data [i].Substring(data [i].IndexOf("{"));
parseDataUltraviolet = JsonUtility.FromJson (output);
//Debug.Log ("Data of PIR ultraviolet: " + parseData.data);
//text.text = parseData.data.ToString ();
//gameObject.GetComponent ().microUltravioletVal = parseDataUltraviolet.data;
}
if (data [i].Contains ("humidity")) {
humidityTrue = true;
string output = data [i].Substring(data [i].IndexOf("{"));
parseDataHumidity = JsonUtility.FromJson (output);
//Debug.Log ("Data of Humidity: " + parseData.data);
//text.text = parseData.data.ToString ();
//gameObject.GetComponent ().microHumidityVal = parseDataHumidity.data;
}
//Debug.Log ("TEst: " + humidityTrue + temperatureTrue + lightTrue + ultravioletTrue);
if (humidityTrue && temperatureTrue && lightTrue && ultravioletTrue) {
//Debug.Log ("PRINT ALLLLLLLLLLLLLL");
gameObject.GetComponent ().microPhotoresistorVal = parseDataLight.data;
gameObject.GetComponent ().microTemperatureVal = parseDataTemperature.data;
gameObject.GetComponent ().motionDetectedBool = Convert.ToBoolean(parseDataMotion.data);
gameObject.GetComponent ().microUltravioletVal = parseDataUltraviolet.data;
gameObject.GetComponent ().microHumidityVal = parseDataHumidity.data;
humidityTrue = false;
motionTrue = false;
temperatureTrue = false;
lightTrue = false;
ultravioletTrue = false;
}
}
}
}
yield return new WaitForSeconds(1);
}

真正要顯示在畫面上是IoT.cs的任務,在Update()中可以找溫度的片斷程式如下:

microTemperatureText.text = microTemperatureVal.ToString ();
checkTemperature ();

依照顏色來改變按鈕的顏色值:
private void checkTemperature() {
index = 0;
if (microTemperatureVal >= minTemp && microTemperatureVal <= maxTemp) // Green Color - temperature is ok
greenButtonColor (index);// (Buttons[0]);
if (microTemperatureVal > maxTemp) // Red Color - temperature is too Hot
orangeButtonColor(index);
if (microTemperatureVal < minTemp) // Blue Color - temperature is too Cold
blueButtonColor (index);
}

2017年11月29日 星期三

AR meets IoTs: 當擴增實境遇到物聯網-發佈感知訊息程式解析

AR meets IoTs: 當擴增實境遇到物聯網相關文章,如下:
初接觸
用網頁來控制LED亮滅

請先下載Arduino的範例程式:

取出發佈相關程式:
    // Humidity measurement
    temperature = dht.getTempCelcius();
    
    // Humidity measurement
    humidity = dht.getHumidity();
    
    // Light level measurement
    float light_measurement = analogRead(light_sensor_pin);
    light = (int)(light_measurement/4096*100);
    
    int uvValue=analogRead(uv);
    ultraviolet = (uvValue*100)/1023;
    // Publish data
    Particle.publish("temperature", String(temperature));// + " °C");
    delay(t);
    Particle.publish("humidity", String(humidity));// + "%");
    delay(t);
    Particle.publish("light", String(light));// + "%");

Particle.publish()可以將資訊送到物聯網伺服器,一般都採用名稱/內容值的表示方式,來進行資料的連結,"temperature" 是名稱, String(temperature)是內容值


    delay(t);

AR meets IoTs: 當擴增實境遇到物聯網-用網頁來控制LED亮滅

初接觸的文章:AR meets IoTs: 當擴增實境遇到物聯網

今天我們來介紹如何把Arduino訊號傳到雲端伺服主機,設計物聯網應用程式,換句話,就是如何使用HTTP來監控軟硬體設備。

在初接觸文章的下方,您可以看到Arduino的原始程式下載,這是一個可以用網頁技術來控制接到Arduino上的LED。

大家可以參考這篇文章
https://docs.particle.io/guide/getting-started/examples/photon/#control-leds-over-the-39-net

在這篇文章的arduino setup()函式的程式碼如下:


arduino程式:

void setup() {
     pinMode(led1, OUTPUT); OUTPUT);
     pinMode(led2, OUTPUT); 
     Particle.function("led",ledToggle);
     digitalWrite(led1, LOW); 
     digitalWrite(led2, LOW);
 }

最特殊應該是Particle.function()函式,這函式主要的功能是用來橋接HTML程式和Arduino的函式,在這個函式中有兩個參數,其一是 "led"使用在網頁程式中,另一個是ledToggle是函式名稱,其程式如下:



int ledToggle(String command) { if (command=="on") { digitalWrite(led1,HIGH); digitalWrite(led2,HIGH); return 1; } else if (command=="off") { digitalWrite(led1,LOW); digitalWrite(led2,LOW); return 0; } else { return -1; } }

從上面程式中,ledToggle()函式,有使用到一個參數command,這個參數的內容會來自網頁表單傳送,其內容有"on"和"off"兩個。注意arduino程式和下面程式中的"on"和"off",您就可以他們間的關係。另外也要注意下面程式led部份,此部份就是Particle.function()函式第一個參數"led"。

HTML程式:




Tell your device what to do!

"on">Turn the LED on.
"off">Turn the LED off.



在上面程式中your-device-ID-goes-here這部份要替換成您使用到的晶片ID,your-access-token-goes-here這部份也要替換成存取碼。








2017年11月28日 星期二

AR meets IoTs: 當擴增實境遇到物聯網-初接觸

軟硬體整合可參考用Unity工具來整合Arduino和Vuforia設計可以用光亮度來控制火焰大小文章。
擴增實境技術可以應用在虛實整合行銷服務應用上,而物聯網則可以用來收集資料,讓物品對物品能相互彼此交換資料,促使感知器和致動器經由物聯網的通訊進行自動控制或收集大量資料儲存在雲端。若能把兩項技術整合在一起,對於數據分析以及應用數據來進行虛實整合應用有很大的幫助。

有心想學習可以參閱:

Internet of Things (IoT) Cloud Based Photon Particle WiFi Microcontroller. Augmented Reality for Internet of Things.






Arduino的範例程式:
Photon Particle Wi-fi microcontroller code (based on Arduino) (*.ino file)

Unity端的範例應用程式:
Download Whole Augmented Reality IoT Tutorial Project Files (the result to test it) (*.rar file)

Arduino程式需要一塊硬體來執行,此範例用的是特定的晶片,在這個晶片上已經內嵌物聯網協定的軟體,可以減輕開發者的負擔,其晶片的資訊可參考下列網站:

2017年11月27日 星期一

多媒體動畫應用系陳百薰主任跨系指導

今天很難得邀請到本校擴增實境專家多媒體動畫應用系陳百薰主任前來指導,陳主任說明這些年來和學生打拼過程,以及介紹擴增實境的應用,收獲良多。


 
















擴增實境的虛擬按鈕(Augmented Reality Virtual Buttons)

什麼也可以用軟體來虛構出按鈕,真是超強的,超省的作法連按鈕的費用都可省掉。仔細看下面的影片,虛構出兩個按鈕,用手指輕按虛擬按鈕,就可以切換3D的角色。



下載原始程式: Download Whole Project files of VirtualButtons (the result to test it) (*.rar file)

打開VirtualButtons專案,在Project視窗下,選擇Assets目錄下,選擇VirtualNuttonResult,如下圖右下角的紅色方塊,在左上角的方塊上有btnLeft和btnRight兩個按鈕物件。在兩個按鈕上方,可以看到model1和model2兩個角色。


在點選btnLeft物件後,在下圖右方可以看到這個物件內嵌一個Virtual Button Behaiour.cs程式,並且在右邊可以看到有Name和Sensitivity Setting兩個屬性,請特別留意Name。


接下來,請點選ImageTarget物件,在右下方您可以看到VirtualButtonEventHandler.cs腳本程式,這是用來處理按鈕事件的程式。


VirtualButtonEventHandler.cs程式列表如下:


using UnityEngine;
using System.Collections.Generic;
using Vuforia;

public class VirtualButtonEventHandler : MonoBehaviour, IVirtualButtonEventHandler {

    // Private fields to store the models
    private GameObject model_1;
    private GameObject model_2;
private GameObject btn_1;
private GameObject btn_2;
    /// Called when the scene is loaded
    void Start() {

        // Search for all Children from this ImageTarget with type VirtualButtonBehaviour
        VirtualButtonBehaviour[] vbs = GetComponentsInChildren(); //取得所有虛擬按鈕的物件
        for (int i = 0; i < vbs.Length; ++i) {
            // Register with the virtual buttons TrackableBehaviour
            vbs[i].RegisterEventHandler(this);//註冊事件處理程序
        }

        // Find the models based on the names in the Hierarchy
model_1 = transform.Find("model1").gameObject;//取得3D模型物件
model_2 = transform.Find("model2").gameObject;

btn_1 = transform.Find("hs1").gameObject; //取得按鈕上的特效物件,用特效物件來表示按鈕可以被按下
btn_2 = transform.Find("hs2").gameObject;
        // We don't want to show Jin during the startup
model_1.SetActive(false);
model_2.SetActive(false);
btn_1.SetActive(true);
btn_2.SetActive(true);
    }

    ///



    /// Called when the virtual button has just been pressed:
    ///
    public void OnButtonPressed(VirtualButtonAbstractBehaviour vb) {
//Debug.Log(vb.VirtualButtonName);
Debug.Log("Button pressed!");
     
switch(vb.VirtualButtonName) { //判斷按下那一個按鈕
case "btnLeft":
btn_1.SetActive(false);
btn_2.SetActive(true);
model_1.SetActive(false);
model_2.SetActive(true);
                    break;
case "btnRight":
btn_1.SetActive(true);
btn_2.SetActive(false);
model_1.SetActive(true);
model_2.SetActive(false);
           break;
         //   default:
         //       throw new UnityException("Button not supported: " + vb.VirtualButtonName);
         //           break;
        }
     
    }

    /// Called when the virtual button has just been released:
    public void OnButtonReleased(VirtualButtonAbstractBehaviour vb) {
Debug.Log("Button released!");
}
}



2017年11月26日 星期日

擴增實境名片(Augmented Reality Business Card)程式解析


擴增實境技術是很棒的智慧行銷工具,一個業務出門,往往需要帶一大堆型錄和自己的名片,假如可以用自己的名片來代替型錄,而這個型錄又是3D而且有動畫功能,這應讓是很棒的工具,今天要跟大介紹就是擴增實境名片(Augmented Reality Business Card)。

教學部落格:Augmented Reality Business Card

教學影片:


下載原始程式:Download AR Business Card Tutorial Project Files (the result to test it) (*.rar file)

解開壓縮檔後,在Unity打開,在Project/AppContent/Script目錄下,可以找兩個程式為ModelRotation.cs和SwipeImage.cs。

SwipeImage.cs的原始程式列表:
using UnityEngine;
using System.Collections;

[RequireComponent (typeof (BoxCollider))] //or other collider
public class ModelRotation : MonoBehaviour {

public float rotationSpeed;
public bool rightSide = false;
private bool onOff = false;

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
if(onOff && !rightSide)
transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime, Space.World);
else if(onOff && rightSide)
transform.Rotate(Vector3.up, -rotationSpeed * Time.deltaTime, Space.World);
}

void OnMouseDown() {
if(onOff)
onOff = false;
else
onOff = true;
}
}

SwipeImage.cs是內嵌在動畫角色上,因此可以點選HatsuneRumba角色就可以查看程式內全域變數,可以看下圖右下角看到rotationSpeed和rightSide,就能改變其速度和旋轉方向。


ModelRotation.cs的全數變數在下圖右下方,有Page、Image、Sliding Speed、Model分別表示型錄頁數和型錄平面圖、滑動速度、以及3D模型。

詳細程式如下:
// based on: http://forum.unity3d.com/threads/swipe-in-all-directions-touch-and-mouse.165416/
// add video: https://developer.vuforia.com/forum/faq/unity-how-do-i-create-simple-videoplayback-app
// and: https://developer.vuforia.com/forum/faq/unity-how-do-i-play-video-url
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class SwipeImage : MonoBehaviour
{
public GameObject[] page;

Vector2 firstPressPos;
Vector2 secondPressPos;
Vector2 currentSwipe;

Vector2 deltaPosition;
Vector2 currentPosition;

int amount = 0;
int i = 0;
float accumulatePosition = 0.0f;
public Image[] image;
public float SlidingSpeed = 2.0f;

public GameObject[] model;

//Vector3 originalPosition = new Vector3 (-200,0,-6);


// Use this for initialization
void Start ()
{
amount = GameObject.FindGameObjectsWithTag("page").Length; // amount of models
page = new GameObject[amount];
foreach(GameObject gameObj in GameObject.FindGameObjectsWithTag("page"))  // iterate through model names
{
Debug.Log(gameObj);
page[i] = gameObj;
// page[i].GetComponent().localPosition = new Vector3 (originalPosition.x,originalPosition.y,originalPosition.z); // set to original position
page[i].SetActive(false);
model[i].SetActive (false);
i++;
}
i = 0;
page [0].SetActive (true);
model[0].SetActive (true);
Debug.Log(amount);
for(int j = 0; j < amount; j++ ) {
Debug.Log (j + ": " + page[j]);
}
}

// Update is called once per frame
void Update ()
{
Swipe ();
}

//inside class


public void Swipe ()
{
if (Input.GetMouseButtonDown (0)) {
//save began touch 2d point
firstPressPos = new Vector2 (Input.mousePosition.x, Input.mousePosition.y);
}
if (Input.GetMouseButton(0)) {
//Vector2 touchDeltaPosition = Input.mousePosition;
//lastMousePosition +=touchDeltaPosition.x;
currentPosition = new Vector2 (Input.mousePosition.x, Input.mousePosition.y);
//create vector from the two points
//deltaPosition = new Vector2 (currentPosition.x - lastPosition.x, currentPosition.y - lastPosition.y);
deltaPosition = new Vector2 (currentPosition.x - firstPressPos.x, currentPosition.y - firstPressPos.y);
//if (deltaPosition.x<0 nbsp="" p=""> accumulatePosition += deltaPosition.x;

//if (deltaPosition.x>0)
// accumulatePosition -= deltaPosition.x;
//Debug.Log ("accumulateDelta: " + accumulatePosition + " deltaPosition: " + deltaPosition.x);
float val = System.Math.Abs(deltaPosition.x);
float remap = val.Remap(0, 200, 1, 0);
Debug.Log ("ABS" + val + " REMAP: " + remap);
image[i].color =  new Color(1.0f,1.0f,1.0f,remap);

if(deltaPosition.x < 0.0f){
page[i].GetComponent().localPosition = new Vector3(deltaPosition.x * SlidingSpeed, 0, -6); // page[i].GetComponent().localPosition.x + 
//page[i].transform.Translate(Vector3.left  * 500 * Time.deltaTime);
} else if (deltaPosition.x > 0.0f) {
page[i].GetComponent().localPosition = new Vector3(deltaPosition.x * SlidingSpeed, 0, -6); // page[i].GetComponent().localPosition.x +
//page[i].transform.Translate(Vector3.right * 500 * Time.deltaTime);
}
}

if (Input.GetMouseButtonUp (0)) {
accumulatePosition = 0;
//save ended touch 2d point
secondPressPos = new Vector2 (Input.mousePosition.x, Input.mousePosition.y);

//create vector from the two points
currentSwipe = new Vector2 (secondPressPos.x - firstPressPos.x, secondPressPos.y - firstPressPos.y);
//Debug.Log ("delta" + (secondPressPos.x - firstPressPos.x));
//normalize the 2d vector
currentSwipe.Normalize ();

//swipe upwards
if (currentSwipe.y > 0 && currentSwipe.x >-0.5f && currentSwipe.x < 0.5f) {
Debug.Log ("up swipe");
}
//swipe down
if (currentSwipe.y < 0 && currentSwipe.x > -0.5f && currentSwipe.x < 0.5f) {
Debug.Log ("down swipe");
}
//swipe left
if (currentSwipe.x > 0 && currentSwipe.y > -0.5f && currentSwipe.y < 0.5f) {
Debug.Log ("left swipe");

page[i].GetComponent().localPosition = new Vector3 (0,0,-6); // set to original position
page[i].SetActive (false);
model[i].SetActive (false);
image[i].color =  new Color(1.0f,1.0f,1.0f,1.0f);
i--;

if (i < 0)
i = amount-1;

model[i].SetActive (true);
page[i].SetActive (true);
}
//swipe right
if (currentSwipe.x > 0 && currentSwipe.y > -0.5f && currentSwipe.y < 0.5f) {
Debug.Log ("right swipe");
page[i].GetComponent().localPosition = new Vector3 (0,0,-6); // set to original position
page[i].SetActive (false);
model[i].SetActive (false);
image[i].color =  new Color(1.0f,1.0f,1.0f,1.0f);
i++;

if (i > (amount-1))
i=0;

page[i].SetActive (true);
model[i].SetActive (true);
}
if ( (currentSwipe.y > 0 && currentSwipe.x >-0.5f && currentSwipe.x < 0.5f) == false && (currentSwipe.y < 0 && currentSwipe.x >-0.5f && currentSwipe.x <0 -0.5f="" .5f="" 0.5f="" 0="" amp="" currentswipe.x="" currentswipe.y="" false="" gt="" lt="" nbsp="" p=""> Debug.Log("Click");
//if (i==0)
// Application.OpenURL("https://www.youtube.com/EdgarasArt");
//if (i==1)
// Application.OpenURL("https://www.ourtechart.com");
//if(i==2)
// Application.OpenURL("https://www.youtube.com/EdgarasArt");
}
}
}



}

public static class ExtensionMethods {

public static float Remap (this float value, float from1, float to1, float from2, float to2) {
return (value - from1) / (to1 - from1) * (to2 - from2) + from2;
}

}

2017年11月25日 星期六

用Unity工具來整合Arduino和Vuforia設計可以用光亮度來控制火焰大小



 擴增實境是很容易讓人用來開發虛實整合的工作之一,Ariduino又是當今小型微控器的主流微控器,今天我們要介紹如何把兩者合一,用Unity工具來整合Arduino和Vuforia設計可以用光亮度來控制火焰大小。

大家可以參考這篇文章:Augmented Reality Tutorial No. 15: Augmented Reality using Unity3D, Vuforia and Arduino (part 2)




解開後打開,在Unity工具上打開範例程式,在Assets目錄中點選Edgaras物件,畫面如下:



在Hierarchy目錄下,在上圖左方點選Particle System物件,在上圖右方可看到fire.cs Script。

開啟fire.cs原如檔。程式列表如下:
// Unity code is available to download - link below the video!

using UnityEngine;
using System.Collections;
using System.IO.Ports;

public class fire : MonoBehaviour {
string value;
Vector3 rot;
SerialPort stream = new SerialPort("COM9", 9600); // for Arduino connection
// Use this for initialization
void Start () {
stream.Open();
gameObject.GetComponent().enableEmission = true;
gameObject.GetComponent().emit = true;
//gameObject.GetComponent().duration = 0.1;
gameObject.GetComponent().startDelay = 0.5f;
gameObject.GetComponent().startLifetime = 0.65f;
gameObject.GetComponent().startSpeed = 200;
gameObject.GetComponent().startSize = 10;
gameObject.GetComponent().startRotation = 1;
gameObject.GetComponent().maxParticles = 1000;
gameObject.GetComponent().emissionRate = 100;
}
// Update is called once per frame
void Update () {
value = stream.ReadLine(); // value from Arduino
float val = float.Parse(value);
float v = val / 1023;
gameObject.GetComponent().startSpeed = v*200;
gameObject.GetComponent().startSize = v*50;
Debug.Log(v);
}
}

這個範例是利用RS232讓電腦和Arduino可以進行資料的交換,利用SerialPort物件來進行,通訊速率選擇在9600 bps,對於通訊速率的說明,可以參考維基百科位元速率的說明。在Start()函式內呼叫Open()函式來打開通訊埠,接下來在Update()函式內,呼叫ReadLine()函式來讀取Arduino傳送過來的數值,經過計算後,設定ParticleSystem物件的startSpeed和startSize兩個屬性。

2017年11月24日 星期五

使用Unity和Vuforia工具來設計AR APP

設計AR APP並不難,只能善用網路資源,今天要跟大家分享擴增實境教學網站: Augmented Reality Technology,這個網站主要的目的是促進增強現實技術領域的開發人員,強調結果導向的學習,提供一個快速的“如何(how-to)”,而不是“它是如何工作(how it works)”的理論,最難得是這個網站會提供教學影片,大家只要按著影片的步驟就可以完成。

教學部落格
1. Augmented Reality Tutorial No. 14: Augmented Reality using Unity3D and Vuforia (part 1)



(1) 下載專案程式: Whole Project EdgarasArt files (the result) (*.rar file)

(2) 下載程式後,解開壓縮檔。





(3) 執行Unity,然後開啟專案,按下EdgarasArt,在下圖中間下方處,即可以看到。


























(4) 然後按下執行鍵






2. Augmented Reality Tutorial No. 15: Augmented Reality using Unity3D, Vuforia and Arduino (part 2)

本篇文章除了AR外還有應用到Arduino,是介紹有關軟硬體整合的文章。





2017年11月23日 星期四

智慧聯盟擴增實境暨相關APP開發

一、著色AR系列
1.好客在一起AR明信片

透過繪本明信片所建立的QR code及AR互動系統,透過科技加值的互動遊戲化(gamification)概念設計,讓在地旅行過程更為有趣,也可以作為在地導覽人員的輔助方式推廣,創造山城與客庄文化的旅圖故事,加值山城美學創造客庄文化慢活的故事。



2.ARCol幸福與關懷科技體驗館

釋放心底的洋溢熱情。 舒壓與療癒插畫合而為一,
一筆一畫的著色過程中,彷彿感受旅行的雀躍!
親自為幸福與關懷科技體驗館的公仔、以及風景著色!


3.草蜢鹽彩繪






二、花語母親
1.花語母親1



母親節即將到來,
送一張以康乃馨為主要花材的花語母親卡片給自己親愛的母親,
當你使用智慧型手機或平板,照著卡片會呈現3D的紅色康乃馨,而紅色康乃馨正代表著祝福母親健康長壽。

2.花語母親2

3.花語母親3



4.愛媽咪


三、時空旅人2



時空旅人是一款新型態的旅遊導覽虛實混合遊戲,目前服務範圍為南投縣鹿谷鄉。
將故事與旅遊結合,並透過虛實混和的方式,讓玩家身歷其境地跟著遊戲一起旅行。
在旅行的過程中,藉由劇情的步步推演,帶領旅行者一起重現鹿谷的歷史、人文、風情。
此外,時空旅人還結合了店家導覽功能,讓旅行者在走訪該處的時候,可以第一時間得知好趣、好玩、好吃的商家資訊。主打景點以引入凍頂烏龍茶苗的林鳳池舉人故宅,以及南投八大勝景之一的麒麟潭為主。
時空旅人不只是一款遊戲,更是你旅遊的行動智慧小幫手!
開發團隊:國立臺中教育大學 數位內容科技學系 黃律澄/劉美求/李芝瑾/孫瑞均
時空旅人為中台灣在地文化服務設計與研究計畫成果,由資策會補助與技術支援,由南開科技大學/國立臺中教育大學共同執行。
       (摘自https://play.google.com/store/apps/details?id=com.NTCU.Loogoo&hl=zh-TW)




四、龍目場域的APP
1.龍目槌染擴增實境AR導覽




2.夜探龍目:生態互動導覽


3.龍目活動整合APP




4.龍目好好玩




5.龍目社區-眼球動一動


6.龍目個性化明信片



五、魚鹽之道AR菜單




六、草屯場域
1.草屯觀光導覽






2.南開科技大學




七、鹿谷場域
1.鹿谷押花


八、NOVA