Страница 1 из 1

FreeTrackIR + Unity3d

СообщениеДобавлено: 18 мар 2013, 20:38
nile
Сегодня был озадачен проблемой дружбы технологии TrackIR и Юнити. В интернете натыкался на готовое решение, но увы, оно оказалось актуальным не для всех версий Юнити (успешно тестировалось на 2 и 3.5, на 4-ке не заработало).

Тем не менее, есть программа FreeTrack ( http://www.free-track.net/english/freet ... -c-est.php ) (бесплатная!), позволяющая определять положение головы в пространстве c помощью вэбкамеры и несколько светодиодов (не обязательно ИК) и выдавать информацию через различные интерфейсы, в том числе и TRackIR. Но мое внимание привлек ее собственный интерфейс и SDK к нему. SDK в себя включает C, Delphy и Matlab.
В общем, покувырялся, изучил и сделал собственную адаптацию FreeTrack интерфейса для юнити! Работает отлично!

В качестве dll библиотеки используется FreeTrackClient.dll , который идет в комплекте с программой (лежит в корне программы и включен в мой unitypackage).
В пакете имеются 2 демонстрационные сцены.




Ссылка для прямого скачивания unitypackage: https://www.dropbox.com/s/ftwmsds4ctnv0 ... itypackage
Ссылка на скачивания программы FreeTrack 2.2.0.279 http://www.free-track.net/english/freet ... gement.php
Материал о том, как создать самодельный агрегат для FaceTrack можно найти в папке Manuals в директории программы. Я использую вариант с тремя светодиодами, расположенными сбоку (креплю к наушникам)
Скрины: https://www.dropbox.com/sh/3629h8xvy3wgqhw/Jot6hOu1fA#/
Ветвь на форуме unity3d.com http://forum.unity3d.com/threads/174552 ... ll-success!


Код (c#) (не особо заморачивался, пока сделал чтобы работало):
Синтаксис:
Используется csharp
using System;
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class FreeTrackClientDll  : MonoBehaviour {
       
       [StructLayout(LayoutKind.Sequential)]
       public struct FreeTrackData
       {
           public int dataid;
           public int camwidth, camheight;
           public Single Yaw, Pitch, Roll, X, Y, Z;
           public Single RawYaw, RawPitch, RawRoll;
           public Single RawX, RawY, RawZ;
           public Single x1, y1, x2, y2, x3, y3, x4, y4;          
       }
       
       [DllImport("FreeTrackClient")]
       public static extern bool FTGetData(ref FreeTrackData data);

       [DllImport("FreeTrackClient")]
       public static extern string FTGetDllVersion();

       [DllImport("FreeTrackClient")]
       public static extern void FTReportID(Int32 name);

       [DllImport("FreeTrackClient")]
       public static extern string FTProvider();

               
        public float Yaw=0F;
        public float Pitch=0F;
        public float Roll=0F;
        public float X=0F;
        public float Y=0F;
        public float Z=0F;
       
        public float RawYaw=0F;
        public float RawPitch=0F;
        public float RawRoll=0F;
        public float RawX=0F;
        public float RawY=0F;
        public float RawZ=0F;
       
        public float x1=0F;
        public float y1=0F;
        public float x2=0F;
        public float y2=0F;
        public float x3=0F;
        public float y3=0F;
        public float x4=0F;
        public float y4=0F;

         void Update()
{
                FreeTrackClientDll.FreeTrackData FreeTrackData;
                FreeTrackData =  new FreeTrackClientDll.FreeTrackData();
               if (!FreeTrackClientDll.FTGetData(ref FreeTrackData))
               {
                   Debug.Log ("FTGetData returned false. FreeTrack likely not working.");
                   return;
               }
     
        FreeTrackClientDll.FTGetData(ref FreeTrackData);
               
                Yaw = FreeTrackData.Yaw;
                Pitch = FreeTrackData.Pitch;
                Roll = FreeTrackData.Roll;
                X = FreeTrackData.X;
                Y = FreeTrackData.Y;
                Z = FreeTrackData.Z;
               
                RawYaw=FreeTrackData.RawYaw;
                RawPitch=FreeTrackData.RawPitch;
                RawRoll=FreeTrackData.RawRoll;
               
                RawX=FreeTrackData.RawX;
                RawY=FreeTrackData.RawY;
                RawZ=FreeTrackData.RawZ;
       
                x1=FreeTrackData.x1;
                y1=FreeTrackData.y1;
                x2=FreeTrackData.x2;
                y2=FreeTrackData.y2;
                x3=FreeTrackData.x3;
                y3=FreeTrackData.y3;
                x4=FreeTrackData.x4;
                y4=FreeTrackData.y4;
   }
 }

 
 


Все параметры с приставкой "Raw" - это сырые нефильтрованные данные.

Re: FreeTrackIR + Unity3d = Full success!

СообщениеДобавлено: 10 июл 2013, 12:16
Narukay
Изображение Спасибо) пригодится

Re: FreeTrackIR + Unity3d = Full success!

СообщениеДобавлено: 10 июл 2013, 12:45
nile
На ту простыню из паблик флоат не обращайте внимания, это для наглядности вынес, когда видео снимал.

Были бы доступны сорцы сия чуда (FreeTrackIR), сделал бы версию для мака. Но что-то у них на офф форуме не густо...Сорцы бесплатны, но сервер не доступен.

Re: FreeTrackIR + Unity3d = Full success!

СообщениеДобавлено: 10 июл 2013, 22:39
Narukay
а как его прикрепить к контроллеру?
беру стандартный контроллер от первого лица, во фритрекинпуте настраиваю, но у меня почему-то контроллер перемещается в на точку 0 0 0 и замерзает там и только камера поворачивается, а движения отключаются

Re: FreeTrackIR + Unity3d = Full success!

СообщениеДобавлено: 10 июл 2013, 22:57
Narukay

Re: FreeTrackIR + Unity3d = Full success!

СообщениеДобавлено: 11 июл 2013, 08:24
nile
Крутить и перемещать надо в локальных координатах. У FPS контроллера, на сколько я помню, камера "удочерена" ему самому. Причем в контроллере висит 2 одинаковых скрипта MouseLook. Один для вращения всего FPS контроллера влево-вправо, второй - для камеры (вверх вниз). Вот этот второй по сути надо заменить на мой скрипт, где параметры будут менять локальное вращение и перемещение.

ПС У меня там демо сцена была с красными кубиками, посмотри как там.


ППС FaceApi - крутая штука, но имеет задержки изза фильтрации. А без нее - результат поганый. Основной ее плюс - распознание мимики, можно персов анимировать.

Re: FreeTrackIR + Unity3d = Full success!

СообщениеДобавлено: 30 июл 2014, 13:47
bwolf88
Да тут вообще можно виртуальную реальность пилить :-o.

Re: FreeTrackIR + Unity3d = Full success!

СообщениеДобавлено: 02 сен 2014, 20:31
PREZRAK
Есть что-нибудь новое? Как разработка?

Re: FreeTrackIR + Unity3d = Full success!

СообщениеДобавлено: 04 сен 2014, 09:21
nile
Нет, увы, теперь там все глухо...Проект freetrackIR уже давно заброшен разработчиками. Однако есть альтернативы, например видел плагин для facetracknoir (совершенно другой проект), поддерживающий freetrackIR, однако по сравнению с оригинальной программой, настроек в нем не много.

ПС на гитхабе лежат delphi-шные исходники программы freetrackIR для винды.

Re: FreeTrackIR + Unity3d = Full success!

СообщениеДобавлено: 02 май 2015, 17:37
nile
Если тема трекинга головы с помощью протокола Freetrack еще кому-то интересна, то для работы в x64 системе необходимо скопировать из корневой папки Freetrack FreeTrackClient64.dll в папку Plugins демо проекта из первого поста. Соответственно в классе-враппере (FreeTrackClientDll.cs) заменить везде
Синтаксис:
Используется csharp
[DllImport("FreeTrackClient")]
 


на

Синтаксис:
Используется csharp
[DllImport("FreeTrackClient64]")] //<-64
 


Сейчас проверял ради интереса, все работает.

Так же добавлю, что на данный момент (апрель 2015) :
1) Оригинальный TrackIR скорее всего по качеству уже не имеет бесплатных альтернатив, Freetrack ему уступает, но не сильно. Freetrack был очень актуален, когда NaturalPoint впаривали по сути обычную камеру и примитивной клипсой и сырым ПО в 3-4 дороже, чем это реально стоило. Сейчас же у них это дело на высоте, камера 120 к/с, качественное ПО, отличная фильтрация данных. Могу сказать, что теперь это своих денег стоит.
2) Родной протокол Freetrack не обзавелся должной популярностью, скорее всего из-за возможности эмуляции оригинального протокола TrackIR. Разработчики игр отдавали предпочтение оригинальному устройству, тк были гарантии работоспособности (коммерческий проект же).
3) На сколько мне известно, NaturalPoint долго воевали с Freetrack и вроде выиграли войну. Дело было не в конкуренции, а в том, что для эмуляции оригинального протокола (см пункт 2) используется оригинальная DLL от TrackIR, а это незаконно.
4) Ну собственно, назревает эра Oculus Rift и его аналогов. Так что TrackIR, а уж тем более Freetrack, скорее всего потеряют свою актуальность вообще. Пока что их преимущество в том, что можно без проблем пользоваться клавиатурой и тд.
5) Первоначальный проект freetrack давно умер. Сейчас все это дело живет под колпаком facetracknoir в качестве плагина. Все прекрасно работает, даже есть различные фильтры.