围绕世界原点旋转对象

Posted

技术标签:

【中文标题】围绕世界原点旋转对象【英文标题】:Rotate object around world origin 【发布时间】:2015-04-11 21:39:10 【问题描述】:

我目前正在尝试围绕世界的 x 轴旋转一个 positionVector (0,0,1),然后将其旋转回原来的位置(只是想让它工作)。我读入了旋转矩阵并让它工作(排序),但我现在很困。

正如图像和代码所示,我在起点 (0,0,1) 创建了一个立方体,在本例中将其向下旋转 30 度。但顺时针旋转时似乎旋转了30多度。但是,当我逆时针(30 度)旋转它时,它确实旋转了适当的量。这导致它没有像应有的那样到达起点 (0,0,1)。


我想知道你们中的任何人是否可以阐明为什么会发生这种情况以及如何解决它。提前谢谢你们!

public float RotAngle = 330f;

public GameObject cube;
public GameObject original;
public GameObject relocator;
public GameObject initialTurn;

void Start ()
  
        Vector3 pixelPos = new Vector3(0f, 0f, 1f);
  
        original = GameObject.Instantiate(cube,pixelPos,Quaternion.identity) as GameObject;
        original.name = "Original";


        initialTurn = GameObject.Instantiate(cube, pixelPos, Quaternion.identity) as GameObject;
        initialTurn.name = "InitialTurn";

        relocator = GameObject.Instantiate(cube, pixelPos, Quaternion.identity) as GameObject;
        relocator.name = "Relocator";
  
void Update()
  
        initialTurn.transform.position = RotateAroundOrigin(original.transform.position, RotAngle*Mathf.Deg2Rad);
        relocator.transform.position = RotateAroundOrigin(initialTurn.transform.position, (RotAngle * -1f) * Mathf.Deg2Rad);
  

Vector3 RotateAroundOrigin(Vector3 startPos,float angle)
    
        startPos.Normalize();
        startPos.y = (startPos.y * Mathf.Cos(angle)) - (startPos.z * Mathf.Sin(angle));
        startPos.z = (startPos.y * Mathf.Sin(angle)) + (startPos.z * Mathf.Cos(angle));
        return startPos.normalized;
    

【问题讨论】:

“但是如果我用手测量它”就像在显示器上放一个量角器一样?我会怀疑任何手工测量。如果出于某种原因您需要滚动自己的代码,为什么不将其与 Unity 的内置函数进行比较:transform.RotateAround (Vector3.zero, Vector3.forward, RotAngle*Mathf.Deg2Rad); 您也不应该对旋转的 3D 位置进行归一化,归一化通常只对方向向量有用。 @Jerdak 我假设“手动”意味着他正在检查检查器中的值而不是实际测量它 @DavidReeve 提供的代码或屏幕截图中没有任何内容表明测量方法。没有一个公共变量是计算的 旋转角度。如果该代码存在,则应包含它以及实际计算的角度,而不是像“似乎略微旋转”这样的定性测量,但我怀疑 OP 只关注了角度。 感谢您的回复,我想我应该制定得更好。正如@DavidReeve 建议的那样,我使用了检查器中的值。我不能使用转换,因为我使用此代码的应用程序需要使用向量,但我会研究一下。我现在实际上无法编写代码,但会在早上这样做,并更深入地解释我想要实现的目标。 在这里,我给了你 5 个代表。 +1 【参考方案1】:

您可以使用四元数轻松旋转方向矢量。

试试这个:

Vector3 RotateAroundOrigin(Vector3 startPos,float angle)

    startPos.Normalize();
    Quaternion rot = Quaternion.Euler(angle, 0.0f, 0.0f); // Rotate [angle] degrees about the x axis.
    startPos = rot * startPos;
    return startPos;

【讨论】:

我想没有必要startPos.Normalize();

以上是关于围绕世界原点旋转对象的主要内容,如果未能解决你的问题,请参考以下文章

动画 SVG 组对象 - 使用样式组件进行变换旋转不会围绕圆原点旋转

OpenGL围绕自身而不是原点(0,0,0)旋转对象(一组立方体)

如何使用 webgl 和 glMatrix 围绕世界轴旋转对象

围绕世界 0,0,0 而不是对象中心旋转

围绕世界轴OpenGL旋转对象

opengl旋转的对象不居中