Как ограничить transform.translate внутри сферы - PullRequest
0 голосов
/ 08 мая 2019

У меня есть сфера с именем 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);
            }
    }

}

ниже вы можете увидеть мою маленькую сферу, и я хочу зажать ее внутри большого коллайдерного шара

1 Ответ

0 голосов
/ 08 мая 2019

Это очень просто. Сначала вам нужно узнать расстояние, которое вы собираетесь пройти, от центра сферы, так что вы делаете это в два шага. Предполагая, что вы вызываете его из трансфера, который относится к сфере, вы можете сделать:

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

Перевод будет выполняться только в том случае, если пункт назначения находится внутри сферы. Какие бы другие условия (например, ограничение полусферы) вы не выполняли - вы можете анализировать новую новую позицию. Если вы хотите всегда перемещать, но ограничивать величину Movemnet, вы можете использовать тот факт, что вы можете разбить Векторы на направление и величину и собрать их, например,

if (newPosition.magnitude>sphereRadius)  
      newPosition=newPosition.direction*sphereRadius; //will clamp to sphere
if (newPosition.y<0) newPosition.y=0;
transform.localPosition=newPosition;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...