Matrix 围绕世界原点旋转对象

Matrix 围绕世界原点旋转对象,matrix,vector,unity3d,rotation,Matrix,Vector,Unity3d,Rotation,我目前正在尝试绕世界x轴旋转一个位置向量(0,0,1),然后将其旋转回其原始位置(只是尝试使其工作)。我阅读了旋转矩阵,并使它工作(排序),但我现在相当卡住了 如图和代码所示,我在起点(0,0,1)处创建了一个立方体,并将其向下旋转30度。但顺时针旋转时,它的旋转角度似乎超过30度。但是,当我逆时针(30度)旋转它时,它确实旋转了适当的量。这导致它没有在它应该(0,0,1)的起点处结束 我想知道你们中是否有人能解释为什么会发生这种情况以及如何解决它。提前谢谢你们 public float

我目前正在尝试绕世界x轴旋转一个位置向量(0,0,1),然后将其旋转回其原始位置(只是尝试使其工作)。我阅读了旋转矩阵,并使它工作(排序),但我现在相当卡住了

如图和代码所示,我在起点(0,0,1)处创建了一个立方体,并将其向下旋转30度。但顺时针旋转时,它的旋转角度似乎超过30度。但是,当我逆时针(30度)旋转它时,它确实旋转了适当的量。这导致它没有在它应该(0,0,1)的起点处结束


我想知道你们中是否有人能解释为什么会发生这种情况以及如何解决它。提前谢谢你们

public float RotAngle=330f;
公共游戏对象立方体;
公开游戏对象原创;
公共游戏对象重定位器;
公开游戏对象初始回合;
无效开始()
{
Vector3 pixelPos=新的Vector3(0f,0f,1f);
原始=游戏对象。实例化(立方体、像素点、四元数.identity)作为游戏对象;
original.name=“original”;
initialTurn=GameObject.实例化(立方体、像素点、四元数.identity)为GameObject;
initialTurn.name=“initialTurn”;
重新定位器=游戏对象。实例化(立方体、像素点、四元数.identity)作为游戏对象;
relocator.name=“relocator”;
}
无效更新()
{
initialTurn.transform.position=旋转边界原点(原始.transform.position,旋转角度*Mathf.Deg2Rad);
relocator.transform.position=旋转原点(initialTurn.transform.position,(旋转角度*-1f)*数学Deg2Rad);
}
Vector3旋转边界原点(Vector3起始点、浮动角度)
{
startPos.Normalize();
startPos.y=(startPos.y*Mathf.Cos(角度))-(startPos.z*Mathf.Sin(角度));
startPos.z=(startPos.y*Mathf.Sin(角度))+(startPos.z*Mathf.Cos(角度));
返回startPos.normalized;

}
使用四元数可以非常轻松地旋转方向向量

试试这个:

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;
}

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