在Unity的三维场景中,使用C#,我该如何对门的四元数表示的旋转角进行限制?
我一直在尝试做一个类似《Phasmophobia》风格的门,通过点击并拖动门把来移动门。我已经实现了这一点,通过让铰链朝向门对端的目标旋转,而玩家可以把它当作门把手来抓取。
目标会重置回它在门上的现实位置。我希望门在达到由一个变量决定的角度后停止跟随这个目标,以防止 这个。
问题在于我做目标定位的方式使用了一个“Quaternion.LookRotation”,我似乎找不到一种方法,用欧拉角的角度变量来限制这个看向旋转能走多远。坦白说,这主要是因为我的编程经验不足。
private void Update()
{
DoorVector = transform.position;
TargetVector = DoorTarget.transform.position;
DoorX = DoorVector.x;
DoorZ = DoorVector.z;
TargetX = TargetVector.x;
TargetZ = TargetVector.z;
DoorRotation = Quaternion.LookRotation(new Vector3(TargetX, 0, TargetZ) - new Vector3(DoorX, 0, DoorZ));
spd = Mathf.Min (DoorSpeed * Time.deltaTime);
transform.rotation = Quaternion.Lerp (transform.rotation , DoorRotation, spd);
}
} private void Update()
{
DoorVector = transform.position;
TargetVector = DoorTarget.transform.position;
DoorX = DoorVector.x;
DoorZ = DoorVector.z;
TargetX = TargetVector.x;
TargetZ = TargetVector.z;
DoorRotation = Quaternion.LookRotation(new Vector3(TargetX, 0, TargetZ) - new Vector3(DoorX, 0, DoorZ));
//Psuedo Code: if(MaxAngle<eulerAngle<Min Angle) {run code below}
spd = Mathf.Min (DoorSpeed * Time.deltaTime);
transform.rotation = Quaternion.Lerp (transform.rotation , DoorRotation, spd);
}
}
解决方案
不使用LookRotation,你可以改为先对向量进行归一化,只计算它们的 Vector3.SignedAngle。
然后——既然门是围绕一个已知的固定铰链旋转(基于你的向量我将把Vector3.up视作轴)——你可以只对这个角度进行限幅,然后改用 Quaternion.AngleAxis 来实现
DoorVector = transform.position;
TargetVector = DoorTarget.transform.position;
DoorVector.y = 0;
TargetVector.y = 0;
// Note that in general this will be the angle around the world origin 0,0,0
// if you needed this relative to a third point (hinge)
// you'd in general for both rather use e.g. transform.position - hingePoint
var angle = Vector3.SignedAngle(DoorVector, TargetVector, Vector3.up);
var clampedAngle = Mathf.Clamp(angle, MIN_ANGLE, MAX_ANGLE);
DoorRotation = Quaternion.AngleAxis(clampedAngle, Vector3.up);
不过你在最终需要添加一个90°旋转的情况时要注意,因为到目前为止你的门似乎使用了Z(前进)轴(因此朝向左/右),你可能需要加一个偏移量
clampedAngle += 90;
后者也可以用于各种旋转门,只要它们不使用 localRotation。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。