2017-02-20 44 views
0

对于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; 
}    
+0

“我正在转换方向矢量在屏幕上的滑动。” - 你能告诉我们这样做的代码吗?我假设如果你使用['Camera.ScreenToWorldPoint'](https://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html),那么你就不会有问题了。 – Quantic

回答

0

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

    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; 
       } 
0

您与地面光线投射需要时touch.phase == TouchPhase.Ended然后从你的性格raycast.hit获取路线。

Raycasthit hitInfo; 
Physic.Raycast; 
相关问题