【问题标题】:How do I correct the direction of my vector to the rotation of the camera?如何将矢量的方向校正为相机的旋转?
【发布时间】:2017-02-23 06:46:12
【问题描述】:

对于 3D 第一人称控制器游戏,我将屏幕上的滑动转换为方向矢量。 一个物体被射向这个方向。 我的相机可以根据虚拟操纵杆的输入进行旋转。 当我不旋转并使用滑动拍摄对象时,它会朝正确的方向移动。 但是,当我旋转相机时,它不会朝预期的方向移动。 方向应该适应相机的旋转。

如何将矢量的方向校正为相机的旋转?

PS: 私信我进一步说明

//Converting swipe direction to 3D direction
public class TouchPair
{
    public Vector2 startPos;
    public int fingerId;
}

private TouchPair touchPair;

void Update()
{
  foreach (Touch touch in Input.touches)
  {
      Vector2 touchPos = touch.position;

      if (touch.phase == TouchPhase.Began)
      {
         Ray ray = cam.ScreenPointToRay(touchPos);
         RaycastHit hit;

         if (Physics.Raycast(ray, out hit))
         {
            //The player is wielding a bomb that is visible on the screen.
            //only swipes that start from this object should count 
            if (hit.transform.tag == "Bomb")
            {
                touchPair = new TouchPair();
                touchPair.startPos = touchPos;
                touchPair.fingerId = touch.fingerId;
            }
          }
      }
      else if (touch.phase == TouchPhase.Ended)
      {          
         if (touchPair.fingerId == touch.fingerId)
         {
            Vector2 endPos = touchPos;
            Vector2 swipeDirectionRaw = endPos - touchPair.startPos;
            float magnitude = swipeDirectionRaw.magnitude;
            if (magnitude >= minSwipeLength)
            {
                  BombController BombController =                                                           GameObject.FindWithTag("Bomb").GetComponent<BombController>();
                            BombController.Throw(swipeDirectionRaw.normalized, magnitude);
            }
         }
      }
  }
}     

public void Throw(Vector2 direction, float magnitude)
{

    //Setup variables for throw
    throwDirection = new Vector3(direction.x, 0.0f, direction.y);
    throwSpeed = magnitude * throwForce;
}               

【问题讨论】:

  • “我正在将屏幕上的滑动转换为方向向量。” -- 你能告诉我们这样做的代码吗?我假设如果您使用Camera.ScreenToWorldPoint,那么您不会有问题。

标签: c# unity3d


【解决方案1】:

当 touch.phase == TouchPhase.Ended 时,您需要使用地面进行光线投射,然后从您的角色获取方向到 raycast.hit。

Raycasthit hitInfo;
Physic.Raycast;

【讨论】:

    【解决方案2】:

    我必须得到相机的视图向量。通过取角的数量 在玩家的前方和相机的视角矢量之间,接收到获得正确方向矢量所需的角度数量。 最后将拍摄方向旋转这个角度。

                        Vector2 endPos = touchPos;
                        Vector2 swipeDirectionRaw = endPos - touchPair.startPos;
                        float magnitude = swipeDirectionRaw.magnitude;
                        swipeDirectionRaw.Normalize();
                        if (magnitude >= minSwipeLength)
                        {
                            GameObject player = GameObject.FindWithTag("Player");
                            Vector3 shootOrigin = player.transform.position;
                            Vector3 uncorrectedShootDirection = new Vector3(swipeDirectionRaw.x, 0.0f, swipeDirectionRaw.y);
    
                            Vector3 originVector = player.transform.forward;
                            Vector3 viewVector = cam.transform.forward;
    
                            //Shoot direction gets corrected by angle between origin- and view vector
                            float angleBetweenOriginAndView = Vector3.Angle(originVector, viewVector);
    
                    //There is no clockwise or counter-clockwise in 3d space, 
                    //hence mirroring is needed. In my case it's done to what suits my needs
                                if (viewVector.x < 0.0f)
                                {
                                    angleBetweenOriginAndView *= -1f;
                                }
    
                            Vector3 correctedShootDirection = Quaternion.Euler(0, angleBetweenOriginAndView, 0) * uncorrectedShootDirection;
                        }
    
                        touchPair = null;
                    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多