unity3d - 如何限制transform.translate在球体内
问题描述
我有一个名为 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);
}
}
}
下面你可以看到我的小球体,我想把她夹在大球体对撞机里
解决方案
这很容易。首先,您需要知道从球体中心出发的距离,因此您需要分两步完成。假设您从一个父级到一个球体的转换中调用它,您可以执行以下操作:
Vector3 newPosition=transform.localPosition+myDetla;
if (newPosition.magnitude>sphereRadius) transform.Translate(myDelta);
如果目的地在球内,这只会进行翻译。无论您需要做什么其他条件(例如半球约束) - 您都可以分析新的 newPosition。如果您想始终移动,但限制 movemnet 的幅度,则可以使用可以将向量拆分为方向和幅度并重新组合它们的事实,例如
if (newPosition.magnitude>sphereRadius)
newPosition=newPosition.direction*sphereRadius; //will clamp to sphere
if (newPosition.y<0) newPosition.y=0;
transform.localPosition=newPosition;
推荐阅读
- python-3.x - 带有多个 PDF 的 Vader Sentiment
- javascript - 无法捕获 Ionic 1 应用程序上未处理的错误
- html - 在没有组件Angular2 +的模板html中使用局部变量
- asp.net-mvc - 外部网站上的 Openid Connect 单点登录
- python - 在 sqlite3 数据库错误中插入日期时间
- jquery - 如何将引导模式设置为确认对话框?
- python - python3 arp-scan和mac解析
- python-2.7 - 如何获得 Many2one 字段取决于 Many2many 字段?
- javascript - 如何使用过滤器过滤对象数组中的数组?
- ssh - 如何修复监听端口 80 的远程端口转发失败