C# Unity3D调整立方体“;“结束旋转”;在右(x或z)轴上
我是Unity3D脚本的新手,尤其是当涉及到变换、四元数、矢量3的细节时。 下面有一个脚本。当我滚动立方体时,它会朝正确的方向翻转。但是,当立方体的局部轴与世界轴不匹配时,立方体的C# Unity3D调整立方体“;“结束旋转”;在右(x或z)轴上,c#,unity3d,quaternions,C#,Unity3d,Quaternions,我是Unity3D脚本的新手,尤其是当涉及到变换、四元数、矢量3的细节时。 下面有一个脚本。当我滚动立方体时,它会朝正确的方向翻转。但是,当立方体的局部轴与世界轴不匹配时,立方体的endRotation将在错误的轴上执行。 有人能帮我解决这个问题吗?:“endRotation”将在右轴上翻转立方体,而不管本地轴和世界轴之间的关系如何。 我花了一周的时间试图解决这个问题。当然没有成功。 下面是代码和视频 if (Input.GetAxis("Horizontal")
endRotation
将在错误的轴上执行。
有人能帮我解决这个问题吗?:“endRotation”将在右轴上翻转立方体,而不管本地轴和世界轴之间的关系如何。
我花了一周的时间试图解决这个问题。当然没有成功。
下面是代码和视频
if (Input.GetAxis("Horizontal") > buttonDown)
{
StartCoroutine(FlipTheCube(Vector3.right));
return
}...
。
.
public IEnumerator翻转立方体(矢量3方向)
{
startFliping=false;
浮动rollStartTime=0;
浮动辊倾角=90;
float halfWidth=transform.localScale.z/2;
Vector3 pointAround=transform.position+(Vector3.down*半宽)+(方向*半宽);
Vector3 rollAxis=Vector3.交叉(Vector3.向上,方向);
四元数旋转=transform.rotation;
四元数**结束旋转**=旋转*四元数.Euler(滚动轴*滚动角度);
Vector3 endPlacement=变换位置+方向;
浮动角度=0;
while(rollStartTime
我建议您使用DoTween资产():
DORotate(矢量3到,浮动持续时间)代码>
使用tweeners将为您节省大量时间编写自己的动画。您的问题在于以下几行:
Vector3 rollAxis=Vector3.Cross(Vector3.up,方向);
四元数旋转=transform.rotation;
四元数endRotation=旋转*四元数.Euler(滚动轴*滚动角度);
// ...
transform.RotateAround(点环绕、旋转轴、旋转穿过);
第一个问题是Euler与角度/轴的使用。
如果你只是对着Vector3.right
,Vector3.forward
,以及它们的负片旋转,你可能还没有注意到这一点
在第一部分中,使用滚动轴
作为Euler角度表示,在第二部分中使用轴
问题是,对于旋转,其轴通常与该旋转的Euler表示形式不同!例如,通过围绕(0.7,0.0,0.7)旋转90°进行的旋转与欧拉旋转(63°、0°、63°)完全不同
相反,只需一致使用rollAxis
作为角度/轴表示。您可以使用获取四元数形式
第二个问题是全局旋转和局部旋转。
这是一个你肯定已经注意到的问题
在第一部分中,将应用rollAxis
作为局部旋转。这是因为rollAxis
是*
运算符的第二项
在第二部分中,RotateAround
围绕由rollAxis
定义的全局轴旋转
无论是全球还是本地。全局更简单,这似乎是您正在尝试做的(从transform.position+direction
判断),因此您应该将rotation
作为*
操作符的第二项
总之,只要更改Quaternion endRotation=rotation*Quaternion.Euler(rollAxis*rollAngle),就可以解决这些问题代码>行:
Vector3 rollAxis=Vector3.Cross(Vector3.up,方向);
四元数旋转=transform.rotation;
四元数endRotation=四元数角度轴(rollAngle,rollAxis)*旋转;
// ...
transform.RotateAround(点环绕、旋转轴、旋转穿过);
有关四元数*
运算符的更多信息。Asker询问如何获取将用作to
参数的四元数。所以很不幸,这个答案并没有真正的帮助。谢谢你,只是我没有那么丰富的经验。不管多大,谢谢你…谢谢你发布关于*运营商的参考链接
public IEnumerator FlipTheCube(Vector3 direction)
{
startFliping = false;
float rollStartTime = 0;
float rollAngle = 90;
float halfWidth = transform.localScale.z / 2;
Vector3 pointAround = transform.position + (Vector3.down * halfWidth) + (direction * halfWidth);
Vector3 rollAxis = Vector3.Cross(Vector3.up, direction);
Quaternion rotation = transform.rotation;
Quaternion **endRotation** = rotation * Quaternion.Euler(rollAxis * rollAngle);
Vector3 endPlacement = transform.position + direction;
float oldAngle = 0;
while (rollStartTime < rollDurtnTime)
{
yield return new WaitForEndOfFrame();
rollStartTime += Time.deltaTime;
float newAngle = (rollStartTime / rollDurtnTime) * rollAngle;
float rotateThrough = newAngle - oldAngle;
oldAngle = newAngle;
transform.RotateAround(pointAround, rollAxis, rotateThrough);
}
transform.position = endPlacement;
transform.rotation = **endRotation**;
startFliping = true;
}