首页 > 解决方案 > 从随机点获取球体表面上的点

问题描述

我正在使用 Unity 创建游戏,但遇到了数学问题。我有一个半径为 10 且中心为 (0, 0, 0) 的球体。我希望相机在那个球体周围移动,但我找不到任何方法来做我想做的事。我在 X 轴和 Y 轴上移动相机(因此在球体之外得到一个点),我想设置它的 Z 轴,这样相机就会回到球体上,我使用这个等式:r^2 = x^2 + y^2 + z^2 => z^2 = r^2 - x^2 - y^2 但它不起作用......请帮助我

编辑

这是我的代码(在 c# 中):

    private void OnMouseDrag()
{
    var newX = mainCameraTransform.position.x + Input.GetAxis("Mouse X");
    var newY = mainCameraTransform.position.y + Input.GetAxis("Mouse Y");
    var maxDistance = 10.0f;
    newX = Mathf.Clamp(newX, -maxDistance * 0.85f, maxDistance * 0.85f);
    newY = Mathf.Clamp(newY, 1.0f * 0.85f, maxDistance * 0.85f);
    var newZ = Mathf.Sqrt(Mathf.Abs(maxDistance * maxDistance - newX * newX - newY * newY));

    mainCameraTransform.position = new Vector3(newX, newY, newZ);
    mainCameraTransform.LookAt(Vector3.zero);
}

正如你所看到的,我使用 Clamp 来保持 X 和 Y 小于半径,但它没有帮助......</p>

标签: unity3dmathgeometry

解决方案


您必须通过圆形边框限制 2D 坐标

len = Mathf.Sqrt(newX * newX + newY * newY);
//perhaps you have Len or Hypot function in your Math library

if len > maxDistance then
     newX = maxDistance * newX / len
     newY = maxDistance * newY / len;

推荐阅读