Unity3D 仅在 x 和 z 轴上旋转时如何防止 "Tilt"?
Unity3D How to Prevent "Tilt" when rotating on x and z axis only?
(这是3d的。附上屏幕截图以供参考。)
我在这里或其他地方阅读了很多关于与我类似的问题的文章,但没有任何解决办法。我的手枪指向前方,我只在 x 和 z 轴(上、下、左、右)上旋转,但我的手枪总是向左或向右倾斜。我尝试了这样的解决方案 (Problems limiting object rotation with Mathf.Clamp())(用 x 代替 y)但我的枪最终冻结或处于奇怪的位置。我想我在这里遗漏了一个基本概念。
我还应该提到,向左、向右、向上向下旋转它们自己确实可以正常工作,但是当将它们组合在一起时,事情就会出错。例如:左旋转 > 然后向上旋转 > 然后左旋转然后我最终在标题位置
你可以在图片中看到我在左下角的控件只允许用户向上、向下和向右移动枪——但不知何故枪最终倾斜了,在这个屏幕截图中向右--- 我想防止向右或向左倾斜。
public void Update()
{
if (mButtonHeld) {
switch(mCurBtnName){
case "ButtonUp":
mPistol.transform.Rotate (PISTOL_INCREMENT, 0, 0);
break;
case "ButtonDown":
mPistol.transform.Rotate (-PISTOL_INCREMENT, 0, 0);
break;
case "ButtonLeft":
mPistol.transform.Rotate(0,0,-PISTOL_INCREMENT_LR);
break;
case "ButtonRight":
mPistol.transform.Rotate(0,0,PISTOL_INCREMENT_LR);
break;
}
//How can I lock y axis here??
}
}
将旋转应用于不同的轴是不可交换的;顺序很重要,这可能是导致您出现问题的原因。一个简单的解决方法是做类似的事情:
public void Start()
{
(...)
m_VectorPistolInitState = mPistol.transform.rotation;
}
public void Update()
{
static float azimuth = 0;
static float elevation = 0;
if (mButtonHeld) {
switch(mCurBtnName){
case "ButtonUp":
elevation += PISTOL_INCREMENT;
break;
case "ButtonDown":
elevation -= PISTOL_INCREMENT;
break;
case "ButtonLeft":
azimuth -= PISTOL_INCREMENT_LR;
break;
case "ButtonRight":
azimuth += PISTOL_INCREMENT_LR;
break;
}
mPistol.transform.rotation = m_VectorPistolInitState;
mPistol.transform.Rotate(elevation,0,azimuth);
}
}
(这是3d的。附上屏幕截图以供参考。)
我在这里或其他地方阅读了很多关于与我类似的问题的文章,但没有任何解决办法。我的手枪指向前方,我只在 x 和 z 轴(上、下、左、右)上旋转,但我的手枪总是向左或向右倾斜。我尝试了这样的解决方案 (Problems limiting object rotation with Mathf.Clamp())(用 x 代替 y)但我的枪最终冻结或处于奇怪的位置。我想我在这里遗漏了一个基本概念。
我还应该提到,向左、向右、向上向下旋转它们自己确实可以正常工作,但是当将它们组合在一起时,事情就会出错。例如:左旋转 > 然后向上旋转 > 然后左旋转然后我最终在标题位置
你可以在图片中看到我在左下角的控件只允许用户向上、向下和向右移动枪——但不知何故枪最终倾斜了,在这个屏幕截图中向右--- 我想防止向右或向左倾斜。
public void Update()
{
if (mButtonHeld) {
switch(mCurBtnName){
case "ButtonUp":
mPistol.transform.Rotate (PISTOL_INCREMENT, 0, 0);
break;
case "ButtonDown":
mPistol.transform.Rotate (-PISTOL_INCREMENT, 0, 0);
break;
case "ButtonLeft":
mPistol.transform.Rotate(0,0,-PISTOL_INCREMENT_LR);
break;
case "ButtonRight":
mPistol.transform.Rotate(0,0,PISTOL_INCREMENT_LR);
break;
}
//How can I lock y axis here??
}
}
将旋转应用于不同的轴是不可交换的;顺序很重要,这可能是导致您出现问题的原因。一个简单的解决方法是做类似的事情:
public void Start()
{
(...)
m_VectorPistolInitState = mPistol.transform.rotation;
}
public void Update()
{
static float azimuth = 0;
static float elevation = 0;
if (mButtonHeld) {
switch(mCurBtnName){
case "ButtonUp":
elevation += PISTOL_INCREMENT;
break;
case "ButtonDown":
elevation -= PISTOL_INCREMENT;
break;
case "ButtonLeft":
azimuth -= PISTOL_INCREMENT_LR;
break;
case "ButtonRight":
azimuth += PISTOL_INCREMENT_LR;
break;
}
mPistol.transform.rotation = m_VectorPistolInitState;
mPistol.transform.Rotate(elevation,0,azimuth);
}
}