2017-04-18 95 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; 
    } 
} 

上述脚本已附有我的相机,它正确显示的对象,但我开始转动我的相机我的UI对象的旋转看起来如下图像建议 This is inital correct rotation

非常奇怪我旋转,就会出现此问题 enter image description here

我知道问题出在旋转,所以我累了改变我的这个轮换代码

userInterface.transform.rotation = this.transform.rotation; 

这个

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

,但它带来的另一个陌生的旋转对我来说就像下面 enter image description here

我想,我的userinteface对象面对我的相机correclty,甚至我的相机看开头或结尾给出我的用户界面对象。如何根据相机旋转正确旋转我的用户界面?

+0

我建议设置渲染模式画布成'屏幕空间上 - Overlay'。 – Iggy

+0

我不确定期望的行为会是什么(在第二张图片上)。你介意一点点介绍一下吗? 另外...如果你有欧拉角度的问题尝试'Quaternion.LookAt()',我觉得它更直观和防弹。 –

+0

@lggy我不能让它的屏幕空间 –

回答

0

如果我理解正确的话。你想要一个类似于滑动谷歌地图的行为。只有相机必须旋转并且图片必须调整其行为的位置和旋转角度。

下面的代码应该这样做:

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渲染到顶端,但我没有看到如何保持与旋转物体的恒定最小距离而不会稍微移位它。 –