Object 使用Mathf.Clamp()限制对象旋转的问题
我正在做一个在z轴上旋转物体的游戏。我需要将总旋转限制在80度。我尝试了下面的代码,但不起作用。minAngle=-40.0f和maxAngle=40.0fObject 使用Mathf.Clamp()限制对象旋转的问题,object,unity3d,rotation,clamp,Object,Unity3d,Rotation,Clamp,我正在做一个在z轴上旋转物体的游戏。我需要将总旋转限制在80度。我尝试了下面的代码,但不起作用。minAngle=-40.0f和maxAngle=40.0f Vector3 pos = transform.position; pos.z = Mathf.Clamp(pos.z, minAngle, maxAngle); transform.position = pos; 您发布的代码将夹紧z位置。您需要的是使用transform.rotation void ClampRotation(floa
Vector3 pos = transform.position;
pos.z = Mathf.Clamp(pos.z, minAngle, maxAngle);
transform.position = pos;
您发布的代码将夹紧z位置。您需要的是使用transform.rotation
void ClampRotation(float minAngle, float maxAngle, float clampAroundAngle = 0)
{
//clampAroundAngle is the angle you want the clamp to originate from
//For example a value of 90, with a min=-45 and max=45, will let the angle go 45 degrees away from 90
//Adjust to make 0 be right side up
clampAroundAngle += 180;
//Get the angle of the z axis and rotate it up side down
float z = transform.rotation.eulerAngles.z - clampAroundAngle;
z = WrapAngle(z);
//Move range to [-180, 180]
z -= 180;
//Clamp to desired range
z = Mathf.Clamp(z, minAngle, maxAngle);
//Move range back to [0, 360]
z += 180;
//Set the angle back to the transform and rotate it back to right side up
transform.rotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, z + clampAroundAngle);
}
//Make sure angle is within 0,360 range
float WrapAngle(float angle)
{
//If its negative rotate until its positive
while (angle < 0)
angle += 360;
//If its to positive rotate until within range
return Mathf.Repeat(angle, 360);
}
void ClampRotation(浮点数角、浮点数角、浮点数角=0)
{
//clampAroundAngle是希望夹钳源自的角度
//例如,值为90,最小值为-45,最大值为45,将使角度与90成45度角
//调整以使0右侧朝上
蛤蜊圈角+=180;
//获取z轴的角度,并将其上下旋转
float z=transform.rotation.eulerAngles.z-clampAroundAngle;
z=河豚(z);
//将范围移动到[-180,180]
z-=180;
//夹紧至所需范围
z=数学夹具(z,minAngle,maxAngle);
//将范围移回[0360]
z+=180;
//将角度设置回变换,并将其旋转回右侧向上
transform.rotation=Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y,z+clampAroundAngle);
}
//确保角度在0360范围内
浮动绞盘(浮动角度)
{
//如果它是负的,旋转直到它是正的
而(角度<0)
角度+=360;
//如果其为正旋转,直到在范围内
返回数学重复(角度360);
}
这是Imapler的nice解决方案的静态版本,它不改变角度本身,而是返回倾斜角度,因此可以与任何轴一起使用
public static float ClampAngle(
float currentValue,
float minAngle,
float maxAngle,
float clampAroundAngle = 0
) {
return Mathf.Clamp(
WrapAngle(currentValue - (clampAroundAngle + 180)) - 180,
minAngle,
maxAngle
) + 360 + clampAroundAngle;
}
public static float WrapAngle(float angle)
{
while (angle < 0) {
angle += 360;
}
return Mathf.Repeat(angle, 360);
}
谢谢你的这个方法。这几乎解决了我的问题!唯一的问题是,如果我允许旋转超过-50或50,旋转将冻结,不会对鼠标移动作出反应。我确保我遵守了这些限制,而且效果很好!谢谢你的帮助,天才!这个问题在网络上有很多答案,但除了这个,没有一个解决方案是有效的。明亮的
public static float ClampAngle(
float currentValue,
float minAngle,
float maxAngle,
float clampAroundAngle = 0
) {
float angle = currentValue - (clampAroundAngle + 180);
while (angle < 0) {
angle += 360;
}
angle = Mathf.Repeat(angle, 360);
return Mathf.Clamp(
angle - 180,
minAngle,
maxAngle
) + 360 + clampAroundAngle;
}
transform.localEulerAngles.x = YourMathf.ClampAngle(
transform.localEulerAngles.x,
minX,
maxX
);