Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 13.08.2019
Сообщений: 4

2D сетка из треугольников

23.08.2019, 17:58. Показов 2510. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как реализовать игровое поле состоящее из сетки из равносторонних треугольников? Игрок может с помощью стрелок перемещаться из текущей в соседнюю ячейку, если их грани совпадают (как на пикче). Пробовал сделать с помощью line renderer, но запутался с поиском центра новой ячейки при переходе. В сети нашел примеры только с квадратными ячейками. Может быть есть способ сделать это поэлегантнее?

Добавлено через 1 минуту
https://ibb.co/Vt1p9s1
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.08.2019, 17:58
Ответы с готовыми решениями:

Сетка из треугольников
Дан треугольник.Необходимо сделать сетку ,состоящую из данных треугольников, и отобразить это на графике.Т.е, как бы размножить треугольник...

Вычислить площади двух треугольников, и определить, какой из треугольников имеет большую площадь
Два треугольника заданные координатами своих вершин a, b, c. Вычислить площади треугольников, используя формулы Герона, и определить, какой...

В матрице С хранятся стороны 10-ти треугольников. В одномерный массив S записать площади треугольников, если
В матрице С хранятся стороны 10-ти треугольников. В одномерный массив S записать площади треугольников, если они существуют, и ноль- в...

2
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
23.08.2019, 22:40
Лучший ответ Сообщение было отмечено Nizier как решение

Решение

Цитата Сообщение от Nizier Посмотреть сообщение
Пробовал сделать с помощью line renderer, но запутался с поиском центра новой ячейки при переходе
А что, геометрию в школе уже не преподают?

Цитата Сообщение от Nizier Посмотреть сообщение
есть способ сделать это поэлегантнее?
Элегантно нелинейные пространства не получаются. Всегда есть гемор.

Цитата Сообщение от Nizier Посмотреть сообщение
Как реализовать игровое поле состоящее из сетки из равносторонних треугольников? Игрок может с помощью стрелок перемещаться из текущей в соседнюю ячейку, если их грани совпадают
Сначала пишем вспомогательный класс, который будет содержать математические вычисления:
TriangleGridHelper
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using UnityEngine;
 
class TriangleGridHelper
{
    // 1 / sqrt(3)
    public const float k = 1 / 1.732f;
 
    /// <summary>Logical coordiantes to World coordinates</summary>
    public static Vector3 LogicalToWorld(Vector2Int logicalCoord)
    {
        var x = logicalCoord.x / 2f;
        var z = (3f / 2f) * logicalCoord.y * k;
 
        if (IsReversedTriangle(logicalCoord))
            z += k / 2;
 
        return new Vector3(x, 0, z);
    }
 
    /// <summary>is triangle reversed?</summary>
    public static bool IsReversedTriangle(Vector2Int logicalCoord)
    {
        return (Mathf.Abs(logicalCoord.x) + Mathf.Abs(logicalCoord.y)) % 2 == 1;
    }
 
    /// <summary>Get points of triangle</summary>
    public static void GetTrianlgePoints(Vector2Int logicalCoord, out Vector3 P0, out Vector3 P1, out Vector3 P2)
    {
        var c = LogicalToWorld(logicalCoord);
        var p0 = c + new Vector3(-1 / 2f, 0, -k / 2);
        var p1 = c + new Vector3(0, 0, k);
        var p2 = c + new Vector3(+1 / 2f, 0, -k / 2);
        var p3 = c + new Vector3(-1 / 2f, 0, k / 2);
        var p5 = c + new Vector3(0, 0, -k);
        var p4 = c + new Vector3(+1 / 2f, 0, k / 2);
 
        if (IsReversedTriangle(logicalCoord))
        {
            P0 = p3;
            P1 = p4;
            P2 = p5;
        }
        else
        {
            P0 = p0;
            P1 = p1;
            P2 = p2;
        }
    }
}


