2016-07-13 2 views
0

私のパースペクティブカメラはx軸で回転します。私はスクロールホイールでズームを実装し、それは素晴らしい作品です。Unity3Dでカメラを前後に動かすベクトル

私はズームを制限しようとしています。今私の解決策は、transform.forwardのyとz成分の相対的なスケールを取って、Mathf.Clampを使ってminZoommaxZoom浮動小数点数に対応するtransform.forwardコンポーネントを掛けて、カメラのyとzの位置を固定することです。それはy軸を制限することを除いてうまくいきます。私が周りを翻訳するとき、私のクランプは理想的にはズームのみに影響を与えることが意図されているため、与えられたyより下に行くことはできません。

カメラの前後の動きをクランプする方法はありますか?私はどこからでも見てきましたが、事を見つけることはできません。

ありがとうございました。

編集

ここでは、関連するコード(私の締め付けがLateUpdateで発生)です:

public class ClickManager : MonoBehaviour 

{ 
    public float dragSpeed = 2; 
    public float minZoom = 0.5f; 
    public float maxZoom = 5.0f; 

    private Vector3 dragOrigin; 

    private float lerpPercentBack = 0; // value between 0 and 1 representing percentage of lerp 
    private float lerpPercentForward = 0; 
    private bool isLerpingBack = false; 
    private bool isLerpingForward = false; 



    void Update() 
    { 
     float scroll = Input.GetAxis("Mouse ScrollWheel"); 

     if (Input.GetMouseButtonDown(1)) 
     { 
      dragOrigin = Input.mousePosition; 
      return; 
     } 

     if (scroll > 0) 
     { 
      isLerpingForward = true; 
      lerpPercentForward = 0; 
     } 
     if (scroll < 0) 
     { 
      isLerpingBack = true; 
      lerpPercentBack = 0; 
     } 



     if (isLerpingBack) 
     { 
      scrollLerperBack(); 
      lerpPercentBack += 0.05f; 

      if (lerpPercentBack >= 1.0f) 
      { 
       lerpPercentBack = 0; 
       isLerpingBack = false; 
      } 
     } 


     if (isLerpingForward) 
     { 

      scrollLerperForward(); 
      lerpPercentForward += 0.05f; 

      if (lerpPercentForward >= 1.0f) 
      { 
       lerpPercentForward = 0; 
       isLerpingForward = false; 
      } 
     } 

     //Debug.Log(lerpPercent); 

     /*if (!Input.GetMouseButton(1)) return; 

     Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - dragOrigin); 
     Vector3 move = new Vector3(pos.x * dragSpeed, pos.y * dragSpeed, 0); 

     transform.Translate(move, Space.World); 

     Debug.Log(scroll);*/ 


    } 


    void scrollLerperBack() 
    { 
     transform.position -= Vector3.Lerp(transform.forward, Vector3.zero, lerpPercentBack); 
    } 


    void scrollLerperForward() 
    { 
     transform.position += Vector3.Lerp(transform.forward, Vector3.zero, lerpPercentForward); 
    } 

    void LateUpdate() 
    { 
     Vector3 pos = transform.position; 

     pos.y = Mathf.Clamp(pos.y, minZoom * transform.forward.y, 
      maxZoom * transform.forward.y); 
     pos.z = Mathf.Clamp(pos.z, minZoom * transform.forward.z, 
      maxZoom * transform.forward.z); 
     transform.localPosition = pos; 
    } 

} 
+0

代わりの段落で、あなたのコードを説明するが、その質問を投稿する方が良いプログラミング言語は英語ではなくわかりやすいです:) –

+0

もちろん、コードを追加します。 – duncster94

答えて

1

ワーキングコード:

using UnityEngine; 
using System.Collections; 

public class ClickManager : MonoBehaviour 
{ 
    public float dragSpeed = 2; 
    public float minZoom = 0.5f; 
    public float maxZoom = 5.0f; 

    private Vector3 dragOrigin; 

    private float lerpPercentBack = 0; 
    private float lerpPercentForward = 0; 
    private bool isLerpingBack = false; 
    private bool isLerpingForward = false; 

    Vector3 forwardPos; 
    Vector3 backwardPos; 
    void Start() 
    { 
     forwardPos = transform.position ; 
     forwardPos.z += maxZoom; 

     backwardPos = transform.position ; 
     backwardPos.z += minZoom; 
    } 


    void Update() 
    { 
     float scroll = Input.GetAxis("Mouse ScrollWheel"); 

     if (Input.GetMouseButtonDown(1)) 
     { 
      dragOrigin = Input.mousePosition; 
      return; 
     } 

     if (scroll > 0) 
     { 
      isLerpingForward = true; 
      lerpPercentForward = 0; 
     } 
     if (scroll < 0) 
     { 
      isLerpingBack = true; 
      lerpPercentBack = 0; 
     } 



     if (isLerpingBack) 
     { 
      scrollLerperBack(); 
      lerpPercentBack += 0.05f; 

      if (lerpPercentBack >= 1.0f) 
      { 
       lerpPercentBack = 0; 
       isLerpingBack = false; 
      } 
     } 


     if (isLerpingForward) 
     { 

      scrollLerperForward(); 
      lerpPercentForward += 0.05f; 

      if (lerpPercentForward >= 1.0f) 
      { 
       lerpPercentForward = 0; 
       isLerpingForward = false; 
      } 
     } 
    } 


    void scrollLerperBack() 
    { 
     transform.position = Vector3.MoveTowards(transform.position, backwardPos, Time.deltaTime * dragSpeed); 
    } 


    void scrollLerperForward() 
    { 
     transform.position = Vector3.MoveTowards(transform.position, forwardPos, Time.deltaTime * dragSpeed); 
    } 


} 
+0

私のカメラはx軸上で回転しますが、私がz軸上だけを動かすと、カメラは後ろではなく上に移動します。 transform.forwardベクトルは(0,0.6,0.8) – duncster94

+0

あなたは前方と後方の瞬間を締めたいと言わなかったのですか?例えばx軸の周りを90度回転させると、下向きになります。だからスクロールバックは、世界でそれを上向きに翻訳することを意味します。 –

+0

-30度のように回転しているので、カメラが向いている場所を基準にして後方に向いています。申し訳ありませんが、もっと明確にすべきでした。 – duncster94

関連する問題