Движение единства дочернего объекта - PullRequest
2 голосов
/ 06 августа 2020

Я создаю небольшую демонстрацию, в которой объекты будут перемещаться на основе данных айтрекера с гарнитуры FOVE VR.

Когда я пытаюсь переместить два моих объекта («Ответчик взгляда - Цель» и «Взгляд» Responder - Fixation "): они не двигаются, и коллайдеры перестают работать.

У меня в Unity3d (2017.4.40f1) следующая иерархия

Иерархия в Unity3d

Следующий код прикреплен к GazeContingenVisualField

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class VisualField_test : FOVEBehavior
{
    private GameObject Target;
    private GameObject Fixation;

    private GameObject TargetGazeObj;
    private GameObject FixationGazeObj;

    private Collider collider_Fixation;
    private Collider collider_Target;

    private float TimeShowFix;

    private float T_ShowStim = 5.1f;
    private float T_TimeOut = 10.0f;

    private float[] StimPos_H_deg = { 0, 0, 0, 10, -10, 10, 10, -10, -10 };
    private float[] StimPos_V_deg = { 0, 10, -10, 0, 0, 10, -10, 10, -10 };
    private float[] StimPos_H = new float[100];
    private float[] StimPos_V = new float[100];


    private Material materialTarget;
    private Material materialFixaton;

    public enum StateTypes { WaitStart, TargetOn, TargetTimeOut, TargetSeen };
    public StateTypes CurrentState = StateTypes.WaitStart;
    public int idx_stimpos = 0;


    // Use this for initialization
    void Start()
    {
        for (int i = 0; i < StimPos_H_deg.Length; i++)
        {
            StimPos_H[i] = Mathf.Tan(StimPos_H_deg[i] / 180.0F * Mathf.PI) * 20.0F;
            StimPos_V[i] = Mathf.Tan(StimPos_V_deg[i] / 180.0F * Mathf.PI) * 20.0F;
        }

        Target = transform.Find("Gaze Responder - Target").gameObject;
        Fixation = transform.Find("Gaze Responder - Fixation").gameObject;

        TargetGazeObj = Target.transform.Find("Gazable object").gameObject;
        FixationGazeObj = Fixation.transform.Find("Gazable object").gameObject;

        materialTarget = TargetGazeObj.GetComponent<Renderer>().material;
        materialFixaton = FixationGazeObj.GetComponent<Renderer>().material;

        collider_Fixation = FixationGazeObj.GetComponent<Collider>();
        collider_Target = TargetGazeObj.GetComponent<Collider>();

        materialTarget.DisableKeyword("_EMISSION");

        materialFixaton.EnableKeyword("_EMISSION");
        materialFixaton.SetColor("_EmissionColor", Color.green);

    }

    // Update is called once per frame
    void Update()
    {

        switch (CurrentState)
        {
            case StateTypes.WaitStart:
                if (FoveInterface.Gazecast(collider_Fixation))
                {
                    CurrentState = StateTypes.TargetOn;
                    TimeShowFix = Time.time;

                    materialFixaton.EnableKeyword("_EMISSION");
                    materialFixaton.SetColor("_EmissionColor", Color.white);

                }

                break;
            case StateTypes.TargetOn:
                if (FoveInterface.Gazecast(collider_Target))
                {
                    CurrentState = StateTypes.TargetSeen;
                    materialTarget.EnableKeyword("_EMISSION");
                    materialTarget.SetColor("_EmissionColor", Color.yellow);
                }

               else if (Time.time <= TimeShowFix + T_ShowStim)
                {
                    materialTarget.EnableKeyword("_EMISSION");
                    materialTarget.SetColor("_EmissionColor", Color.white);
                }
                else
                {
                    materialTarget.DisableKeyword("_EMISSION");
                }

                if (Time.time >= TimeShowFix + T_TimeOut)
                {
                    CurrentState = StateTypes.TargetTimeOut;
                }


                break;
            case StateTypes.TargetTimeOut:
                idx_stimpos = (idx_stimpos +1) % StimPos_H.Length ;
                materialTarget.DisableKeyword("_EMISSION");
                Target.transform.localPosition = new Vector3(StimPos_H[idx_stimpos], StimPos_V[idx_stimpos], 0.0f);
                CurrentState = StateTypes.TargetOn;
                TimeShowFix = Time.time;
                break;

            case StateTypes.TargetSeen:
                idx_stimpos = (idx_stimpos + 1) % StimPos_H.Length;
                materialTarget.DisableKeyword("_EMISSION");

                Fixation.transform.localPosition = Target.transform.localPosition;
                Target.transform.localPosition = new Vector3(StimPos_H[idx_stimpos], StimPos_V[idx_stimpos], 5.0f);
                CurrentState = StateTypes.TargetOn;
                TimeShowFix = Time.time;

                break;
        }
    }
}

using Fove.Unity;
using UnityEngine;

public class FOVEBehavior: MonoBehaviour
{
    private static FoveInterface foveInterface;
    public static FoveInterface FoveInterface
    {
        get
        {
            if (foveInterface == null)
            {
                // returns the first FoveInterface found here but you should adapt this code to your game
                // especially in the case where you could have no or several FoveInterface in your game
                foveInterface = FindObjectOfType<FoveInterface>();
            }

            return foveInterface;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Преобразование объекта работает правильно, но соответствующая молния была установлена ​​в состояние c, поэтому излучающий объект, похоже, не менял своего положения.

Свойство Lightmap Stati c объекта Me sh Рендерер должен быть отключен

введите описание изображения здесь

0 голосов
/ 06 августа 2020

Я не совсем уверен, как работает FOVE, но это каким-то образом сбрасывает преобразование объектов «-Target»?

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

Возможно, то, что вы хотите переместить, - это настоящие «контролируемые объекты» (я знаю, что это VR, но может та же проблема).

И если что, в последнем операторе case вы устанавливаете локальную позицию Fixation на локальную позицию TargetGazeObj, но их ссылки на координаты, вероятно, разные, поэтому вы можете использовать глобальное положение там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...