Затем создаем скрипт, который будет рисовать сеточку через прямую отрисовку в OpenGL:
TriangleGridRenderer
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class TriangleGridRenderer : MonoBehaviour
{
    public int GridSize = 10;
    public float GridScale = 1f;
    public Color GridColor = Color.green;
 
    static Material lineMaterial;
    static void CreateLineMaterial()
    {
        if (!lineMaterial)
        {
            Shader shader = Shader.Find("Hidden/Internal-Colored");
            lineMaterial = new Material(shader);
            lineMaterial.hideFlags = HideFlags.HideAndDontSave;
            lineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
            lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
            lineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off);
            lineMaterial.SetInt("_ZWrite", 0);
        }
    }
 
    public void OnRenderObject()
    {
        CreateLineMaterial();
        lineMaterial.SetPass(0);
 
        GL.PushMatrix();
        GL.MultMatrix(transform.localToWorldMatrix * Matrix4x4.Scale(Vector3.one * GridScale));
 
        for (int y = -GridSize; y <= GridSize; y++)
        {
            for (int x = -GridSize; x <= GridSize; x++)
            {
                var logicalCoord = new Vector2Int(x, y);
                if (TriangleGridHelper.IsReversedTriangle(logicalCoord))
                    continue;
 
                var c = TriangleGridHelper.LogicalToWorld(logicalCoord);
                TriangleGridHelper.GetTrianlgePoints(new Vector2Int(x, y), out Vector3 p0, out Vector3 p1, out Vector3 p2);
 
                GL.Begin(GL.LINE_STRIP);
                GL.Color(GridColor);
                GL.Vertex3(p0.x, p0.y, p0.z);
                GL.Vertex3(p1.x, p1.y, p1.z);
                GL.Vertex3(p2.x, p2.y, p2.z);
                GL.Vertex3(p0.x, p0.y, p0.z);
 
                GL.End();
            }
        }
        GL.PopMatrix();
    }
}


Ну и пишем контроллер для игрока:
TriangleGridController
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class TriangleGridController : MonoBehaviour
{
    Vector2Int LogicalPos;
 
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
            if (TriangleGridHelper.IsReversedTriangle(LogicalPos))
                LogicalPos += new Vector2Int(0, 1);
            else
                LogicalPos += new Vector2Int(LogicalPos.x % 2 == 0 ? -1 : 1, 0);
        
 
        if (Input.GetKeyDown(KeyCode.S))
            if (TriangleGridHelper.IsReversedTriangle(LogicalPos))
                LogicalPos += new Vector2Int(LogicalPos.x % 2 == 0 ? -1 : 1, 0);
            else
                LogicalPos += new Vector2Int(0, -1);
 
        if (Input.GetKeyDown(KeyCode.A))
            LogicalPos += new Vector2Int(-1, 0);
 
        if (Input.GetKeyDown(KeyCode.D))
            LogicalPos += new Vector2Int(1, 0);
 
        var newPos = TriangleGridHelper.LogicalToWorld(LogicalPos);
        newPos.y = transform.position.y;
        transform.position = Vector3.MoveTowards(transform.position, newPos, 2 * Time.deltaTime);
    }
}


Результат:
Вложения
Тип файла: zip New Unity Project435.zip (579.2 Кб, 5 просмотров)
1
0 / 0 / 0
Регистрация: 13.08.2019
Сообщений: 4
23.08.2019, 22:49  [ТС]
Большое спасибо за такой развернутый ответ! Я в Unity и С# всего несколько недель, для меня OpenGL абсолютно новое название, а сам пытаясь это сделать, я в какие-то костыли дикие полез. Буду изучать, еще раз спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.08.2019, 22:49
Помогаю со студенческими работами здесь

Заданы координаты вершин трех треугольников.Определить сколько треугольников лежит внутри окружности
Заданы координаты вершин трех треугольников. Определить сколько треугольников лежит внутри окружности радиусом R с центром в начале...

Получить файл F2, в котором представлены координаты вершин треугольников и поле для треугольников разных типов
Задача: Написать программу, которая записывает координаты вершин треугольника, вводимых с клавиатуры, в файл F1. Из файла F1 получить файл...

Дано н прямоугольных треугольников с а и б катетами, причем а + б = 9. Составить программу, которая вычисляет суммарную площадь этих треугольников
Дано н прямоугольных треугольников с а и б катетами, причем а + б = 9. Составить программу, которая вычисляет суммарную площадь этих...

Даны длины отрезков. Подсчитать, сколько можно построить треугольников из этих отрезков, и напечатать площади этих треугольников
Даны длины отрезков a,b,c,d. Подсчитать, сколько можно построить треугольников из этих отрезков, и напечатать площади этих треугольников....

Сетка
Здравствуйте! Прошу помощи в таком вопросе: каким образом можно реализовать генерацию и последующие хранение сетки, изображенной на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru