1 Вопрос: Как ограничить transform.translate внутри сферы

вопрос создан в Wed, May 8, 2019 12:00 AM

У меня есть сфера с именем 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
1 ответ                              1                         

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

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;
    
0
2019-05-08 16: 27: 13Z
  1. спасибо за ваш ответ, но я новичок в Unity и не уверен, что хорошо понимаю, как применить ваш код к моему
    2019-05-08 19: 20: 34Z
  2. что такое myDelta?
    2019-05-08 21:20:39Z
  3. myDelta должны быть присвоены значения в зависимости от кодов клавиш, т.е. Vector3.left * vitesse_translation * Time.deltaTime, сохраните его во временной переменной перед тем, как переводить
    2019-05-09 09: 18: 28Z
  4. хорошо ... теперь я полностью потерян с вашим ответом: '0
    2019-05-09 10: 33: 04Z
  5. не могли бы вы дать мне пример того, как применить ваш код к моему
    2019-05-09 10: 36: 56Z
источник размещен Вот