Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/56: Рейтинг темы: голосов - 56, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 8

Трехмерная графика

30.10.2019, 23:37. Показов 13085. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как понятно из названия хочется с помощью языков этих в ручную написать 3 мерное пространство, думал делать через 3 мерный массив, но подумав получше понял что идея плохая, кто подскажет как с нуля сделать 3 мерное пространство ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.10.2019, 23:37
Ответы с готовыми решениями:

Трехмерная точка
Всем здравствуйте! Нужна программка. Что есть: Код структуры описывающей трехмерную точку { double x; double y; ...

Трехмерная матрица через вложенные вектора
Как работать с 3-х мерным вектором ? Есть класс A. В классе B в привате находится vector< vector <vector<A> > >...

трехмерная графика
доброго времени суток, подскажите какими классами|интерфейсами какого пакета надо оперировать чтобы создать приложение, которое при запуске...

47
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
06.11.2019, 15:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 8Observer8 Посмотреть сообщение
что не смог пользоваться OGL1 и страшно не люблю эту версию
что там не понятного они к старому конвееру добавили шейдеры якобы что бы появилось возможности при которых можно делать свои вычисления по освещению итд, но добавляя больше возможностей увеличиваеться и код тому свидетельство новый Vulkan, а ведь там все тоже самое в моем представлении только перебрали код что то добавили что то убрали
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
06.11.2019, 16:07
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Может быть одни ещё структуры и классы не проходили. Нужно нужно будет объяснять, что это такое. Слово "вектор" ему тоже может быть незнакомо.
Но уж (x,y,z) координаты-то знакомы, наверное. Да и не зная что такое структуры, браться за графику довольно странное решение. Вот как раз вектор, я считаю, стоит вводить сразу, даже если его не было. Может быть, пока не разделять радиус-вектор с точкой, но уж точно обозначать один объект (точка в пространстве) одним объектом в программе (структура, потом может быть класс).
У нас матрицы вводили на первом курсе, хотя было не особо очевидно где они используются на практике, так что тут не спорю с вашим подходом: сначала ручные преобразования координат без "черной матричной магии".
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Если я правильно понял, человек спросил
этот "человек" задал свой расплывчатый вопрос, а потом испугался и убежал
Цитата Сообщение от 8Observer8 Посмотреть сообщение
0.5f, 0.5f, 0.5f, // v0: x, y, z
а чего единичный куб не взяли? Демонстрация работы с дробными числами?
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,966
Записей в блоге: 222
06.11.2019, 17:11
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Да и не зная что такое структуры, браться за графику довольно странное решение.
Я писал, что никакой графики не будет. Будет элементарная математика. По-моему, автор имел ввиду, как работать с трёхмерными объектами без графики.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
но уж точно обозначать один объект (точка в пространстве) одним объектом в программе (структура, потом может быть класс).
В данном примере мне удобнее хранить координаты в одномерном массиве. По-моему, для такого элементарного примера, где мне нужно показать, как реализовать параллельный перенос, достаточно одномерного массива. Тут нечего рефракторить:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        float[] Translate(float[] positions, float tx, float ty, float tz)
        {
            float[] newPositions = new float[positions.Length];
 
            for (int i = 0; i < newPositions.Length; i += 3)
            {
                newPositions[i] = positions[i] + tx;         // x
                newPositions[i + 1] = positions[i + 1] + ty; // y
                newPositions[i + 2] = positions[i + 2] + tz; // z
            }
 
            return newPositions;
        }
Если вы, или кто-то ещё считает, что нужно хранить в массиве объекты структуры/класса Point, то, пожалуйста, улучшайте. Может автор темы захочет поупражняться с структурами и классами.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
этот "человек" задал свой расплывчатый вопрос, а потом испугался и убежал
Я его так понял, что как задавать трёхмерные объекты в трёхмерном пространстве, как с ними работать, используя только математику и язык программирования, без графики и библиотек.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
У нас матрицы вводили на первом курсе, хотя было не особо очевидно где они используются на практике
Да, кстати. Студент на первом курсе думает, что матрица - это просто числа в таблице и всё что с ними можно делать - это: искать наибольший элемент в строке или столбце. Линейная алгебра может быть на втором курсе, её может вообще не быть, либо студент прогулял все лекции и семинары. Может данный студент не знает, что матрицу можно умножить на вектор и что матрицу можно умножить на матрицу. Поэтому я показал элементарные преобразования без использования матриц. Кстати, даже в русском варианте Википедии о параллельном переносе не стали переводить раздел с матрицами, а если переключиться на английский, то там матрица переноса есть и показано, как она работает: https://en.wikipedia.org/wiki/... _(geometry)

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
а чего единичный куб не взяли? Демонстрация работы с дробными числами?
Я взял единичный куб, то есть куб с размером 1 (сторона с размером 1), чтобы размер было удобно выставлять. То есть, если задаём размер 5, то будет куб со стороной 5.

Масштабирование (задание размера)

К данному моменту в программе любой заданный через координаты трёхмерный объект можно параллельным переносом перемещать в любую точку трёхмерного пространства. Но у нас кубик одного размера - это куб со стороной 1 метр. Было бы хорошо иметь возможность задать свой собственный размер. При чём, иногда нужно сделать изменение размера кубика только по определённой оси, чтобы сделать из него параллелепипед. Для этого в математике есть специальное преобразование координат объекта, которое называется масштабирование. К сожалению, на русском нет статьи в Википедии, есть только на английском: Scaling (geometry). Это преобразование объекта чуть сложнее, чем трансляция (то есть параллельный перенос). Условно говоря, трансляция - это 2 + 2 = 4, а масштабирование - это 2 * 2 = 4. При масштабировании нужно по каждой оси задать коэффициенты, на которые нужно умножить (x, y, z) каждой вершины. Я обозначил эти коэффициенты через: sx, sy, sz

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        float[] Scale(float[] positions, float sx, float sy, float sz)
        {
            float[] newPositions = new float[positions.Length];
 
            for (int i = 0; i < newPositions.Length; i += 3)
            {
                newPositions[i] = positions[i] * sx;         // x
                newPositions[i + 1] = positions[i + 1] * sy; // y
                newPositions[i + 2] = positions[i + 2] * sz; // z
            }
 
            return newPositions;
        }
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
06.11.2019, 17:55
Цитата Сообщение от 8Observer8 Посмотреть сообщение
По-моему, автор имел ввиду, как работать с трёхмерными объектами без графики.
Тем более. При работе с трехмерными объектами минимальная единица - точка в пространстве. А вовсе не отдельная ее координата.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Да, кстати. Студент на первом курсе думает, что матрица - это просто числа в таблице и всё что с ними можно делать - это: искать наибольший элемент в строке или столбце.
Еще детерминант, куда ж без него! Правда, зачем он нужен, тоже неясно.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Может данный студент не знает, что матрицу можно умножить на вектор и что матрицу можно умножить на матрицу. Поэтому я показал элементарные преобразования без использования матриц.
И это правильно. Правда, с поворотом будет сложно: арктангенс радиус вектора, сложение с углом поворота, синус + косинус. Но без введения локальной системы координат и матриц преобразования вряд ли получится по-другому.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Тут нечего рефракторить
Мы же про новичков говорим, а вы адресную магию используете. Это не так очевидно, как кажется. Нет, ради наглядности, лучше завернуть "точку" в структуру. Мол это не три объекта, размазанные по общему массиву, а именно одна точка, и обращение к ней идет через поля: p[i].x, p[i].y, p[i].z.
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,966
Записей в блоге: 222
06.11.2019, 18:59
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Тем более. При работе с трехмерными объектами минимальная единица - точка в пространстве. А вовсе не отдельная ее координата.
По-моему, показанные мною аффинные преобразования настолько элементарные, что попытки сделать ещё более наглядно, пока не к чему. Вот если написать свой класс Matrix, то можно представить координаты вершин куба через Vector. Если вам это так сильно не даёт покоя, то перепишите. Я переписывать не будут, потому что и так всё просто и наглядно.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Еще детерминант, куда ж без него! Правда, зачем он нужен, тоже неясно.
Я может и понимал раньше для чего он нужен, но забыл, а может и не понимал. Для элементарных работ с трёхмерными объектами, то есть: для параллельного переноса, масштабирования и поворота - детерминант не нужен. Нужно только знать, как умножить матрицу на вектор, а матрицу на матрицу. По сути, вектор это тоже матрица у которой один столбец, значит, нужно знать правило, как умножать матрицу на матрицу.

Я нашёл в этой книге хорошие картинки для демонстрации элементарных преобразований. Эти формулы применяются поочерёдно для каждой вершины из массива вершин:

Трансляция:
Название: Translation_Formulae.png
Просмотров: 56

Размер: 3.2 Кб


Масштабирование:
Название: Scale_Formulae.png
Просмотров: 56

Размер: 3.1 Кб
1
4 / 3 / 1
Регистрация: 08.08.2017
Сообщений: 6
06.11.2019, 19:08
Если хочешь написать 3D библиотеку по типу OpenGL, могу посоветовать вот эту статью:
https://habr.com/ru/post/248153/
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,966
Записей в блоге: 222
06.11.2019, 21:44
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И это правильно. Правда, с поворотом будет сложно: арктангенс радиус вектора, сложение с углом поворота, синус + косинус. Но без введения локальной системы координат и матриц преобразования вряд ли получится по-другому.
Нужно сначала показать откуда ноги растут у матричной формы записи, а для этого нужно будет объяснить, как умножить матрицу на вектор. Но перед этим нужно объяснить, как реализуется поворот с помощью аффинных преобразований. Повернуть объект не так сложно, как вы думаете. Не знаю, проходят ли сейчас в школе тригонометрию. Косинус/Синус суммы двух аргументов. Не нужны никакие: "арктангенс радиус вектора" и "введения локальной системы координат и матриц преобразования" - это всё каша. Поэтапно показываю ниже, как сделать поворот вокруг оси Z. С остальными осями, кто хочет, может сам поупражняться.

Поворот вокруг вокруг осей на заданный угол

Трансляцию и масштабирование было реализовано в коде выше, а теперь третий и заключительный вид преобразования - поворот вокруг оси. Я выбрал ось Z. Вы можете в качестве упражнения реализовать повороты вокруг оси X и Y.

Я взял рисунки из этой книги. Нам нужно научиться преобразовывать в программе исходные координаты трёхмерной фигуры (в нашем случае кубика), так, чтобы в результате были возвращены новые координаты повёрнутой фигуры на заданный угол вокруг оси Z.





Координата начальной точки https://www.cyberforum.ru/cgi-bin/latex.cgi?p, на рисунке выше, определяется формулами:

https://www.cyberforum.ru/cgi-bin/latex.cgi?x = r * Cos(\alpha)
https://www.cyberforum.ru/cgi-bin/latex.cgi?y = r * Sin(\alpha)

Нам нужно получить координату точки https://www.cyberforum.ru/cgi-bin/latex.cgi?{p}^{'}. Из рисунка выше следует, что координата точки https://www.cyberforum.ru/cgi-bin/latex.cgi?{p}^{'} определяется формулами:

https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{'} = r * Cos(\alpha + \beta)
https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}^{'} = r * Sin(\alpha + \beta)

Мы видим косинус двух аргументов https://www.cyberforum.ru/cgi-bin/latex.cgi?Cos(\alpha + \beta) и синус двух аргументов https://www.cyberforum.ru/cgi-bin/latex.cgi?Sin(\alpha + \beta). Формулы для косинуса и синуса двух аргументов выглядят так:

https://www.cyberforum.ru/cgi-bin/latex.cgi?Cos(\alpha + \beta) = Cos(\alpha) * Cos(\beta) - Sin(\alpha) * Sin(\beta)
https://www.cyberforum.ru/cgi-bin/latex.cgi?Sin(\alpha + \beta) = Sin(\alpha) * Cos(\beta) -  Cos(\alpha) * Sin(\beta)

Подставим эти формулы в https://www.cyberforum.ru/cgi-bin/latex.cgi?{p}^{'} и получим:

https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{'} = r * (Cos(\alpha + \beta) = Cos(\alpha) * Cos(\beta) - Sin(\alpha) * Sin(\beta))
https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}^{'} = r * (Sin(\alpha) * Cos(\beta) -  Cos(\alpha) * Sin(\beta))

Чтобы в уравнениях выше избавиться от https://www.cyberforum.ru/cgi-bin/latex.cgi?r и от членов с https://www.cyberforum.ru/cgi-bin/latex.cgi?\alpha нужно выразить https://www.cyberforum.ru/cgi-bin/latex.cgi?r из самых первых уравнений и подставить в уравнения выше. Обязательно нужно проделывать этот вывод с ручкой и бумагой, пока не научитесь делать это без задержек. В итоге получаются окончательные уравнения, где https://www.cyberforum.ru/cgi-bin/latex.cgi?z остаётся без изменения, потому что координата https://www.cyberforum.ru/cgi-bin/latex.cgi?z не участвовала в преобразованиях:

https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{'} = x * Cos(\beta) - y * Sin(\beta)
https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}^{'} = x * Sin(\beta) + y * Cos(\beta)
https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}^{'} = z

Мы получили уравнения, которые преобразуют координаты путём поворота на заданный угол. Реализация в программе:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        float[] RotateZ(float[] positions, float degrees)
        {
            float[] newPositions = new float[positions.Length];
            float radians = MathHelper.DegreesToRadians(degrees);
 
            for (int i = 0; i < newPositions.Length; i += 3)
            {
                float x = positions[i];
                float y = positions[i + 1];
                float z = positions[i + 2];
                newPositions[i] = x * (float)Math.Cos(radians) - y * (float)Math.Sin(radians);     // x
                newPositions[i + 1] = x * (float)Math.Sin(radians) + y * (float)Math.Cos(radians); // y
                newPositions[i + 2] = positions[i + 2]; // z
            }
 
            return newPositions;
        }
Использование. Поворачиваем куб вокруг оси Z против часовой стрелки на 10 градусов:

C#
1
float[] newPositions = RotateZ(positions, 10f);
Весь код со всеми тремя видами преобразований

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using System;
using System.Windows.Forms;
 
namespace _3DSpace
{
    public partial class Form1 : Form
    {
 
        public Form1()
        {
            InitializeComponent();
 
            //    v6----- v5
            //   /|      /|
            //  v1------v0|
            //  | |     | |
            //  | |v7---|-|v4
            //  |/      |/
            //  v2------v3
 
            float[] positions = new float[]
            {
                0.5f, 0.5f, 0.5f,       // v0: x, y, z
                -0.5f, 0.5f, 0.5f,      // v1
                -0.5f, -0.5f, 0.5f,     // v2
                0.5f, -0.5f, 0.5f,      // v3
                0.5f, -0.5f, -0.5f,     // v4
                0.5f, 0.5f, -0.5f,      // v5
                -0.5f, 0.5f, -0.5f,     // v6
                -0.5f, -0.5f, -0.5f     // v7
            };
 
            //float[] newPositions = Scale(positions, 2f, 2f, 2f);
 
            float[] newPositions = RotateZ(positions, 10f);
 
            //float[] newPositions = Translate(positions, 3, 1, 5);
 
        }
 
        private float[] Translate(float[] positions, float tx, float ty, float tz)
        {
            float[] newPositions = new float[positions.Length];
 
            for (int i = 0; i < newPositions.Length; i += 3)
            {
                newPositions[i] = positions[i] + tx;         // x
                newPositions[i + 1] = positions[i + 1] + ty; // y
                newPositions[i + 2] = positions[i + 2] + tz; // z
            }
 
            return newPositions;
        }
 
        private float[] Scale(float[] positions, float sx, float sy, float sz)
        {
            float[] newPositions = new float[positions.Length];
 
            for (int i = 0; i < newPositions.Length; i += 3)
            {
                newPositions[i] = positions[i] * sx;         // x
                newPositions[i + 1] = positions[i + 1] * sy; // y
                newPositions[i + 2] = positions[i + 2] * sz; // z
            }
 
            return newPositions;
        }
 
        private float[] RotateZ(float[] positions, float degrees)
        {
            float[] newPositions = new float[positions.Length];
            float radians = MathHelper.DegreesToRadians(degrees);
 
            for (int i = 0; i < newPositions.Length; i += 3)
            {
                float x = positions[i];
                float y = positions[i + 1];
                float z = positions[i + 2];
                newPositions[i] = x * (float)Math.Cos(radians) - y * (float)Math.Sin(radians);     // x
                newPositions[i + 1] = x * (float)Math.Sin(radians) + y * (float)Math.Cos(radians); // y
                newPositions[i + 2] = positions[i + 2]; // z
            }
 
            return newPositions;
        }
    }
}
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,966
Записей в блоге: 222
07.11.2019, 00:16
У меня описка выше в уравнении:

https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{'} = r * (Cos(\alpha + \beta) = Cos(\alpha) * Cos(\beta) - Sin(\alpha) * Sin(\beta))
https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}^{'} = r * (Sin(\alpha) * Cos(\beta) -  Cos(\alpha) * Sin(\beta))

Должно быть так:

https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{'} = r * (Cos(\alpha) * Cos(\beta) - Sin(\alpha) * Sin(\beta))
https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}^{'} = r * (Sin(\alpha) * Cos(\beta) -  Cos(\alpha) * Sin(\beta))

Добавлено через 2 часа 10 минут
Переход к матричной форме записи полученных уравнений для трёх видов преобразований: трансляция, масштабирование и поворот

Выше было показано, как получить уравнения для трёх видов преобразований:

Масштабирование:

https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{'} = x * {S}_{x}
https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}^{'} = x * {S}_{y}
https://www.cyberforum.ru/cgi-bin/latex.cgi?{z}^{'} = x * {S}_{z}

Поворот вокруг оси Z:

https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{'} = x * Cos(\beta) - y * Sin(\beta)
https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}^{'} = x * Sin(\beta) + y * Cos(\beta)
https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}^{'} = z

Трансляция (параллельный перенос):

https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{'} = x + {T}_{x}
https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}^{'} = x + {T}_{y}
https://www.cyberforum.ru/cgi-bin/latex.cgi?{z}^{'} = x + {T}_{z}

Запишем эти уравнения в общем виде:

https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{'} = a * x + b * y + c * z + d
https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}^{'} = e * x + f * y + g * z + h
https://www.cyberforum.ru/cgi-bin/latex.cgi?{z}^{'} = i * x + j * y + k * z + l

Вы можете сравнить общий вид уравнений с уравнениями выше. Например, в уравнении трансляции для https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{'} коэффициенты при x, y и z равны: a = 1, b = 0, с = 0, d = https://www.cyberforum.ru/cgi-bin/latex.cgi?{T}_{x}. Просмотрите все уравнения и посмотрите чему равны коэффициенты из общей записи для всех уравнений.

Если вы знакомы с умножением матрицы на вектор, то вы увидите общем виде уравнений, что это матрица коэффициентов умножается на вектор: (x, y, z). Но так как в уравнении присутствуют коэффициенты (d, h, l), то значит, что матрица умножается на вектор (x, y, z, 1). Нам нужно дополнить матриц коэффициентов ещё одним рядом, чтобы сделать её размеров 4x4. Получаем:

https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}<br />
\\  {x}^{'}  \\  {y}^{'}  \\  {z}^{'}  \\  1<br />
\end{bmatrix} = \begin{bmatrix} <br />
a & b & c & d \\<br />
e & f & g & h \\<br />
g & j & k & l  \\<br />
m & n & o & p<br />
\end{bmatrix}  = \begin{bmatrix} \\ x \\ y \\ z \\ 1 \end{bmatrix}

Было добавлено уравнение:

https://www.cyberforum.ru/cgi-bin/latex.cgi?1 = m * x + n * y + o * z + p = 1

из которого следует, что m = 0, n = 0, o = 0, p = 1

Если сопоставить общую матричную запись уравнений у полученными уравнениями преобразований и подставить найденные из сопоставления коэффициенты, то получаем матричные записи уравнений преобразований:

Матричная запись уравнений масштабирования:

https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}<br />
\\  {x}^{'}  \\  {y}^{'}  \\  {z}^{'}  \\  1<br />
\end{bmatrix} = \begin{bmatrix} <br />
{S}_{x} & 0 & 0 & 0 \\<br />
0 & {S}_{y} & 0 & 0 \\<br />
0 & 0 & {S}_{z} & 0  \\<br />
0 & 0 & 0 & 1<br />
\end{bmatrix}  = \begin{bmatrix} \\ x \\ y \\ z \\ 1 \end{bmatrix}

Матричная запись уравнений параллельного переноса:

https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}<br />
\\  {x}^{'}  \\  {y}^{'}  \\  {z}^{'}  \\  1<br />
\end{bmatrix} = \begin{bmatrix} <br />
1 & 0 & 0 & {T}_{x} \\<br />
0 & 1 & 0 & {T}_{y} \\<br />
0 & 0 & 0 & {T}_{z}  \\<br />
0 & 0 & 0 & 1<br />
\end{bmatrix}  = \begin{bmatrix} \\ x \\ y \\ z \\ 1 \end{bmatrix}

Матричная запись уравнений поворота вокруг оси Z:

https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}<br />
\\  {x}^{'}  \\  {y}^{'}  \\  {z}^{'}  \\  1<br />
\end{bmatrix} = \begin{bmatrix} <br />
Cos(\beta) & -Sin(\beta) & 0 & 0 \\<br />
Sin(\beta) & Cos(\beta) & 0 & 0 \\<br />
0 & 0 & 1 & 0  \\<br />
0 & 0 & 0 & 1<br />
\end{bmatrix}  = \begin{bmatrix} \\ x \\ y \\ z \\ 1 \end{bmatrix}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.11.2019, 00:16
Помогаю со студенческими работами здесь

Трёхмерная графика
построить изображение какого-либо геометрического тела как с помошью стандартных функцию glut, так и с помощью glBegin()/glEnd().Помогите...

Трехмерная графика
1. Ввести вектор V с произвольно заданными координатами 2. Выполнить преобразования поворота, сдвига и масштабирования на произвольно...

Трехмерная графика
Можете мне посоветовать какой нибудь материал на эту тему с примерами желательно

трёхмерная графика
Подскажите плиз, как мне вывести на экран трёхмерный график? Можно ли это мделать в TChart? Эсли нельзя , то где можно? Дайте какой-нибудь...

Трехмерная графика surf из двухмерной матрицы
Имеется двухмерная матрица 200 строк 16 столбцов zr1=zeros(200,16); Матрица zr1 - это данные работы программы моделирования 16...


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

Или воспользуйтесь поиском по форуму:
48
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru