Unity'de Platform Modunu Taşıma
Hareketli Platform Modu, HoloLens, petrol platformları ve diğer araçlar gibi taşıma platformlarında 2. platformun düzgün çalışmasına olanak sağlar.
Platform Modunu Taşıma hakkında daha fazla bilgi
Kavramsal Genel Bakış
Karma gerçeklik sistemlerinin doğru çalışması için, başlığın ortamla ilgili olarak izne sahip olması gerekir. Bu göreli izleme, grafiklerin, başlığın kullanıcıya ortamda sağlam bir şekilde kilitlenmiş gibi görünmesine olanak sağlar. İzleme genellikle dışa dönük kameralar ve VerimSel Ölçüm Birimi'nin (IMU) ölçümleri kullanılarak hesaplanan pozlar birleştirerek elde edilir. Ortam, başvuru verimsel çerçevede olduğunda bu yöntem iyi çalışır. Gezegensel hareket gibi küçük etkiler genellikle ihmal edilen etkilerdir.
Ortam, başvuru verimsel çerçevesinde değilse, normal baş izleme sistemi başarısız olur. Platform Modu'na Taşıma özelliği, ortamın, atıcı çerçeveye göre hareketini hesaparak bu sorunu çözer. Bu nedenle, Platform Modunu Taşıma HoloLens 2, ortam bir gemi olsa bile ortama sabitlenmiş görünen hologramları işleyebilirsiniz!
Hareketli Platform Modunu nasıl etkinleştirmem gerekir?
Çeşitli kullanım durumlarını etkinleştirmek için, Taşıma Platformu Modunu etkinleştirmek için çeşitli yöntemler sağlanmıştır. Hangi yöntemi seçeceklerini dikkatle göz önünde bulundurmalısınız. Sormamız gereken önemli bir soru şudur: Who 2 HoloLens nin şu anda hareketli bir platformda olup olmadığını biliyor musunuz? Örnek için aşağıdaki tabloya bakın:
| Who HL2'nin hareketli bir platformda olup ola | Platform Modunu Taşımayı ayarlamanın en iyi yöntemi | Avantajlar | Maliyetler |
|---|---|---|---|
| Sistem Yöneticisi | Mobil Cihaz Yönetimi | Kullanıcının dahil olması gerek yok. Herhangi bir uygulama değişiklik yapmadan çalışır. Cihaz yanlış moda girme korumasına sahip olabilir. | Kullanıcı ve Uygulamalar modu değiştiremez. |
| Son Kullanıcı | Ayarlar Uygulaması | Kullanıcı genellikle cihazı ne zaman ve nerede kullanmakta olduğu konusunda en bilgi sahibidir. Herhangi bir uygulama değişiklik yapmadan çalışır. | Kullanıcı modun mevcut olduğunu bilmiyor olabilir. |
| Uygulama | Bu makalede açıklanan SDK'yı kullanın. | Kullanım durumuna özgü ipuçları, ortam önceden bilinemediği zaman modu değiştirmek için kullanılabilir. Kullanıcının bu kararı verme ve ayarlardaki modu değiştirme gereksinimini ortadan kaldırır. | Kötü tasarlanmış bir uygulama çok kötü bir deneyim sunar ve cihazı beklenmedik bir modda bırakır. |
Platform Modunu Taşıma için en iyi yöntemler
| Asıl | Description |
|---|---|
| Kullanıcı seçimine saygı göster | Modu değiştirmeden önce kullanıcıya seçeneği sunabilirsiniz ve uygulamanın çalışma zamanı için bu seçimi kabul edebilirsiniz |
| Kullanıcıya uyarı sağlama | Uygulamanın başlaması/sürdürülması üzerine modu hemen değiştirmekten kaçının. Bu kötü bir kullanıcı deneyimi sunar çünkü kullanıcı cihazın neden izleme kaybı olduğunu bilmiyor olabilir. |
| Modu en aza indirme | Platform Modu ayarlarını değiştirirken cihaz izlemeyi kaybeder ve bu da olumsuz bir kullanıcı deneyimine neden olur. Bu nedenle modu değiştirme sıklığını en aza indirmenizi öneririz. İdeal olarak, modun yalnızca cihazın sabit bir ortamdan hareketli bir ortama (veya tam tersi) geçişi olması halinde değiştirilebilir. |
| Ortam hakkında belirsizse Taşıma Platformu Modunu kullanın | Platform Modu'na taşıma hem sabit ortamlarda hem de hareket eden ortamlarda kullanılabilir. Düzenli izleme algoritmaları yalnızca sabit ortamlarda çalışır, bu nedenle ortamın hareket edip etm hakkında emin değilken Platform Modunu Taşıma daha güvenli bir seçenek olabilir. |
| Bilinen sabit ortamlarda Platform Modunu Taşımayı kullanma | Hareketli Platform Modu, sabit ortamlarda standart moddan daha az iyi performans gösterir. Bu küçük bir performans düşüşü olsa da kullanıcıların çoğu tarafından fark edilebilir. |
| Cihazı hangi modda bırakılacağına dikkat edin | Bu SDK, geliştiricilerin cihazın önyüklemesinde sağlam deneyimler tasarlamalarını sağlar. Cihazın bir sonraki sefer bota bindirip hareket eden bir platformda olacağını göz önünde bulundurarak cihazı uygun modda bırakın. |
SDK'yı nereden edinebilirsiniz?
Hareketli Platform SDK'sı, geliştiricilerin Win32 veya UWP platformları için uygulama geliştirmelerine olanak sağlayan C# ve C++ dil projeksiyonlarını destekler. Karma Gerçeklik Özellik Aracı ile SDK'yı indirin ve yükleyin.
Nasıl yaparım? SDK'yı kullanma
SDK'yı yükledikten sonra betiğinizi MovingPlatformManger'ı kullanmak üzere aşağıdaki gibi kurabilirsiniz:
// Top of file
using Microsoft.MixedReality.MovingPlatform;
// Code body
m_movingPlatformManager = new MovingPlatformManager();
Geçerli modu okuma
Modun geçerli değeri aşağıdaki gibi okunabilir:
MovingPlatformMode currentMode = m_movingPlatformManager.Mode;
MovingPlatformMode, aşağıdaki gibi tanımlanmış bir numaradır:
public enum MovingPlatformMode
{
Standard, // The legacy mode that devices use out-of-the-box.
MovingPlatformOptimized // Allows tracking on moving platforms.
}
VR cihazları ve HoloLens 1 gibi Taşıma Platformu Modu'na sahip olmayan cihazlar her zaman 'Standart' olarak döner.
Modu ayarlama
Platform Modu'na Taşıma değerini aşağıdaki gibi ayarlayın:
bool success = m_movingPlatformManager.TrySetMode(MovingPlatformMode.MovingPlatformOptimized);
Cihaz modu artık istenen modla eş olursa TrySetMode true olarak döner. Mod zaten istenen durumda ise hiçbir şey yapılmaz ve cihaz izlemeyi kaybetmez.
Mod değişikliği üzerinde geri çağırma
Bazen başka bir uygulamanın veya kullanıcının Taşıma Platformu Modu değerini değiştirdiğini bilmek yararlı olabilir. Bunu aşağıdaki gibi yapabilirsiniz.
// Code Body
m_movingPlatformManager.ModeChanged += CallbackOnMPMChanged;
...
void CallbackOnMPMChanged(object sender, MovingPlatformEventArgs args)
{
movingPlatformModeChanged = true;
movingPlatformModeValue = args.ModeEntered;
}
...
void Update()
{
// It's not reccomended to do work in the callback.
if (movingPlatformModeChanged)
{
movingPlatformModeChanged = false;
// Do some work
}
}
Modun ayarlanamayan bir mod olup olduğunu denetleme
Bazen modu değiştirmeye çalışmadan önce modun ayarlanabiliyor olup olmadığını bilmek yararlı olabilir. Örneğin, kullanıcıya tercihini sormanın herhangi bir değeri olup ola bir şey olduğunu bilmek istiyorsanız. Platform modunu taşımanın IsSetModeSupported işleviyle ayarlanamayan bir işlev olup olduğunu bulabilirsiniz:
bool supported = m_movingPlatformManager.IsSetModeSupported();
Bu işlev, cihaz modları değiştirenin true, mümkün yoksa false döndürür. Bu işlev, Mobile Cihaz Yönetimi (MDM) ilkelerini hesaba verir. Örneğin, MDM MovingPlatformMode'ı "On" olarak güçletirse bu işlev false döndürür.
Tanıtım betiği
Bu betik, SDK'nın tüm önemli öğelerini tek bir yerde gösterir. Örnek, yukarıda gösterilen en iyi yöntemleri izlemez.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.MovingPlatform;
using System;
public class MovingPlatformDemo : MonoBehaviour
{
public GameObject cube; // A simple cube to display colors.
private MovingPlatformManager m_movingPlatformManager;
private Renderer cubeRenderer;
private bool movingPlatformModeChanged;
private MovingPlatformMode movingPlatformModeValue;
// Start is called before the first frame update
void Start()
{
m_movingPlatformManager = new MovingPlatformManager();
cubeRenderer = cube.GetComponent<Renderer>();
// Get initial value of mode,
// Just this mechanism would be adequate if a one time check is acceptable.
MovingPlatformMode initialMovingPlatformMode = m_movingPlatformManager.Mode;
// Find if It's possible to change the mode.
bool isSettable = m_movingPlatformManager.IsSetModeSupported();
// Here you would add some use case specific logic using initialMovingPlatformMode and isSettable
// to decide if you should ask the user if they want to change the mode.
// To set the mode.
bool success = m_movingPlatformManager.TrySetMode(MovingPlatformMode.MovingPlatformOptimized);
// Visual indicator of current state: Green = Moving Platform Optimized, Red = Regular.
SetColourFromState(m_movingPlatformManager.Mode, cubeRenderer);
// We set a callback to be notified if there's a change in mode. This is typically optional.
m_movingPlatformManager.ModeChanged += CallbackOnMPMChanged;
movingPlatformModeChanged = false;
}
// Update is called once per frame
void Update()
{
// This must be done in the UI thread.
if (movingPlatformModeChanged)
{
movingPlatformModeChanged = false;
SetColourFromState(movingPlatformModeValue, cubeRenderer);
}
}
// Sets renderer to:
// Green = Moving Platform Mode Enabled
// Red = Moving Platform Mode Disabled
void SetColourFromState(MovingPlatformMode mode, Renderer thisRend)
{
if (mode == MovingPlatformMode.MovingPlatformOptimized)
{
thisRend.material.color = new Color(0f, 1f, 0f, 1f);
}
else
{
thisRend.material.color = new Color(1f, 0f, 0f, 1f);
}
}
void CallbackOnMPMChanged(object sender, MovingPlatformEventArgs args)
{
movingPlatformModeChanged = true;
movingPlatformModeValue = args.ModeEntered;
}
}