Как проверить, находится ли точка внутри 3d-формы - PullRequest
0 голосов
/ 29 апреля 2020

Так что это странно.

Я работаю над игрой, похожей на Minecraft, но вместо кубов она делается с усеченными октаэдрами "Смотри картинку ниже" . Чтобы разместить или разбить блок, мне нужно получить координату, куда смотрит игрок, и выяснить, в каком блоке он находится. Я не отслеживаю лучи, я проверяю с интервалами перед игроком, пока он не пересекается с чем-то. Я могу проверить положение, когда он пересекается, и точки до того, как он пересекается.

Эти вещи (псевдоним: Mecon)

Mecon Проблема в том, что они не твердые тела. И точка не может получить доступ к тому, через что она пересекается, просто она что-то пересекла Эти фигуры заполняют область на 100% без отверстий и могут иметь координаты (четные, четные, четные) или (нечетные, нечетные, нечетные)

(пример: [2, 2, 2] [ 3, 3, 3] [6, 14, 2] [13, 19, 7])

НИКОГДА не будет мекона в точке с координатами [2, 13, 6] или [23, 14, 8] поскольку все значения не являются либо четными, либо нечетными

Вот все координаты для рисования мекона с вершинами

    //Top Face
    new Vector3(0.25f, 1.0f, 0.0f),
    new Vector3(0.0f, 1.0f, -0.25f),
    new Vector3(-0.25f, 1.0f, 0.0f),
    new Vector3(0.0f, 1.0f, .25f),

    //Right Face
    new Vector3(0.0f, 0.75f, 0.5f),
    new Vector3(-0.25f, 0.5f, 0.5f),
    new Vector3(0.0f, 0.25f, 0.5f),
    new Vector3(0.25f, 0.5f, 0.5f),

    //Back Face
    new Vector3(0.5f, 0.5f, 0.25f),
    new Vector3(0.5f, 0.75f, 0.0f),
    new Vector3(0.5f, 0.5f, -0.25f),
    new Vector3(0.5f, 0.25f, 0.0f),

    //Bottom Face
    new Vector3(0.25f, 0.0f, 0.0f),
    new Vector3(0.0f, 0.0f, 0.25f),
    new Vector3(-0.25f, 0.0f, 0.0f),
    new Vector3(0.0f, 0.0f, -0.25f),

    //Left Face
    new Vector3(0.0f, 0.25f, -0.5f),
    new Vector3(0.25f, 0.5f, -0.5f),
    new Vector3(0.0f, 0.75f, -0.5f),
    new Vector3(-0.25f, 0.5f, -0.5f),

    //Front Face
    new Vector3(-0.5f, 0.5f, -0.25f),
    new Vector3(-0.5f, 0.75f, 0.0f),
    new Vector3(-0.5f, 0.5f, 0.25f),
    new Vector3(-0.5f, 0.25f, 0.0f)

Есть ли способ получить любую декартову координату и получить координата мекона. Поэтому, если я возьму координаты (11.878, 13.415, 4.383), получится возврат (12, 12, 4). Координата мекона находится у основания мекона. (Так что центр мекона в (0, 0, 0) будет в (0, 1, 0), мне просто нужна координата в основании)

Если что-то сбивает с толку, я уверен, что это все, я постараюсь ответить на любые другие вопросы, которые у вас есть, ребята.

Спасибо!

ОБНОВЛЕНИЕ: Теперь я работаю над единичным меконом с интервалами .5 Y (0, .5, 1, 1,5 и 2)

    if (this.transform.position.y == 0f)
        if (Mathf.Abs(this.transform.position.x) + Mathf.Abs(this.transform.position.z) <= .5f)
            Debug.Log("Inside");
        else
            Debug.Log("Outside");


    else if (this.transform.position.y == .5f)
        if (Mathf.Abs(this.transform.position.x) + Mathf.Abs(this.transform.position.z) <= 1f)
            Debug.Log("Inside");
        else
            Debug.Log("Outside");


    else if (this.transform.position.y == 1f)
        if ((Mathf.Abs(this.transform.position.z) < 1f && Mathf.Abs(this.transform.position.x) < .5f) || 
            (Mathf.Abs(this.transform.position.x) < 1f && Mathf.Abs(this.transform.position.z) < .5f) ||
            (Mathf.Abs(this.transform.position.z) > .5f && Mathf.Abs(this.transform.position.z) > .5f && Mathf.Abs(this.transform.position.z) + Mathf.Abs(this.transform.position.x) < 1.5f))
            Debug.Log("Inside");
        else
            Debug.Log("Outside");


    else if (this.transform.position.y == 1.5f)
        if (Mathf.Abs(this.transform.position.x) + Mathf.Abs(this.transform.position.z) <= 1f)
            Debug.Log("Inside");
        else
            Debug.Log("Outside");


    else if (this.transform.position.y == 2f)
        if (Mathf.Abs(this.transform.position.x) + Mathf.Abs(this.transform.position.z) <= .5f)
            Debug.Log("Inside");
        else
            Debug.Log("Outside");
...