首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在圆上建立等距离的位置?

如何在圆上建立等距离的位置?
EN

Stack Overflow用户
提问于 2021-09-27 20:46:05
回答 1查看 118关注 0票数 0

我正在编写一个应该代表循环网格的脚本。随着层距中心的距离的增加,各层中的物体数量成比例增加,因此每个瓷砖之间的距离应该保持不变。我试着通过旋转鼠标世界位置来计算每个瓷砖的近似值,但这本身就导致了一些问题,比如在鼠标到达之前,围绕着开始的角度抽搐,移动物体。这是一个完全不好的方法还是我遗漏了什么?以下是代码:

customGrid.cs

代码语言:javascript
复制
using UnityEngine;

public class customGrid : MonoBehaviour
{
    [SerializeField] private Camera mainCamera;
    [SerializeField] private LayerMask layerMask; // this is a simple LayerMask attached to a simple Plane object

    public GameObject structure;

    Vector3 truePos;
    public int maxLayers = 1;
    public int minLayers = 0;
    public float objectSize = 1.5f;

    public float radius = 0f;
    void LateUpdate()
    {
        Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out RaycastHit raycastHit, float.MaxValue, layerMask))
        {
            float angleRadian = Mathf.Atan2(raycastHit.point.x, raycastHit.point.z);
            float cursorDistanceFromOrigin = Vector3.Distance(Vector3.zero, new Vector3(raycastHit.point.x, 0, raycastHit.point.z));
            var circumference = 2 * Mathf.PI * radius;
            var quantization = 360 / (circumference / objectSize);

            float objectDistanceFromOrigin = Mathf.Floor(cursorDistanceFromOrigin / objectSize) * objectSize;

            var maxDistance = objectSize * maxLayers;
            var minDistance = objectSize * minLayers;

            objectDistanceFromOrigin = Mathf.Clamp(objectDistanceFromOrigin, minDistance, maxDistance);

            radius = objectDistanceFromOrigin;
            if (radius < 1) return;

            var degree = angleRadian * Mathf.Rad2Deg;
            degree = Mathf.Round(degree / quantization) * quantization;
            angleRadian = degree * Mathf.Deg2Rad;
            truePos.x = Mathf.Sin(angleRadian) * radius;
            truePos.y = 0;
            truePos.z = Mathf.Cos(angleRadian) * radius;

            RepositionObject();
        }
    }

    private void RepositionObject()
    {
        structure.transform.position = truePos;
        var dir = truePos - Vector3.zero;
        dir = Vector3.Normalize(dir);
        structure.transform.rotation = Quaternion.LookRotation(dir);
    }
}

我所期待的是这样一个网格:

EN

回答 1

Stack Overflow用户

发布于 2021-09-27 21:49:00

如果您希望瓷砖之间的距离保持不变,那么您需要从一组已知的倾斜物中选择。

最简单的工作是一个六角瓷砖。除非你有充分的理由不这么做,我建议你这么做。

但是https://en.wikipedia.org/wiki/Tessellation也包括其他的,比如https://en.wikipedia.org/wiki/Voderberg_tiling,它以你想要的方式旋转(代价是非常非矩形)。

如果你愿意放松距离规则,你可以很容易地在形状变化的地方产生很多倾斜。如果你使宽度1.0471975512倍的高度,并使你的“瓷砖”成圆形的部分,你将得到非常接近近似正方形,每一层比前一层多6个。你可以决定你怎么做。

请注意,除了常规的瓦片外,其他任何东西,如六角瓷砖,都会使做任何一种物理工作变得困难。随着游戏的发展,这将成为你的一个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69353072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档