FreeTrackIR + Unity3d

Лучший способ помочь другим, поделиться своими находками.

FreeTrackIR + Unity3d

Сообщение nile 18 мар 2013, 20:38

Сегодня был озадачен проблемой дружбы технологии 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" - это сырые нефильтрованные данные.
Последний раз редактировалось nile 02 май 2015, 18:32, всего редактировалось 2 раз(а).
Аватара пользователя
nile
Старожил
 
Сообщения: 848
Зарегистрирован: 25 фев 2011, 17:17

Re: FreeTrackIR + Unity3d = Full success!

Сообщение Narukay 10 июл 2013, 12:16

Изображение Спасибо) пригодится
Narukay
UNец
 
Сообщения: 3
Зарегистрирован: 13 дек 2012, 19:33

Re: FreeTrackIR + Unity3d = Full success!

Сообщение nile 10 июл 2013, 12:45

На ту простыню из паблик флоат не обращайте внимания, это для наглядности вынес, когда видео снимал.

Были бы доступны сорцы сия чуда (FreeTrackIR), сделал бы версию для мака. Но что-то у них на офф форуме не густо...Сорцы бесплатны, но сервер не доступен.
Аватара пользователя
nile
Старожил
 
Сообщения: 848
Зарегистрирован: 25 фев 2011, 17:17

Re: FreeTrackIR + Unity3d = Full success!

Сообщение Narukay 10 июл 2013, 22:39

а как его прикрепить к контроллеру?
беру стандартный контроллер от первого лица, во фритрекинпуте настраиваю, но у меня почему-то контроллер перемещается в на точку 0 0 0 и замерзает там и только камера поворачивается, а движения отключаются
Narukay
UNец
 
Сообщения: 3
Зарегистрирован: 13 дек 2012, 19:33

Re: FreeTrackIR + Unity3d = Full success!

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

Narukay
UNец
 
Сообщения: 3
Зарегистрирован: 13 дек 2012, 19:33

Re: FreeTrackIR + Unity3d = Full success!

Сообщение nile 11 июл 2013, 08:24

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

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


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

Re: FreeTrackIR + Unity3d = Full success!

Сообщение bwolf88 30 июл 2014, 13:47

Да тут вообще можно виртуальную реальность пилить :-o.
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Re: FreeTrackIR + Unity3d = Full success!

Сообщение PREZRAK 02 сен 2014, 20:31

Есть что-нибудь новое? Как разработка?
участник клуба GCC
Аватара пользователя
PREZRAK
Старожил
 
Сообщения: 653
Зарегистрирован: 30 май 2013, 12:41
  • Сайт

Re: FreeTrackIR + Unity3d = Full success!

Сообщение nile 04 сен 2014, 09:21

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

ПС на гитхабе лежат delphi-шные исходники программы freetrackIR для винды.
Аватара пользователя
nile
Старожил
 
Сообщения: 848
Зарегистрирован: 25 фев 2011, 17:17

Re: FreeTrackIR + Unity3d = Full success!

Сообщение nile 02 май 2015, 17:37

Если тема трекинга головы с помощью протокола 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 в качестве плагина. Все прекрасно работает, даже есть различные фильтры.
Аватара пользователя
nile
Старожил
 
Сообщения: 848
Зарегистрирован: 25 фев 2011, 17:17


Вернуться в Исходники (Копилка)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1