Как получить доступ к файлам в папке 3D-объектов Hololens и отправить их в приложение во время выполнения

0

Вопрос

Я искал SDK, который может получить доступ к внутренней папке (папке 3D-модели) HoloLens и загрузить ее в работающее приложение, и мы перепробовали множество ссылок, но безрезультатно. Может ли кто-нибудь помочь нам решить эту проблему?

3d-model c# hololens internals
2021-11-24 06:35:33
1

Лучший ответ

0

Ваш вопрос чрезвычайно широк, но, честно говоря, UWP-сложная тема. Я печатаю это на своем телефоне, но я надеюсь, что это поможет вам начать.


Прежде всего: Hololens использует UWP.

Для выполнения ввода-вывода файлов в UWP приложения вам нужно использовать специальный API c#, который работает только асинхронно! Поэтому ознакомьтесь с этой концепцией и ключевыми словамиasync, await иTask прежде чем ты начнешь!

Далее обратите внимание, что большая часть API Unity может использоваться только в главном потоке Unity! Поэтому вам понадобится выделенный класс, который позволяет получать асинхронные Actions и отправьте их в следующий основной поток Unity Update позвоните по телефону ConcurrentQueue как, например,

using System;
using System.Collections.Concurrent;
using UnityEngine;

public class MainThreadDispatcher : MonoBehaviour
{
    private static MainThreadDispatcher _instance;

    public static MainThreadDispatcher Instance
    {
        get
        {
            if (_instance) return _instance;

            _instance = FindObjectOfType<MainThreadDispatcher>();

            if (_instance) return _instance;

            _instance = new GameObject(nameof(MainThreadDispatcher)).AddComponent<MainThreadDispatcher>();

            return _instance;
        }
    }

    private readonly ConcurrentQueue<Action> _actions = new ConcurrentQueue<Action>();

    private void Awake()
    {
        if (_instance && _instance != this)
        {
            Destroy(gameObject);
            return;
        }

        _instance = this;
        DontDestroyOnLoad(gameObject);
    }

    public void DoInMainThread(Action action)
    {
        _actions.Enqueue(action);
    }

    private void Update()
    {
        while (_actions.TryDequeue(out var action))
        {
            action?.Invoke();
        }
    }
}

Теперь это говорит о том, что вы, скорее всего, ищетеWindows.Storage.KnownFolders.Objects3D что являетсяWindows.Storage.StorageFolder.

Здесь вы будете использоватьGetFileAsync для того, чтобы получитьWindows.Storage.StorageFile.

Затем вы используетеWindows.Storage.FileIO.ReadBufferAsync для того, чтобы прочитать содержимое этого файла вIBuffer.

И, наконец, вы можете использоватьToArray для того, чтобы получить сырье byte[] прочь из этого.

После всего этого вы должны отправить результат обратно в основной поток Unity, чтобы иметь возможность использовать его там (или продолжить процесс импорта другим асинхронным способом).

Вы можете попробовать использовать что-то вроде

using System;
using System.IO;
using System.Threading.Tasks;

#if WINDOWS_UWP // We only have these namespaces if on an UWP device
using Windows.Storage;
using System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions;
#endif

public static class Example
{
    // Instead of directly returning byte[] you will need to use a callback
    public static void GetFileContent(string filePath, Action<byte[]> onSuccess)
    {
        Task.Run(async () => await FileLoadingTask(filePath, onSuccess));
    }
    
    private static async Task FileLoadingTask(string filePath, Action<byte[]> onSuccess)
    {
#if WINDOWS_UWP
        // Get the 3D Objects folder
        var folder = Windows.Storage.KnownFolders.Objects3D;
        // get a file within it
        var file = await folder.GetFileAsync(filePath);

        // read the content into a buffer
        var buffer = await Windows.Storage.FileIO.ReadBufferAsync(file);
        // get a raw byte[]
        var bytes = buffer.ToArray();
#else
        // as a fallback and for testing in the Editor use he normal FileIO
        var folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "3D Objects");
        var fullFilePath = Path.Combine(folderPath, filePath);
        var bytes = await File.ReadAllBytesAsync(fullFilePath);
#endif

        // finally dispatch the callback action into the Unity main thread
        MainThreadDispatcher.Instance.DoInMainThread(() => onSuccess?.Invoke(bytes));
    }
}

Что вы тогда сделаете с возвращенным byte[] это зависит от вас! В Интернете существует множество реализаций загрузчиков и библиотек для различных типов файлов.


Дальнейшее чтение:

2021-11-24 09:34:08

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................