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

У меня есть сфера с именем Pointer, которая может перемещаться везде с помощью transform.Translate(). но я хочу, чтобы эта сфера могла двигаться только внутри полусферы с именем LimitSphere, я не знаю, как это сделать.

я уже пытался использовать Mathf.Clamp, но, как вы можете видеть на этом изображении Как ограничить transform.translate внутри сферы

но когда я ставлю вписанный квадрат, я теряю слишком много места (желтый)
и когда я устанавливаю описанный квадрат, слишком много места вне круга (фиолетовый/розовый)

Так есть ли решение ограничить движение внутри сферы?

РЕДАКТИРОВАТЬ : Это мой реальный код:

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);
            }
    }

}

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
277
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Это сделает перевод только в том случае, если пункт назначения находится внутри сферы. Какие бы другие условия (например, ограничение полусферы) вам не понадобились — вы можете проанализировать newnewPosition. Если вы хотите всегда двигаться, но ограничиваете величину движения, вы можете использовать тот факт, что вы можете разделить векторы на направление и величину и собрать их заново, например

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

спасибо за ваш ответ, но я новичок в Unity и не уверен, что хорошо понимаю, как применить ваш код к моему

Rombond 08.05.2019 21:20

что такое «мояДельта»?

Rombond 08.05.2019 23:20

myDelta должны быть присвоены значения в зависимости от кодов клавиш, т.е. Vector3.left * vitesse_translation * Time.deltaTime, сохраните его во временной переменной перед переводом

zambari 09.05.2019 11:18

не могли бы вы привести пример того, как применить ваш код на моем

Rombond 09.05.2019 12:36

заменить каждый transform.Translate(Vector3.forward * vitesse_translation * Time.deltaTime); с myDelta=Vector3.forward * vitesse_translation *Time.deltaTime (объявите его ранее как Vector3 myDelta=Vector3.zero), затем вставьте мой код

zambari 09.05.2019 12:37

это не работает, моя подвижная сфера никогда не останавливается, даже если я отпускаю ввод

Rombond 09.05.2019 13:02

я обнаружил, что answer.unity.com/questions/1309521/… это именно то, что я хочу

Rombond 09.05.2019 13:37
Ответ принят как подходящий

я наконец сделал это

    // 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));

Другие вопросы по теме