关于Kinect结合Unity3D引擎开发体感游戏 代码菜鸟的疑问(二)

赵逸君 发布于 2015/01/05 16:44
阅读 2K+
收藏 0

@地瓜儿 你好,想跟你请教个问题:

我已经找到了一个解决移动的方法,但是他是在kinectpoint控制代码更改的,在update里面:

// Update is called once per frame
    void Update () {
        Vector3 leftHand = new Vector3(0,0,0);
        Vector3 rightHand = new Vector3(0,0,0);
        
        //update all of the bones positions
        if (sw.pollSkeleton())
        {
            //Debug.Log("Has Track\n");
            for( int ii = 0; ii < (int)Kinect.NuiSkeletonPositionIndex.Count; ii++)
            {
                //_bonePos[ii] = sw.getBonePos(ii);
                if( ((uint)Mask & (uint)(1 << ii) ) > 0 ){
                    _bones[ii].transform.localPosition = sw.bonePos[player,ii];
                }
                
                //Right hand
                if(ii == 11)
                {
                    rightHand = _bones[ii].transform.localPosition;
                    //      Debug.Log("RightHand: x " + _bones[ii].transform.localPosition.x.ToString() + " y " +
                    //          _bones[ii].transform.localPosition.y.ToString() + " z " +_bones[ii].transform.localPosition.z.ToString());  
                }
                //left hand
                if(ii == 7)
                {
                    leftHand = _bones[ii].transform.localPosition;
                    //  Debug.Log("LeftHand: x " + _bones[ii].transform.localPosition.x.ToString() + " y " +
                    //      _bones[ii].transform.localPosition.y.ToString() + " z " +_bones[ii].transform.localPosition.z.ToString());
                    
                }
                
            }
            
            
            //Event.KeyboardEvent("w");
            
            
            //ren.vel = 0;
            
            
            //left hand y+x >2 ;right hand y+x >2 go
            if ((leftHand.y + leftHand.x > 2) && (rightHand.y + leftHand.x > 2))
            {
                //go
                ren.vel = 1;
                
                //Debug.Log("go\n");
            }
           
我想在kinectmodel控制代码里面添加这个功能让模型移动(“ren“的代码我已经写了,用点来试验没有问题,可以和人一起移动),我想利用这个原理。

不知道这个想法行不行得通。

我在kinectmodel控制代码的update里也这样修改(因为我发现两段代码结构类似,只是模型控制多了一个方法):

       void Update () {

        Vector3 leftHand = new Vector3(0,0,0);
        Vector3 rightHand = new Vector3(0,0,0);
        //update the data from the kinect if necessary
        if(sw.pollSkeleton()){
            for( int ii = 0; ii < (int)Kinect.NuiSkeletonPositionIndex.Count; ii++)
            {
                if( ((uint)Mask & (uint)(1 << ii) ) > 0 && (_nullMask & (uint)(1 << ii)) <= 0 )
                {
                    RotateJoint(ii);
                }

                //Right hand
                if(ii == 11)
                {
                    rightHand = RotateJoint(ii);
                    //      Debug.Log("RightHand: x " + _bones[ii].transform.localPosition.x.ToString() + " y " +
                    //          _bones[ii].transform.localPosition.y.ToString() + " z " +_bones[ii].transform.localPosition.z.ToString());  
                }
                //left hand
                if(ii == 7)
                {
                    leftHand = RotateJoint(ii);
                    //  Debug.Log("LeftHand: x " + _bones[ii].transform.localPosition.x.ToString() + " y " +
                    //      _bones[ii].transform.localPosition.y.ToString() + " z " +_bones[ii].transform.localPosition.z.ToString());
                    
                }
            }

            //ren.vel = 0;
            
            
            //left hand y+x >2 ;right hand y+x >2 go
            if ((leftHand.y + leftHand.x > 2) && (rightHand.y + leftHand.x > 2))
            {
                //go
                ren.vel = 1;
                
                //Debug.Log("go\n");
            }
        }
    }
    
    void RotateJoint(int bone) {
        //if blendWeight is 0 there is no need to compute the rotations
        if( blendWeight <= 0 ){ return; }
        Vector3 upDir = new Vector3();
        Vector3 rightDir = new Vector3();
        if(bone == (int)Kinect.NuiSkeletonPositionIndex.Spine)
        {
            upDir = ((Hip_Left.transform.position + Hip_Right.transform.position) / 2F) - Hip_Override.transform.position;
            rightDir = Hip_Right.transform.position - Hip_Left.transform.position;
        }
        
        //if the model is not animated, reset rotations to fix twisted joints
        if(!animated){_bones[bone].transform.localRotation = _baseRotation[bone];}
        //if the required bone data from the kinect isn't available, return
        if( sw.boneState[player,bone] == Kinect.NuiSkeletonPositionTrackingState.NotTracked)
        {
            return;
        }
        
        //get the target direction of the bone in world space
        //for the majority of bone it's bone - 1 to bone, but Hip_Override and the outside
        //shoulders are determined differently.
        
        Vector3 dir = _boneDir[bone];
        Vector3 target;
        
        //if bone % 4 == 0 then it is either an outside shoulder or the hip override
        if(bone % 4 == 0)
        {
            //hip override is at Hip_Left
            if(bone == (int)Kinect.NuiSkeletonPositionIndex.HipLeft)
            {
                //target = vector from hip_center to average of hips left and right
                target = ((sw.bonePos[player,(int)Kinect.NuiSkeletonPositionIndex.HipLeft] + sw.bonePos[player,(int)Kinect.NuiSkeletonPositionIndex.HipRight]) / 2F) - sw.bonePos[player,(int)Kinect.NuiSkeletonPositionIndex.HipCenter];
            }
            //otherwise it is one of the shoulders
            else
            {
                //target = vector from shoulder_center to bone
                target = sw.bonePos[player,bone] - sw.bonePos[player,(int)Kinect.NuiSkeletonPositionIndex.ShoulderCenter];
            }
        }
        else
        {
            //target = vector from previous bone to bone
            target = sw.bonePos[player,bone] - sw.bonePos[player,bone-1];
        }
        //transform it into bone-local space (independant of the transform of the controller)
        target = transform.TransformDirection(target);
        target = _bones[bone].transform.InverseTransformDirection(target);
        //create a rotation that rotates dir into target
        Quaternion quat = Quaternion.FromToRotation(dir,target);
        //if bone is the spine, add in the rotation along the spine
        if(bone == (int)Kinect.NuiSkeletonPositionIndex.Spine)
        {
            //rotate the chest so that it faces forward (determined by the shoulders)
            dir = _chestRight;
            target = sw.bonePos[player,(int)Kinect.NuiSkeletonPositionIndex.ShoulderRight] - sw.bonePos[player,(int)Kinect.NuiSkeletonPositionIndex.ShoulderLeft];
            
            target = transform.TransformDirection(target);
            target = _bones[bone].transform.InverseTransformDirection(target);
            target -= Vector3.Project(target,_boneDir[bone]);
            
            quat *= Quaternion.FromToRotation(dir,target);
            
        }
        //if bone is the hip override, add in the rotation along the hips
        else if(bone == (int)Kinect.NuiSkeletonPositionIndex.HipLeft)
        {
            //rotate the hips so they face forward (determined by the hips)
            dir = _hipRight;
            target = sw.bonePos[player,(int)Kinect.NuiSkeletonPositionIndex.HipRight] - sw.bonePos[player,(int)Kinect.NuiSkeletonPositionIndex.HipLeft];
            
            target = transform.TransformDirection(target);
            target = _bones[bone].transform.InverseTransformDirection(target);
            target -= Vector3.Project(target,_boneDir[bone]);
            
            quat *= Quaternion.FromToRotation(dir,target);
        }
        
        //reduce the effect of the rotation using the blend parameter
        quat = Quaternion.Lerp(Quaternion.identity, quat, blendWeight);
        //apply the rotation to the local rotation of the bone
        _bones[bone].transform.localRotation = _bones[bone].transform.localRotation  * quat;
        
        if(bone == (int)Kinect.NuiSkeletonPositionIndex.Spine)
        {
            restoreBone(_bones[(int)Kinect.NuiSkeletonPositionIndex.HipLeft],_boneDir[(int)Kinect.NuiSkeletonPositionIndex.HipLeft],upDir);
            restoreBone(_bones[(int)Kinect.NuiSkeletonPositionIndex.HipLeft],_hipRight,rightDir);
        }
        
        return;
    }

改了之后会有” Cannot implicitly convert type `void' to `UnityEngine.Vector3'“

不能隐式转换类型'void''UnityEngine.Vector3

1.我想知道我这个办法是否可行

2.我应该怎么写 rightHand = RotateJoint(ii);   才是正确的?

righthand在V3结构体下定义的,算是个什么类型? RotateJoint是int型?


加载中
0
地瓜儿
地瓜儿
这个如果是自己疯转的话  你可以用enum来封装15块骨骼排序即可!
0
赵逸君
赵逸君

引用来自“地瓜儿”的评论

这个如果是自己疯转的话  你可以用enum来封装15块骨骼排序即可!

这个是用卡梅隆包,想修改模型控制那个代码让模型和我一起走动

(我是之前请教过你的那个小妹妹···代码不是很好的那个o(╯□╰)o)

0
地瓜儿
地瓜儿

引用来自“地瓜儿”的评论

这个如果是自己疯转的话  你可以用enum来封装15块骨骼排序即可!

引用来自“赵逸君”的评论

这个是用卡梅隆包,想修改模型控制那个代码让模型和我一起走动

(我是之前请教过你的那个小妹妹···代码不是很好的那个o(╯□╰)o)

你可以跑跑卡梅隆自带的例子,看看它是怎么写的,就是我第一篇文章。然后再让O型在场景里走!
0
赵逸君
赵逸君

引用来自“地瓜儿”的评论

引用来自“地瓜儿”的评论

这个如果是自己疯转的话  你可以用enum来封装15块骨骼排序即可!

引用来自“赵逸君”的评论

这个是用卡梅隆包,想修改模型控制那个代码让模型和我一起走动

(我是之前请教过你的那个小妹妹···代码不是很好的那个o(╯□╰)o)

你可以跑跑卡梅隆自带的例子,看看它是怎么写的,就是我第一篇文章。然后再让O型在场景里走!

我已经做过了,之前你叫我看移动率的,还有游戏模型在场景怎么移动···这两个代码就是那里面的吖···o(╯□╰)o我应该在原来提问那里回复的···

有一个问题,vector3这个结构体是什么类型的?在网上没查到···

0
地瓜儿
地瓜儿
那是还没看到理解 vector3封装代表三维坐标
返回顶部
顶部