如何将 transform.translate 限制在一个球体内
How to limit transform.translate inside a sphere
我有一个名为 Pointer 的球体,它可以随 transform.Translate() 移动到任何地方
但是我想让这个球体只能在一个名为LimitSphere的半球体内移动,我不知道该怎么做。
我已经尝试使用 Mathf.Clamp 但正如您在这张图片上看到的
但是当我设置一个内切方块时我松了太多space(黄色)
当我设置一个外接正方形时,圆圈外有太多 space (purple/pink)
那么有什么解决方案可以限制球内的移动吗?
编辑:
那是我的实际代码:
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);
}
}
}
下面你可以看到我的小球体,我想把她夹在大球体对撞机里面
这很容易。
首先,您需要知道距离球心的距离,因此您可以分两步完成。假设您是从一个以球体为父级的 transfrom 调用它,您可以这样做:
Vector3 newPosition=transform.localPosition+myDetla;
if (newPosition.magnitude>sphereRadius) transform.Translate(myDelta);
这只会在目的地在球体内时进行平移。
无论您需要做什么其他条件(如半球约束),您都可以分析新的 newPosition。如果你想一直移动,但要限制 movemnet 的大小,你可以使用这样一个事实,你可以将 Vectors 拆分为方向和大小并重新组合它们,例如
if (newPosition.magnitude>sphereRadius)
newPosition=newPosition.direction*sphereRadius; //will clamp to sphere
if (newPosition.y<0) newPosition.y=0;
transform.localPosition=newPosition;
我终于做到了
// 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));
我有一个名为 Pointer 的球体,它可以随 transform.Translate() 移动到任何地方 但是我想让这个球体只能在一个名为LimitSphere的半球体内移动,我不知道该怎么做。
我已经尝试使用 Mathf.Clamp 但正如您在这张图片上看到的
但是当我设置一个内切方块时我松了太多space(黄色)
当我设置一个外接正方形时,圆圈外有太多 space (purple/pink)
那么有什么解决方案可以限制球内的移动吗?
编辑: 那是我的实际代码:
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);
}
}
}
下面你可以看到我的小球体,我想把她夹在大球体对撞机里面
这很容易。 首先,您需要知道距离球心的距离,因此您可以分两步完成。假设您是从一个以球体为父级的 transfrom 调用它,您可以这样做:
Vector3 newPosition=transform.localPosition+myDetla;
if (newPosition.magnitude>sphereRadius) transform.Translate(myDelta);
这只会在目的地在球体内时进行平移。 无论您需要做什么其他条件(如半球约束),您都可以分析新的 newPosition。如果你想一直移动,但要限制 movemnet 的大小,你可以使用这样一个事实,你可以将 Vectors 拆分为方向和大小并重新组合它们,例如
if (newPosition.magnitude>sphereRadius)
newPosition=newPosition.direction*sphereRadius; //will clamp to sphere
if (newPosition.y<0) newPosition.y=0;
transform.localPosition=newPosition;
我终于做到了
// 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));