Unity'de Platform Modunu Taşıma
Hareketli Platform Modu, HoloLens 2 gemiler, petrol platformları ve diğer araçlar gibi hareketli platformlarda düzgün çalışmasını sağlar.
Platform Modunu Taşıma hakkında daha fazla bilgi edinin
Kavramsal Genel Bakış
Karma gerçeklik sistemlerinin doğru çalışması için mikrofonlu kulaklığın ortama göre izlenmesi gerekir. Bu göreli izleme, grafiklerin mikrofonlu kulaklığın kullanıcısına ortamda katı bir şekilde kilitlenmesi için işlenmelerini sağlar. İzleme genellikle, Atayılan Ölçüm Birimi'nden (IMU) dışa dönük kameralar ve ölçümler kullanılarak hesaplanan pozlar birleştirilerek elde edilir. Ortam, ilk başvuru çerçevesinde olduğunda bu yöntem iyi çalışır. Gezegen hareketi gibi küçük etkiler genellikle ihmal edilir.
Ortam, ilk başvuru çerçevesinde olmadığında normal baş izleme sistemi başarısız olur. Hareketli Platform Modu özelliği, ortamın hareket durumunun atsız çerçeveye göre hesaplanarak bu sorunu çözer. Böylece, Hareketli Platform Modu'nda HoloLens 2 ortam gizlenmiş bir gemi olsa bile ortama sabit görünen hologramları işleyebilir!
Hareketli Platform Modu'nu nasıl etkinleştirmeliyim?
Bir dizi kullanım örneğini etkinleştirmek için, Hareketli Platform Modu'nu etkinleştirmek için çeşitli yöntemler sağlanmıştır. Hangi yöntemi seçeceğinizi dikkatle düşünmeniz önemlidir. Sormanız gereken önemli bir soru şudur: HoloLens 2 şu anda hareketli bir platform içinde olup olmadığını kim bilebilir? Örnek için aşağıdaki tabloya bakın:
HL2'nin hareketli bir platformda olup olmadığını kim bilir | Hareketli Platform Modu'nu ayarlamak için en iyi yöntem | Avantajlar | Maliyetler |
---|---|---|---|
Sistem Yöneticisi | Mobil Cihaz Yönetimi | Kullanıcının dahil edilmesi gerekmez. Herhangi bir uygulama değiştirilmeden çalışır. Cihaz yanlış moda girmeden korunabilir. | Kullanıcı ve Uygulamalar modu değiştiremez. |
Son Kullanıcı | Ayarlar Uygulaması | Kullanıcı genellikle cihazı ne zaman ve nerede kullandığı konusunda en bilgili kullanıcıdır. Herhangi bir uygulama değiştirilmeden çalışır. | Kullanıcı modun mevcut olduğunu bilmiyor olabilir. |
Uygulama | Bu makalede açıklanan SDK'yi kullanın. | Kullanım örneğine özgü ipuçları, ortam önceden bilinmediğinde modu değiştirmek için kullanılabilir. Kullanıcının bu kararı verme ve ayarları değiştirme gereksinimini kaldırır. | Kötü tasarlanmış bir uygulama çok kötü bir deneyim sağlayabilir ve cihazı beklenmedik bir modda bırakabilir. |
Platform Modunu Taşıma için en iyi yöntemler
Asıl | Description |
---|---|
Kullanıcı seçimine saygı | Modu değiştirmeden önce kullanıcıya seçim sunmalısınız ve uygulamanın çalışma zamanı için bu seçime saygı sunmaya devam etmelisiniz |
Kullanıcıya bir uyarı sağlayın | Uygulamanın başlatılması/sürdürülmesi için modu hemen değiştirmekten kaçının. Bu, kullanıcı cihazın izlemeyi neden kaybettiğini bilmediğinden kötü bir kullanıcı deneyimi sunar. |
Değiştirme modunu simge durumuna küçültme | Hareketli Platform Modu ayarlarını değiştirirken cihaz izlemeyi kaybeder ve olumsuz bir kullanıcı deneyimine neden olur. Bu nedenle modu değiştirdiğiniz sıklığı en aza indirmeniz önerilir. İdeal olarak modun değiştirilmesi için cihazın sabit bir ortamdan hareket eden bir ortama (veya tam tersi) geçmesi gerekir. |
Ortam hakkında emin değilseniz Platform Modunu Taşıma'yı kullanın | Platform Modu'nu taşımak hem sabit ortamlarda hem de hareketli ortamlarda çalışabilir. Normal izleme algoritmaları yalnızca sabit ortamlarda çalışır, bu nedenle ortamın hareket edip etmediği konusunda emin değilseniz Platform Modunu Taşıma seçeneği daha güvenli bir seçim olabilir. |
Platform Modunu Taşıma modunu bilinen sabit ortamlarda kullanmayın | Platform Modu'nu taşımak, sabit ortamlarda standart moddan daha az iyi performans gösterir. Bu küçük bir düşüş olsa da çoğu kullanıcı tarafından fark edilir. |
Cihazı hangi modda bırakabilirsiniz göz önünde bulundurun | Bu SDK, geliştiricilerin cihazın önyüklemesinde güçlü deneyimler tasarlamasına olanak tanır. Cihazın bir sonraki önyüklemesinde hareketli bir platformda olup olmadığını göz önünde bulundurun ve cihazı uygun modda bırakın. |
SDK'yi nereden edinebilirim?
Hareketli Platform SDK'sı, C# ve C++ için dil projeksiyonlarını destekleyerek geliştiricilerin Win32 veya UWP platformları için uygulama geliştirmesine olanak tanır. Karma Gerçeklik Özellik Aracı ile SDK'yi indirin ve yükleyin.
bu SDK'Nasıl yaparım? kullanın
SDK'yı yükledikten sonra, betiğinizi aşağıdaki gibi MovingPlatformManger kullanacak şekilde ayarlayabilirsiniz:
// Top of file
using Microsoft.MixedReality.MovingPlatform;
// Code body
m_movingPlatformManager = new MovingPlatformManager();
Geçerli modu okuma
Modun geçerli değeri şu şekilde okunabilir:
MovingPlatformMode currentMode = m_movingPlatformManager.Mode;
MovingPlatformMode aşağıdaki gibi tanımlanan bir sabit listesidir:
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 Hareketli Platform Modu bulunmayan cihazlar her zaman 'Standart' döndürür.
Modu ayarlama
Hareketli Platform Modu değerini aşağıdaki gibi ayarlayabilirsiniz:
bool success = m_movingPlatformManager.TrySetMode(MovingPlatformMode.MovingPlatformOptimized);
Cihaz modu artık istenen modla eşleşiyorsa TrySetMode true değerini döndürür. Mod zaten istenen durumdaysa hiçbir şey yapılmaz ve cihaz izlemeyi kaybetmez.
Mod değişikliğinde geri çağırma
Bazen başka bir uygulamanın veya kullanıcının Hareketli Platform Modu değerini değiştirip değiştirmediğ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 ayarlanabilir olup olmadığını denetleme
Bazen modu değiştirmeye çalışmadan önce modun ayarlanıp ayarlanmadığını bilmek yararlı olabilir. Örneğin, kullanıcıya tercihini sormanın bir değeri olup olmadığını bilmek istiyorsanız. Platform modunu taşımanın IsSetModeSupported işleviyle ayarlanabilir olup olmadığını bulabilirsiniz:
bool supported = m_movingPlatformManager.IsSetModeSupported();
Cihaz modları değiştirebiliyorsa bu işlev true, mümkün değilse false değerini döndürür. Bu işlev, Mobil Cihaz Yönetimi (MDM) ilkelerini hesaba ekler. Örneğin, MDM MovingPlatformMode'u "Açık" olarak zorlarsa, 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;
}
}