如何通过更改此c#代码进行连续旋转

时间:2018-04-02 13:50:32

标签: c# unity3d rotation kinect

我正在使用Unity,并在那里的论坛上问过这个但是没有任何回复。我从一个插件中找到了这个例子,我试图使用kinect旋转一个对象,用右手向右旋转,左旋转向左旋转。我设法让对象做到这一点,除了它在对象的每一侧停止,但不能弄清楚代码的哪一部分正在这样做。

谢谢

 using UnityEngine;
using System.Collections;
using System;

public class GestureListener : MonoBehaviour, KinectGestures.GestureListenerInterface
{
    // GUI Text to display the gesture messages.
    public GUIText GestureInfo;

    private bool raiselefthand;
    private bool raiserighthand;


    public bool IsSwipeLeft()
    {
        if(raiserighthand)
        {
            raiserighthand = false;
            return true;
        }

        return false;
    }

    public bool IsSwipeRight()
    {
        if(raiselefthand)
        {
            raiselefthand = false;
            return true;
        }

        return false;
    }


    public void UserDetected(uint userId, int userIndex)
    {
        // detect these user specific gestures
        KinectManager manager = KinectManager.Instance;

        manager.DetectGesture(userId, KinectGestures.Gestures.RaiseLeftHand);
        manager.DetectGesture(userId, KinectGestures.Gestures.RaiseRightHand);

        if(GestureInfo != null)
        {
            GestureInfo.GetComponent<GUIText>().text = "Swipe left or right to change the slides.";
        }
    }

    public void UserLost(uint userId, int userIndex)
    {
        if(GestureInfo != null)
        {
            GestureInfo.GetComponent<GUIText>().text = string.Empty;
        }
    }

    public void GestureInProgress(uint userId, int userIndex, KinectGestures.Gestures gesture, 
                                  float progress, KinectWrapper.NuiSkeletonPositionIndex joint, Vector3 screenPos)


    {
        // don't do anything here
    }

    public bool GestureCompleted (uint userId, int userIndex, KinectGestures.Gestures gesture, 
                                  KinectWrapper.NuiSkeletonPositionIndex joint, Vector3 screenPos)
    {
        string sGestureText = gesture + " detected";
        if(GestureInfo != null)
        {
            GestureInfo.GetComponent<GUIText>().text = sGestureText;
        }

        if(gesture == KinectGestures.Gestures.RaiseRightHand)
            raiserighthand = true;
        else if(gesture == KinectGestures.Gestures.RaiseLeftHand)
            raiselefthand = true;

        return true;
    }

    public bool GestureCancelled (uint userId, int userIndex, KinectGestures.Gestures gesture, 
                                  KinectWrapper.NuiSkeletonPositionIndex joint)
    {
        // don't do anything here, just reset the gesture state
        return true;
    }

}




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

public class PresentationScript : MonoBehaviour 
{
    public bool slideChangeWithGestures = true;
    public bool slideChangeWithKeys = true;
    public float spinSpeed = 5;

    public bool autoChangeAlfterDelay = false;
    public float slideChangeAfterDelay = 10;

    public List<Texture> slideTextures;
    public List<GameObject> horizontalSides;

    // if the presentation cube is behind the user (true) or in front of the user (false)
    public bool isBehindUser = false;

    private int maxSides = 0;
    private int maxTextures = 0;
    private int side = 0;
    private int tex = 0;
    private bool isSpinning = false;
    private float slideWaitUntil;
    private Quaternion targetRotation;

    private GestureListener gestureListener;



    void Start() 
    {
        // hide mouse cursor
        Cursor.visible = false;

        // calculate max slides and textures
        maxSides = horizontalSides.Count;
        maxTextures = slideTextures.Count;

        // delay the first slide
        slideWaitUntil = Time.realtimeSinceStartup + slideChangeAfterDelay;

        targetRotation = transform.rotation;
        isSpinning = false;

        tex = 0;
        side = 0;

        if(horizontalSides[side] && horizontalSides[side].GetComponent<Renderer>())
        {
            horizontalSides[side].GetComponent<Renderer>().material.mainTexture = slideTextures[tex];
        }

        // get the gestures listener
        gestureListener = Camera.main.GetComponent<GestureListener>();
    }

