[英]How to Copy Transform.rotation over Network (byte[]) in unity?
[英]Edit or not the Transform.rotation in unity3D
在统一文档中,在Transform.rotation下写入:
请勿尝试编辑/修改旋转。
但是在该示例中,使用赋值之后的几行transform.rotation = ...
并且直接设置transform.rotation
似乎是日常实践。
但是可以推荐吗? 那么其他属性(例如localRotation
)又如何实现rotation
属性的设置器,以便也更改localRotation?
transform.rotation的成分不是角度,因此不能作为角度来处理。
正如robertbu在本文中提到的:
许多轮换(很可能是您尝试的轮换)可以通过其他(更简单的)方法来完成,包括'Transform.Roate()'和直接访问'Transform.eulerAngles'-。
Transform.Rotate()-Rotate()进行相对旋转,默认情况下进行局部旋转。
他们不编辑/修改旋转的意思是,旋转是一个统一的内置类,可以处理对象的旋转。 因此,可以像这样随意设置对象的旋转:
Transform.rotation = object.transform.rotation;
但是不建议修改内置的旋转类。
我觉得文档中关于此的措词曾经更加清晰,但这就是它的含义:
我们强烈劝阻编辑transform.rotation
直接对象。 也就是说执行诸如transform.rotation = new Quaternion(0, 100, 15, 1);
除非您真的了解使用四元数的来龙去脉,这要比使用EulerAngles更加困难,因为后者更加人性化和易于理解。
您应该使用的替代方法(这也反映在文档的代码示例中)是Unity提供的用于更改旋转方式的方法。 这些方法将为您解决因改变四元数值而带来的复杂性。
如果我们仔细看看Unity提供的代码示例:
Quaternion target = Quaternion.Euler(tiltAroundX, 0, tiltAroundZ);
transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);
这里的两个关键因素是target = Quaternion.Euler()
,它采用三个欧拉角(360度标度的角度)并将它们转换为四元数。 另一个是rotation = Quaternion.Slerp()
,它将当前旋转作为四元数,将目标旋转作为四元数并在两者之间进行插值。
请注意,这两个函数都没有从您的侧面“直接”改变transform.rotation
,但是它们都通过了Unity的内部逻辑以转换为适当的四元数。
像transform.Rotate
这样的方法也是如此。
transform.localRotation
基本上与transform.rotation
相同。 唯一的区别是,前者表示相对于父级的旋转,而后者表示相对于父级的旋转。
如果要直接编辑对象的旋转,最简单的方法是编辑对象的EulerAngles。 一个例子是:
transform.localEulerAngles = new Vector3(10, 150, 0);
相对于父对象,对象将绕X轴旋转10度,并沿Y轴旋转150度。 使用transform.eulerAngles
可以相对于世界旋转它。
请注意,尽管这是解决问题的最简单方法。 Unity确实鼓励使用Quaternions类及其函数来应用旋转,因为使用Euler角会导致发生怪异的效果。
该文档中还讨论了Unity中的旋转和方向 ,并指出(强调我的意思):
四元数可用于表示GameObject的方向或旋转。 该表示法内部包含四个数字(在Unity中称为x,y,z和w), 但是这些数字并不表示角度或轴,因此通常不需要直接访问它们 。 除非您对四元数的数学特别感兴趣,否则您只真正需要知道四元数表示3D空间中的旋转,并且通常不需要知道或修改x,y和z属性。
Unity使用四元数的原因尤其是,四元数不会受到万向节锁定的影响 ,而eulerAngles会遭受这种损害。 我引用这篇文章:
Unity将所有GameObject旋转内容内部存储为四元数,因为这样做的好处超过了限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.