如何限制球体内的transform.translate

时间:2019-05-08 15:47:22

标签: unity3d transform limit

我有一个名为Pointer的球体,可以通过transform.Translate()移动到任何地方 但是我希望这个球体只能在一个名为LimitSphere的半球体内运动,我不知道该怎么做。

我已经尝试使用Mathf.Clamp,但是正如您在此图像上看到的

但是当我设置一个内切正方形时,我失去了太多空间(黄色)
当我设置一个外接正方形时,圆上的空间太大(紫色/粉红色)

那么有什么解决方案可以限制球体内的运动吗?

编辑: 那是我的实际代码:

using UnityEngine;
using System.Collections;

public class TranslationClavier : MonoBehaviour {

    public float vitesse_translation = 1.0f;



    void Update () {
            if (Input.GetKey(KeyCode.DownArrow))
            {
                transform.Translate(Vector3.up * vitesse_translation * Time.deltaTime);
            }

            if (Input.GetKey(KeyCode.UpArrow))
            {
                transform.Translate(Vector3.down * vitesse_translation * Time.deltaTime);
            }

            if (Input.GetKey(KeyCode.RightArrow))
            {
                transform.Translate(Vector3.right * vitesse_translation * Time.deltaTime);
            }

            if (Input.GetKey(KeyCode.LeftArrow))
            {
                transform.Translate(Vector3.left * vitesse_translation * Time.deltaTime);
            }

            if (Input.GetKey(KeyCode.I))
            {
                transform.Translate(Vector3.forward * vitesse_translation * Time.deltaTime);
            }

            if (Input.GetKey(KeyCode.K))
            {
                transform.Translate(-Vector3.forward * vitesse_translation * Time.deltaTime);
            }
    }

}

在你的下方可以看到我的小球体,我想把她夹在大球体对撞器内

2 个答案:

答案 0 :(得分:0)

这很容易。 首先,您需要知道从球体中心到行进的距离,因此您需要分两个步骤进行操作。假设您是从作为球体父级的Transfrom调用它的,则可以这样做:

Vector3 newPosition=transform.localPosition+myDetla;
if (newPosition.magnitude>sphereRadius) transform.Translate(myDelta);

仅当目的地在球体内时才进行翻译。 无论您需要做什么其他条件(例如半球约束),您都可以分析新的newPosition。如果您想始终移动,但限制了移动网络的大小,则可以利用以下事实:可以将Vector分为方向和大小并重新组合,例如

if (newPosition.magnitude>sphereRadius)  
      newPosition=newPosition.direction*sphereRadius; //will clamp to sphere
if (newPosition.y<0) newPosition.y=0;
transform.localPosition=newPosition;

答案 1 :(得分:0)

我终于做到了

    // Get the new position for the object.
    Vector3 movement = new Vector3(Input.GetAxis("Vertical"), Input.GetAxis("VerticalJD"), Input.GetAxis("Horizontal")) * vitesse_translation;
    Vector3 newPos = transform.position + movement;

    // Calculate the distance of the new position from the center point. Keep the direction
    // the same but clamp the length to the specified radius.
    Vector3 offset = newPos - centerPt;
    transform.position = (centerPt + Vector3.ClampMagnitude(offset, radius));