在多个GameObjects的所有帧中保持特定的旋转度

时间:2018-08-03 09:43:26

标签: unity3d rotation quaternions euler-angles

我正在制作一款具有2D和3D元素一起放置在一个世界中的功能的游戏。在这里,您对可以在我的游戏中看到的混合方式有所了解。

enter image description here

我通过将相机放置在名为cameraHolder的游戏对象中并简单地沿其z轴旋转cameraHolder来实现此目的。这样,安装在支架上的摄像机始终与地面成41度角。现在您可以想象我需要旋转精灵以匹配2个值。首先是camera的z轴;第二,我必须在精灵上放置一个角度,以使其不“躺在”地面上,而始终面向相机。这是问题出现的地方。

enter image description here

这里有一个摄影机旋转的示例(chracter的sprite在z轴上旋转以匹配cameraHolder并保持其在x轴上的旋转,因此它始终面向摄影机。)

enter image description here

现在您会认为一切都很好,因为这实际上是我想要的外观。但是,偶尔地,我无法弄清是什么原因造成的,所有的精灵都会恢复为沿着地板躺下,从而打破了幻觉。尝试解决此问题时,我意识到我并没有真正理解它最初为什么起作用,也许我能永久解决此问题。

组织精灵旋转的脚本如下。

     public class FaceCamera : MonoBehaviour {

     public Transform target;

     void Start()
     {
         target = GameObject.Find("MainCamera").GetComponent<Transform>();
     }

     void Update()
     {

         if (target != null)
         {
             this.transform.rotation = target.rotation;
         }
     }
 }

我知道为了优化起见,我应该添加Mathf.roximately并比较这两个值,并且只有在其值更改后才执行此操作。但这是出于测试目的。

所以我的问题是。 为什么首先将我的精灵旋转设置为等于摄影机旋转。摄像机以欧拉角旋转为(-41,0,0)?

我尝试过的事情:

  • 使用旋转/位置约束组件
  • 设置一个脚本来检测何时失败并解决该问题(我知道这很丑,但是想知道它是否有效,)
  • 尝试直接应用欧拉角旋转,这会在旋转屏幕时引起奇怪的行为,以为可能是万向节锁定。

参考:

https://answers.unity.com/questions/48609/whats-the-difference-between-rotation-eulerangles.html

更新1

Transform cam;
[SerializeField] float threshold;

public static bool FastApproximately(float a, float b, float threshold)
{
    return ((a - b) < 0 ? ((a - b) * -1) : (a - b)) <= threshold;
}

void Start()
{
    cam = Camera.main.transform;
    transform.rotation = cam.rotation;
}

void OnWillRenderObject()
{
    if (!FastApproximately(cam.rotation.x, transform.rotation.x, 0.0001f))
    {
        transform.rotation = cam.rotation;
    }
}

0 个答案:

没有答案