    void Update() 
    {
        // dont run Update() if there is no user
        KinectManager kinectManager = KinectManager.Instance;
        if(autoChangeAlfterDelay && (!kinectManager || !kinectManager.IsInitialized() || !kinectManager.IsUserDetected()))
            return;

        if(!isSpinning)
        {
            if(slideChangeWithKeys)
            {
                if(Input.GetKeyDown(KeyCode.PageDown))
                    RotateToNext();
                else if(Input.GetKeyDown(KeyCode.PageUp))
                    RotateToPrevious();
            }

            if(slideChangeWithGestures && gestureListener)
            {
                if(gestureListener.IsSwipeLeft())
                    RotateToNext();
                else if(gestureListener.IsSwipeRight())
                    RotateToPrevious();
            }

            // check for automatic slide-change after a given delay time
            if(autoChangeAlfterDelay && Time.realtimeSinceStartup >= slideWaitUntil)
            {
                RotateToNext();
            }
        }
        else
        {
            // spin the presentation
            transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, spinSpeed * Time.deltaTime);

            // check if transform reaches the target rotation. If yes - stop spinning
            float deltaTargetX = Mathf.Abs(targetRotation.eulerAngles.x - transform.rotation.eulerAngles.x);
            float deltaTargetY = Mathf.Abs(targetRotation.eulerAngles.y - transform.rotation.eulerAngles.y);

            if(deltaTargetX < 1f && deltaTargetY < 1f)
            {
                // delay the slide
                slideWaitUntil = Time.realtimeSinceStartup + slideChangeAfterDelay;
                isSpinning = false;
            }
        }
    }


    private void RotateToNext()
    {
        // set the next texture slide
        tex = (tex + 1) % maxTextures;

        if(!isBehindUser)
        {
            side = (side + 1) % maxSides;
        }
        else
        {
            if(side <= 0)
                side = maxSides - 1;
            else
                side -= 1;
        }

        if(horizontalSides[side] && horizontalSides[side].GetComponent<Renderer>())
        {
            horizontalSides[side].GetComponent<Renderer>().material.mainTexture = slideTextures[tex];
        }

        // rotate the presentation
        float yawRotation = !isBehindUser ? 360f / maxSides : -360f / maxSides;
        Vector3 rotateDegrees = new Vector3(0f, yawRotation, 0f);
        targetRotation *= Quaternion.Euler(rotateDegrees);
        isSpinning = true;
    }


    private void RotateToPrevious()
    {
        // set the previous texture slide
        if(tex <= 0)
            tex = maxTextures - 1;
        else
            tex -= 1;

        if(!isBehindUser)
        {
            if(side <= 0)
                side = maxSides - 1;
            else
                side -= 1;
        }
        else
        {
            side = (side + 1) % maxSides;
        }

        if(horizontalSides[side] && horizontalSides[side].GetComponent<Renderer>())
        {
            horizontalSides[side].GetComponent<Renderer>().material.mainTexture = slideTextures[tex];
        }

        // rotate the presentation
        float yawRotation = !isBehindUser ? -360f / maxSides : 360f / maxSides;
        Vector3 rotateDegrees = new Vector3(0f, yawRotation, 0f);
        targetRotation *= Quaternion.Euler(rotateDegrees);
        isSpinning = true;
    }


}

1 个答案:

答案 0 :(得分:0)

  

除了在对象的每一侧停止之外,我已设法让对象执行此操作,但无法确定代码的哪一部分正在执行此操作。

我理解您要求帮助查找轮换中涉及哪些部分。

因此,我查看了脚本并注意到PresentationScript中的两个部分。

这部分在Update()方法中。基于代码和作为其一部分的注释。

        // spin the presentation
        transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, spinSpeed * Time.deltaTime);

        // check if transform reaches the target rotation. If yes - stop spinning
        float deltaTargetX = Mathf.Abs(targetRotation.eulerAngles.x - transform.rotation.eulerAngles.x);
        float deltaTargetY = Mathf.Abs(targetRotation.eulerAngles.y - transform.rotation.eulerAngles.y);

        if(deltaTargetX < 1f && deltaTargetY < 1f)
        {
            // delay the slide
            slideWaitUntil = Time.realtimeSinceStartup + slideChangeAfterDelay;
            isSpinning = false;
        }

还涉及Start()方法中的这一行。

targetRotation = transform.rotation;

变换控制位置,缩放以及与此情况相关的对象旋转。