目前現代科技聲光影像技術非常成熟,人們在感受上也達到前所未有的突破,VR、AR等技術的崛起開創一個新的視界,不過這次不是講這個,這次來探討全息投影在現今技術上的應用,那何謂全息投影呢?
下面的影片是2017年在日本千葉幕張展覽館中心舉辦的初音未來演唱會,在當中我們可以看到舞台上出現不同次元的人物在上面表演,我們知道相比影片和動畫撥放時我們很清楚地感覺到畫面是呈現在一個平面,但全息投影也是一樣將畫面投射在載體上但是這個載體不同的話它是可透視的平面,並將4個方位同時呈現出來的顯示技術,這種技術叫做 佩珀爾幻象(Pepper’s ghost)。
佩珀爾幻象(Pepper’s ghost):
然而佩珀爾幻象並不是正式的全息投影,因為它必須在固定的舞台上,且要在黑暗當中才能實現,而且觀眾必須要從特定的角度進行觀看。如果角度有偏差畫面就會產生變形。

大致上都瞭解到運作模式的話,接著來構思屬於自己的全息投影,網路上有在賣一種簡單又容易入手的套件,當然自己製作也行,下面影片就用4片透明塑膠片組成顯像面板,我是直接買現成的拉!省時間~
那播放的動畫要怎樣處理呢?,其實YOUTUBE搜尋關鍵字:Hologram就能找到許多現成的影片做使用,但是我這次要讓MIKU醬做我想要的動作跳我想看的舞蹈那麼辦? 看上面的影片知道為了配合全息投影需要4個方位的影像同時撥放才能達到理想的效果,也就是要構思能同時顯示4個方位的顯示架構,那就得非Unity這套軟體了,以前有稍微自學這套軟體並寫了一個專案:ZengIOT虛擬管家,藉由腦袋還有一些經驗在所以就選這套開發。
準備東西:
Windows 平台桌上型電腦
Android 手機 OS 7.0 UP
Unity 2022
MMD素材動作
3D模型檔MIKU
Unity 開發完成後可以佈署不同平台上,這點真的很方便。
場景的部分首先當然是我們的主角MIKU,要在場景中顯示必需要有一個Model檔這個檔案我是去https://piapro.jp 上獲得 注意:使用別人的素材必須要遵守規範,接著動作骨架的設定我是採用MMD的框架外掛(可以將MMD的動作和模型檔轉換成UNITY FBX格式)。
使用外掛將剛剛抓下來的模型檔轉換成UNITY的FBX,如果有動作VMD檔也可以在這時候一起匯入。

在rig 的動畫設定要改成舊版(方便Android 物理動作執行)

在MMD屬性面板>morph 中可以試著控制各部分能不能正常執行
接著建立1個組為CameraManager 在建立4個方位的Camera 元件當中。

名稱和參數如下圖

寫一個腳本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class CameraSetting : MonoBehaviour
{
public Camera _topCamera;
public Camera _bottomCamera;
public Camera _leftCamera;
public Camera _rightCamera;
public int _width; //屏幕宽度
public int _high; //屏幕高度
public delegate void CameraSetDelegate(Camera TargetCamera);
public event CameraSetDelegate _cameraSetTopCamera;
public event CameraSetDelegate _cameraSetBottomCamera;
public event CameraSetDelegate _cameraSetLeftCamera;
public event CameraSetDelegate _cameraSetRightCamera;
Rect _cameraRect = new Rect();
private void Awake()
{
_cameraSetBottomCamera += SettingCameraBottom;
_cameraSetLeftCamera += SettingCameraLeft;
_cameraSetRightCamera += SettingCameraRight;
_cameraSetTopCamera += SettingCameraTop;
}
Rect OutRect(float width, float high, string cameraName)
{
_cameraRect.width = (float)Math.Round(((float)1 / 3 * high / width), 2);
_cameraRect.height = (float)Math.Round((float)1 / 3, 2);
switch (cameraName)
{
case "TopCamera":
_cameraRect.x = (float)Math.Round(0.5 - _cameraRect.width / 2, 2);
_cameraRect.y = (float)Math.Round((float)2 / (float)3, 2);
Debug.Log("Top" + _cameraRect);
break;
case "BottomCamera":
_cameraRect.x = (float)Math.Round(0.5 - _cameraRect.width / 2, 2);
_cameraRect.y = 0;
Debug.Log("Bottom" + _cameraRect);
break;
case "LeftCamera":
_cameraRect.x = (float)Math.Round(0.5 + _cameraRect.width / 2, 2);
_cameraRect.y = (float)Math.Round((float)1 / 3, 2);
Debug.Log("Left" + _cameraRect);
break;
case "RightCamera":
_cameraRect.x = (float)Math.Round(0.5 - 3 * _cameraRect.width / 2, 2);
_cameraRect.y = (float)Math.Round((float)1 / 3, 2);
Debug.Log("Right" + _cameraRect);
break;
}
return _cameraRect;
}
private void SettingCameraBottom(Camera TargetCamera)
{
TargetCamera.rect = OutRect(_width, _high, "BottomCamera");
}
private void SettingCameraTop(Camera TargetCamera)
{
TargetCamera.rect = OutRect(_width, _high, "TopCamera");
}
private void SettingCameraLeft(Camera TargetCamera)
{
TargetCamera.rect = OutRect(_width, _high, "LeftCamera");
}
private void SettingCameraRight(Camera TargetCamera)
{
TargetCamera.rect = OutRect(_width, _high, "RightCamera");
}
private void Start()
{
Screen.sleepTimeout = SleepTimeout.NeverSleep;
try
{
_cameraSetBottomCamera(_bottomCamera);
_cameraSetLeftCamera(_leftCamera);
_cameraSetRightCamera(_rightCamera);
_cameraSetTopCamera(_topCamera);
}
catch (Exception e)
{
Debug.Log(e.Message);
}
}
}
在CameraManager 裡新增元件 將剛剛寫的Script 給加入進來,並把4個相機對應好,寬高依照手機平台解析度調整

使用模擬器進行預覽,看一下自己的方位有沒有弄好

接著放在佈署在裝置上,(手機要開ADB並安裝驅動後這邊才會看到你的裝置),設定完成後要案建置執行

接著看成果囉!~
老實說這個專案想弄很久了,只是平常太忙一直沒空弄,終於生出來了 我是阿俊謝謝大家觀看。