统一c# - 捕捉到地形时的旋转问题

时间:2013-11-19 14:55:42

标签: c# rotation unity3d terrain

我正在研究某些物体可以由用户通过鼠标移动。每当拖动时它们都会捕捉到地形,因此它们实际上无法从地形上拉下来。在我参与该项目之前,这已经到位。

我的任务是使物体不仅在位置上而且在旋转上(拥抱斜坡等)。目前我已经制作了一个预制片,可以向地面射出3条光线(物体的对象)。我平均命中的法线,然后将对象的向上矢量设置为该值。起初我认为工作正常,因为我正在测试一个立方体,无法直观地看到问题。

然后我尝试了卡车模型。看起来很好,但后来我旋转了卡车,然后再次拖动,我发现它正在捕捉到与我开始拖动之前不同的y旋转。我认为这是因为当我直接设置时,向前矢量会自动重新计算。

以下是我执行我指定的工作的更新方法。如果有人能告诉我如何达到预期效果,我将不胜感激。

void Update()
{
   //TargetObject.transform.position+=-TargetObject.transform.up*Time.deltaTime;
   //_snapChildren.ToArray()[2].transform.RotateAround(new Vector3(0.0f, 1.0f, 0.0f), Time.deltaTime);

   //Debug.LogWarning("Mouse Button 0 down: "+Input.GetMouseButton(0));

   if (_OI.GetActiveObject()==TargetObject.gameObject && _OI.GetActiveObjectDragging()) 
   {
      //Debug.LogWarning("We are the active object being dragged!!");

      //_curHitInfo=_snapChildrenHitInfos.ToArray()[0];
      if (Physics.Raycast(TargetObject.transform.position, -TargetObject.transform.up, out _hitInfo, 100.0f, 
                          _targetLayerMask))
      {
         _normals.Clear();
         _normals=new List<Vector3>();

         //Debug.LogWarning("Ding!! "+_hitInfo.transform.name);
         for (int iChild=0; iChild<_snapChildren.Count; iChild++)
         {
            _curHitInfo=_snapChildrenHitInfos.ToArray()[iChild];
            //Debug.LogWarning("LayerMask.NameToLayer(\"Draggable\"): "+(1 << LayerMask.NameToLayer("Draggable")));
            Physics.Raycast(_snapChildren.ToArray()[iChild].transform.position, 
                            -_snapChildren.ToArray()[iChild].transform.up, out _curHitInfo, 100.0f, 
                            _targetLayerMask);

            _normals.Add (new Vector3(_curHitInfo.normal.x, _curHitInfo.normal.y, _curHitInfo.normal.z));
            //Debug.LogWarning("Ding!! "+iChild+' '+_curHitInfo.transform.name);
            //Debug.LogWarning("_curHitInfo.normal: "+_curHitInfo.normal);
            /*Debug.LogWarning("_snapChildrenHitInfos.ToArray()[iChild].normal: "+
                             _snapChildrenHitInfos.ToArray()[iChild].normal);*/
            //Debug.LogWarning("_normals.ToArray()[iChild]: "+_normals.ToArray()[iChild]);
         }

         Vector3 avgNormal=new Vector3(0.0f, 0.0f, 0.0f);
         for (int iNormal=0; iNormal<_normals.Count; iNormal++)
         {
            avgNormal+=_normals[iNormal];
            //Debug.LogWarning("_normals["+iNormal+"]: "+_normals[iNormal]);
         }
         avgNormal/=_normals.Count;
         //Debug.LogWarning("avgNormal: "+avgNormal);

         //TargetObject.transform.localRotation=Quaternion.Euler(avgNormal);
         TargetObject.transform.up=avgNormal; //MAKE A POST ON STACK OVERFLOW...if limiting rotation to x/z
                                     //doesn't work
      }
   }
}

0 个答案:

没有答案