我如何找到具有 Y 轴偏移的对象的中心以找到顶面上的中心?
How would i find the center of an object with a Y axis offset to find the center on the top face?
我正在尝试制作一个攀爬系统(玩家爬到立方体的顶部)。我正在使用 collider.bounds.center
来获取对象的中心,但是我需要做什么才能使中心位于对象的顶面上?
感谢您的帮助!
定义顶面;)
对于默认的立方体,它将是例如
theCube.transform.position + theCube.transform.up * theCube.transform.lossyScale.y / 2f
在立方体旋转的情况下,它总是采用“顶”面:
public class Example : MonoBehaviour
{
public Transform target;
private void Update()
{
transform.position = target.position + target.up * target.lossyScale.y / 2f;
}
}
如您所见,球体始终位于立方体顶面的中心(球体附有此脚本,立方体在 target
中引用)
编辑
如果您想根据命中的边找到顶面边缘的中心。
这有点复杂。这里的思路是:
- 获取顶面的四个角位置
- 得到离你的光线投射命中点距离最近的两个角
- 获取这条“边”的中心
类似
public class Example : MonoBehaviour
{
[SerializeField] private Transform target;
[SerializeField] private Renderer _renderer;
[SerializeField] private Camera _camera;
private void Start()
{
if (!_camera)
{
_camera = Camera.main;
}
if (!_renderer)
{
_renderer = GetComponent<Renderer>();
}
}
private void Update()
{
if (!target)
{
return;
}
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out var hit))
{
if (hit.collider is BoxCollider boxCollider)
{
var verts = GetCubeVertices(boxCollider);
// Find the two verts with smalles distance from the hit point
var sortedVerts = verts.OrderBy(v => Vector3.Distance(v, hit.point)).Take(2).ToArray();
// Find the center between these two verts
var targetPosition = (sortedVerts[0] + sortedVerts[1]) / 2f;
transform.position = targetPosition;
_renderer.enabled = true;
}
else
{
_renderer.enabled = false;
}
}
else
{
_renderer.enabled = false;
}
}
// Get the 4 vertices of the top cube face
private Vector3[] GetCubeVertices(BoxCollider col)
{
var trans = col.transform;
var min = col.center - col.size * 0.5f;
var max = col.center + col.size * 0.5f;
return new[]
{
trans.TransformPoint(new Vector3(min.x, max.y, min.z)),
trans.TransformPoint(new Vector3(min.x, max.y, max.z)),
trans.TransformPoint(new Vector3(max.x, max.y, min.z)),
trans.TransformPoint(new Vector3(max.x, max.y, max.z))
};
}
}
我正在尝试制作一个攀爬系统(玩家爬到立方体的顶部)。我正在使用 collider.bounds.center
来获取对象的中心,但是我需要做什么才能使中心位于对象的顶面上?
感谢您的帮助!
定义顶面;)
对于默认的立方体,它将是例如
theCube.transform.position + theCube.transform.up * theCube.transform.lossyScale.y / 2f
在立方体旋转的情况下,它总是采用“顶”面:
public class Example : MonoBehaviour
{
public Transform target;
private void Update()
{
transform.position = target.position + target.up * target.lossyScale.y / 2f;
}
}
如您所见,球体始终位于立方体顶面的中心(球体附有此脚本,立方体在 target
中引用)
编辑
如果您想根据命中的边找到顶面边缘的中心。
这有点复杂。这里的思路是:
- 获取顶面的四个角位置
- 得到离你的光线投射命中点距离最近的两个角
- 获取这条“边”的中心
类似
public class Example : MonoBehaviour
{
[SerializeField] private Transform target;
[SerializeField] private Renderer _renderer;
[SerializeField] private Camera _camera;
private void Start()
{
if (!_camera)
{
_camera = Camera.main;
}
if (!_renderer)
{
_renderer = GetComponent<Renderer>();
}
}
private void Update()
{
if (!target)
{
return;
}
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out var hit))
{
if (hit.collider is BoxCollider boxCollider)
{
var verts = GetCubeVertices(boxCollider);
// Find the two verts with smalles distance from the hit point
var sortedVerts = verts.OrderBy(v => Vector3.Distance(v, hit.point)).Take(2).ToArray();
// Find the center between these two verts
var targetPosition = (sortedVerts[0] + sortedVerts[1]) / 2f;
transform.position = targetPosition;
_renderer.enabled = true;
}
else
{
_renderer.enabled = false;
}
}
else
{
_renderer.enabled = false;
}
}
// Get the 4 vertices of the top cube face
private Vector3[] GetCubeVertices(BoxCollider col)
{
var trans = col.transform;
var min = col.center - col.size * 0.5f;
var max = col.center + col.size * 0.5f;
return new[]
{
trans.TransformPoint(new Vector3(min.x, max.y, min.z)),
trans.TransformPoint(new Vector3(min.x, max.y, max.z)),
trans.TransformPoint(new Vector3(max.x, max.y, min.z)),
trans.TransformPoint(new Vector3(max.x, max.y, max.z))
};
}
}