在Unity的三维场景中,使用C#,我该如何对门的四元数表示的旋转角进行限制?

编程语言 2026-07-09

我一直在尝试做一个类似《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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章