Unity C#如何检测一个物体的旋转是否处于另一物体的相近旋转范围内
问题原因
- 错误使用四元数分量:
transform.rotation是四元数类型,它的x/y/z/w分量取值范围都是[-1, 1],不是你认知里的欧拉角旋转度数,直接和90做比较完全没有意义。 - 条件逻辑矛盾:你写的判断要求数值同时大于
参考值+90且小于参考值-90,这个条件在数学上永远不可能成立,所以代码实际每次都走else分支,如果你总是拿到bullet1,说明你实际代码里的分支赋值大概率写反了。
通用旋转相近判断实现
Unity提供了现成的API计算两个旋转的夹角,直接用即可满足需求:
// 阈值可根据需求调整,小于该角度判定为旋转相近 float rotateThreshold = 90f; float angleDiff = Quaternion.Angle(hand1.transform.rotation, hand2.transform.rotation); if (angleDiff < rotateThreshold) { bulletresult = bullet1; } else { bulletresult = bullet2; }
仅需判断单轴(如Y轴)旋转差的实现
如果你的需求只需要对比绕Y轴的旋转角度差异,要先取欧拉角Y值,再处理角度0-360度的循环边界问题:
float y1 = hand1.transform.eulerAngles.y; float y2 = hand2.transform.eulerAngles.y; // 计算归一化的Y轴角度差,自动处理350度和10度差20度这类边界场景 float yDiff = Mathf.Abs(Mathf.DeltaAngle(y1, y2)); if (yDiff < 90f) { bulletresult = bullet1; } else { bulletresult = bullet2; }
内容的提问来源于stack exchange,提问作者Liam Martinez
相关产品推荐
相关产品推荐

