Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 统一:旋转轴中的游戏对象错误_Unity3d - Fatal编程技术网

Unity3d 统一:旋转轴中的游戏对象错误

Unity3d 统一:旋转轴中的游戏对象错误,unity3d,Unity3d,在上面的GIF中,我用鼠标上下移动飞机。观察当我在Z轴上旋转平面时,即使平面现在是侧向的,平面仍然会上下移动。那是我的错误。为什么会这样?我的代码有什么问题?我想我使用的是全局轴,而不是游戏对象轴。请问我该怎么修 x += Input.GetAxis("Mouse X") * xMouseSpeed * 0.02f; y -= Input.GetAxis("Mouse Y") * yMouseSpeed * 0.02f; if (Input.GetKey(KeyCode.Q)) { r

在上面的GIF中,我用鼠标上下移动飞机。观察当我在Z轴上旋转平面时,即使平面现在是侧向的,平面仍然会上下移动。那是我的错误。为什么会这样?我的代码有什么问题?我想我使用的是全局轴,而不是游戏对象轴。请问我该怎么修

x += Input.GetAxis("Mouse X") * xMouseSpeed * 0.02f;
y -= Input.GetAxis("Mouse Y") * yMouseSpeed * 0.02f;

if (Input.GetKey(KeyCode.Q))
{
    rotZ += Time.deltaTime * 50f;
}

if (Input.GetKey(KeyCode.E))
{
    rotZ -= Time.deltaTime * 50f;
}

Quaternion rotation = Quaternion.Euler(y, x, rotZ);

planeBodyToMove.localRotation = rotation;

发生的情况是,
localRotation
只是相对于父对象的旋转

相对于父对象的变换旋转的变换旋转

或者换句话说:
localRotation
不是对象本身的局部旋转,而是父对象的局部空间中的旋转(如果没有父对象,则为Unity世界空间)。这并不意味着您必须绕本地Y轴旋转。它在父对象的局部空间中应用旋转,顺序为
Z
X
Y
。。这就是为什么有时在旋转
Y
之前,您实际上不会注意到差异

正如您在这里看到的,同样的事情在没有代码的情况下也会发生,只需通过Inspector进行旋转

或者为了更好地演示它,让我们看看如果我们按照您实际希望的方式旋转它会发生什么:

正如您所看到的,一旦一个轴已经旋转,更改另一个轴将更改所有三个旋转值


解决方案 那么如何解决这个问题呢

通常我都懒得自己做
四元数
计算→我让
变换为我做这件事^^

不必将预期旋转存储在字段中,并通过将其转换为
四元数来每次应用它,您可以直接使用实际使用其自身局部轴旋转对象的:

//只是口味的问题,但我更喜欢
//属于一个结构而不是多个字段的值
公共矢量2鼠标灵敏度=矢量3.1;
私有void更新()
{
var xDif=Input.GetAxis(“鼠标X”)*mouseSensitivity.X;
var yDif=-Input.GetAxis(“Mouse Y”)*mouseSensitivity.Y;
var-zDif=0f;
if(Input.GetKey(KeyCode.Q))
{
zDif=Time.deltaTime*50f;
}
else if(Input.GetKey(KeyCode.E))
{
zDif=-Time.deltaTime*50f;
}
//默认情况下,可选空间参数不使用局部空间
planeBodyToMove.Rotate(新矢量3(xDif、yDif、zDif));
}
如您现在所见,每个旋转实际上应用于平面的局部轴:


发生的情况是,
localRotation
只是相对于父对象的旋转

相对于父对象的变换旋转的变换旋转

或者换句话说:
localRotation
不是对象本身的局部旋转,而是父对象的局部空间中的旋转(如果没有父对象,则为Unity世界空间)。这并不意味着您必须绕本地Y轴旋转。它在父对象的局部空间中应用旋转,顺序为
Z
X
Y
。。这就是为什么有时在旋转
Y
之前,您实际上不会注意到差异

正如您在这里看到的,同样的事情在没有代码的情况下也会发生,只需通过Inspector进行旋转

或者为了更好地演示它,让我们看看如果我们按照您实际希望的方式旋转它会发生什么:

正如您所看到的,一旦一个轴已经旋转,更改另一个轴将更改所有三个旋转值


解决方案 那么如何解决这个问题呢

通常我都懒得自己做
四元数
计算→我让
变换为我做这件事^^

不必将预期旋转存储在字段中,并通过将其转换为
四元数来每次应用它,您可以直接使用实际使用其自身局部轴旋转对象的:

//只是口味的问题,但我更喜欢
//属于一个结构而不是多个字段的值
公共矢量2鼠标灵敏度=矢量3.1;
私有void更新()
{
var xDif=Input.GetAxis(“鼠标X”)*mouseSensitivity.X;
var yDif=-Input.GetAxis(“Mouse Y”)*mouseSensitivity.Y;
var-zDif=0f;
if(Input.GetKey(KeyCode.Q))
{
zDif=Time.deltaTime*50f;
}
else if(Input.GetKey(KeyCode.E))
{
zDif=-Time.deltaTime*50f;
}
//默认情况下,可选空间参数不使用局部空间
planeBodyToMove.Rotate(新矢量3(xDif、yDif、zDif));
}
如您现在所见,每个旋转实际上应用于平面的局部轴:


我不太清楚为什么这不是你所期望的。请描述您期望使用此代码产生的结果。我不太确定为什么这不是您期望的结果。请描述你期望的结果与此代码。我爱你的GIF!伟大的answer@Ruzihm呵呵,谢谢,很高兴听到四元数大师这么说;)我喜欢你的礼物!伟大的answer@Ruzihm呵呵,谢谢,很高兴听到四元数大师这么说;)