【问题标题】:Rotation in Unity3DUnity3D中的旋转
【发布时间】:2012-03-08 08:05:19
【问题描述】:

这是我正在尝试做的简化代码:

var angle = 1.57;
if ( this.transform.rotation.y > angle ){
  this.transform.rotation.y--;
} else if ( this.transform.rotation.y < angle ){
  this.transform.rotation.y++;
}

我习惯于在 AS3 中编写代码,如果我在 Flash 中编写代码,它可以完美运行,但在 Unity3D 中却不行,而且我很难弄清楚为什么,或者我怎么能得到它效果。

有人可以帮我吗?谢谢!

编辑:

我的对象是一辆刚体汽车,有 2 个胶囊对撞机在“凹凸不平”的地板上行驶,在某些时候他只是失去了方向精度,我认为这是因为它的分层旋转系统。

(感谢 kay 提供的 transform.eulerAngles 提示)

【问题讨论】:

  • 您知道 Unity 有自己的专用 Stack Exchange website 吗?那里可能有更多专门的答案。
  • 从技术上讲,answers.unity3d.com 不是 Stack Exchange 成员。它由 Qato 提供,并且是开源克隆。但是,是的,那里有一个专门的 Unity 社区支持网站。
  • 我同意这是一个非常好的和非常有价值的资源,我不时在那里发帖,但我不喜欢他们的声誉系统:一个接受的答案值 0 分。也许有点幼稚,但每天花 15 分钟回答问题有点像我正在开发的游戏 :-)
  • Unity 不叫 Unity3D。您的第二个 if 语句是不必要的,因为您正在处理浮点数。您的代码导致非规范化四元数,不能作为旋转值接受。

标签: rotation transform unity3d euler-angles


【解决方案1】:

transform.rotation 检索Quaternion。请改用transform.rotation.eulerAngles.y

【讨论】:

  • 实际上我做到了,但是这个物体是一辆刚体汽车,有 2 个胶囊对撞机在“颠簸”的地板上行驶,在某些时候他只是失去了方向精度,我认为这是因为它的层次旋转系统...我将此信息添加到问题中,以便人们可以更好地看到它。
  • 你尝试过 transform.localRotation 吗?
【解决方案2】:

Transform Rotation 用于设置角度,而不是转动对象,因此您需要获取旋转,添加更改,然后设置新的旋转。

尝试改用 transform.rotate。

在此处查看 Unity3d 脚本参考: http://unity3d.com/support/documentation/ScriptReference/Transform.Rotate.html

【讨论】:

    【解决方案3】:

    你需要创建一个新的四元数对象

    transform.rotation = Quaternion.Euler (transform.rotation.x, transform.rotation.y++, transform.rotation.z);

    你也可以使用transform.Rotate函数。

    【讨论】:

      【解决方案4】:

      上述使用 transform.Rotate( ) 的建议可能是您实际使其旋转所需要做的,但是 transform.Rotate( ) 的变量是速度/速度而不是方向,所以要变换。如果您想要有角度的旋转,Rotate( ) 将不得不使用多个轴。例如:

      class Unity // Example is in C#
      {
          void Update( )
          {
              gameObject.transform.Rotate(0, 1, 0);
          }
      }
      

      这将以 1 的速度围绕其 y 轴旋转对象。

      如果这有帮助,请告诉我 - 如果有阻碍,我可以用不同的方式解释。

      【讨论】:

        【解决方案5】:

        到目前为止,我发现了两个问题。首先是Unity的分层旋转。根据您要实现的目标,您应该操纵任一

        transform.localEulerAngles
        or
        transform.eulerAngles
        

        第二件事是,你不能这样修改欧拉角,因为向量都是按值传递的:

        transform.localEulerAngles.y--;
        

        你必须这样做:

        Vector3 rotation = transform.localEulerAngles;
        rotation.y--;
        transform.localEulerAngles = rotation;
        

        【讨论】:

          【解决方案6】:

          您应该尝试将您的旋转系数乘以 Time.deltaTime

          希望有帮助

          和平

          【讨论】:

            【解决方案7】:

            这是我的 GameObject 触摸旋转脚本

            //
            //  RotateController.cs
            //
            //  Created by Ramdhan Choudhary on 12/05/13.
            //
            
            using UnityEngine;
            using System;
            
            public class RotateController
            {
            
                    private float RotationSpeed = 9.5f;
                    private const float mFingerDistanceEpsilon = 1.0f;
                    public float MinDist = 2.0f;
                    public float MaxDist = 50.0f;
                    private Transform mMoveObject = null;
                    private bool isEnabledMoving = false;
            
            
                    //************** Rotation Controller Constructor **************//
                    public RotateController (Transform goMove)
                    {
                            isEnabledMoving = true;
                            mMoveObject = goMove;
                            if (mMoveObject == null) {
                                    Debug.LogWarning ("Error! Cannot find object!");
                                    return;
                            }
                    }
            
                    //************** Handle Object Rotation **************//
                    public void Update ()
                    {
                            if (!isEnabledMoving && mMoveObject != null) {
                                    return;
                            }
            
                            Vector3 camDir = Camera.main.transform.forward;
                            Vector3 camLeft = Vector3.Cross (camDir, Vector3.down);
            
                            // rotate
                            if (Input.touchCount == 1) {
                                    mMoveObject.Rotate (camLeft, Input.touches [0].deltaPosition.y * RotationSpeed * Time.deltaTime, Space.World);
                                    mMoveObject.Rotate (Vector3.down, Input.touches [0].deltaPosition.x * RotationSpeed * Time.deltaTime, Space.Self);
                            }
            
            
                    }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-07-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多