2017-04-18 23 views
0

カメラの前面にuserInterface(キャンバス)オブジェクトが表示されているカメラがあります。 カメラレイキャストが私のuserInterfaceオブジェクトコライダーに当たっていない場合にのみ、私はユーザーインターフェイスの位置を更新しています。このような何かカメラの回転時にオブジェクトの回転が正しくない

public class UIPlacerAtCamFront : MonoBehaviour { 

    public GameObject userInterface; 
    public float placementDistance; 
    Vector3 uiPlacementPosition; 
    RaycastHit objectHit; 

    void Update() { 

     Vector3 fwd = this.transform.TransformDirection(Vector3.forward); 
     //Debug.DrawRay(this.transform.position, fwd * 50, Color.green); 

     if (Physics.Raycast(this.transform.position, fwd, out objectHit, 50)) 
     { 
      //raycast hitting the userInterface collider, so do nothing, userinterface is infornt of the camrea already 
     } 
     else 
     { 
      //raycast is not hitting userInterfae collider, so update UserInterface position accoding to the camera 
      uiPlacementPosition = this.transform.position + this.transform.forward * placementDistance; 
      userInterface.transform.position = uiPlacementPosition; 
     } 

     //Continuously update userInterface rotation according to camera 
     userInterface.transform.rotation = this.transform.rotation; 
    } 
} 

上記のスクリプトは、私は画像の下のよう This is inital correct rotation

を示唆したように、私のUIオブジェクトの回転は非常に奇妙に見える私のカメラを回転させる始めると、それは正しくオブジェクトを表示するものの、私のカメラを装着しています私はこの問題は enter image description here

が、私は問題が回転していることを知って発生し、回転させるので、私は疲れて私のこの回転コードを変更する

userInterface.transform.rotation = this.transform.rotation; 
この

userInterface.transform.localEulerAngles = new Vector3 (this.transform.localEulerAngles.x, 
      0, 
      this.transform.localEulerAngles.z); 

から

が、私は私のuserintefaceオブジェクトは、開始または終了を見ても、私のカメラを私のカメラcorrecltyに直面することを望ん enter image description here

下記のようにそれは、私のために別の奇妙な回転をもたらします私のuserintefaceオブジェクトの。カメラの回転に合わせてUIを回転させるにはどうすればいいですか?

+0

私は '画面スペースにあなたのキャンバスにレンダリングモードの設定をお勧めしたい - Overlay'。 – Iggy

+0

私は、(その第2の画像上で)所望の挙動が何であるか不明である。それを少し詳しく教えてもらえますか? また、オイラー角に問題がある場合は、Quaternion.LookAt()を試してみると、より直感的で弾丸がないことがわかります。 –

+0

@lggy私は画面のスペースを作ることができません –

答えて

0

正しく理解すればあなたは、Googleマップをスライドさせるのと同様の振る舞いが必要です。カメラは回転しなければならず、画像はその動作の位置と回転を調整する必要があります。

次のコードはそれを行う必要があります。

void Update() { 
    userInterface.transform.rotation = this.transform.rotation; 

    // Project camera to canvas plane 
    Vector3 projection = Vector3.ProjectOnPlane(this.transform.position - userInterface.transform.position, userInterface.transform.forward) 
     + userInterface.transform.position; 

    // Get distance from camera to projected position (basically, distance from point to plane) 
    float curDistance = (this.transform.position - projection).magnitude; 

    // Correct that distance with desired distance 
    userInterface.transform.position += this.transform.forward * (placementDistance - curDistance); 
} 
+0

レイプキャストがuserintefaceに当たっていない場合、ユーザーインターフェイスの位置を更新したいだけです。自分のカメラからユーザーインターフェイスに何らかの選択をしているので、 –

+0

カメラには、ユーザーインターフェイス上のさまざまなオブジェクトを選択する子ポインターが含まれており、キャンバスの別の場所で選択を行うために回転します。あなたのコードが示唆しているように私はすべての時間の位置を更新する場合、私はそれを選択することができません –

+0

あなたは位置の代わりに回転を保存することができます。または、平面ロジックでUiを上にレンダリングする2番目のカメラを使用することもできますが、回転するオブジェクトに対して一定の最小距離を少しずらすことなく維持できるかどうかはわかりません。 –

関連する問題