Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2014, 14:50   #1
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию Преобразование 3D на 2D

Люди помогите пожалуйста с графикой(Давно хотелось самому уметь писать вращающийся куб))
что мне начать читать дабы понять как мне создать 3Д Куб к примеру.т.е. именно имея 2Д -перейти на трехмерное изображения.понятно что изображения я получу относительно камеры и т.д. и потом чтобы повернуть камеру,опять нужны преобразования)

Проблема в основном начинается отсюда.я так понял я не могу понять как вычисляется матрица проекции.везде эти преобразования эйлеровы.но в двумерном пространстве у меня нету оси Z.что мне читать по этому поводу?..В итоге хочу просто строить графики трехмерные или простые фигуры.


Вот обычный код нашел где не понятно многое,кроме поворотов в пространстве где уже есть Z)Посоветуйте что начать читать буду очень благодарен!Чтобы как минимум понять этот код и самому научиться писать такое в GDI+ например. капалься вот http://www.vcskicks.com/3d_gdiplus_drawing.php
тут. норм объясняет но все же формулы камеры проекции и т.д. не понятны.Помогите мне разобраться буду очень рад! вот его исходник где конвертируется 3Д на 2Д исходник прикреплю кому будет интересно

Код:
  public Bitmap drawCube(Point drawOrigin)
        {
            //FRONT FACE
            //Top Left - 7
            //Top Right - 4
            //Bottom Left - 6
            //Bottom Right - 5

            //Vars
            PointF[] point3D = new PointF[24]; //Will be actual 2D drawing points
            Point tmpOrigin = new Point(0, 0);

            Math3D.Point3D point0 = new Math3D.Point3D(0, 0, 0); //Used for reference

            //Zoom factor is set with the monitor width to keep the cube from being distorted
            double zoom = (double)Screen.PrimaryScreen.Bounds.Width / 1.5;

            //Set up the cube
            Math3D.Point3D[] cubePoints = fillCubeVertices(width, height, depth);

            //Calculate the camera Z position to stay constant despite rotation            
            Math3D.Point3D anchorPoint = (Math3D.Point3D)cubePoints[4]; //anchor point
            double cameraZ = -(((anchorPoint.X - cubeOrigin.X) * zoom) / cubeOrigin.X) + anchorPoint.Z;
            camera1.Position = new Math3D.Point3D(cubeOrigin.X, cubeOrigin.Y, cameraZ);            

            //Apply Rotations, moving the cube to a corner then back to middle
            cubePoints = Math3D.Translate(cubePoints, cubeOrigin, point0);
            cubePoints = Math3D.RotateX(cubePoints, xRotation); //The order of these
            cubePoints = Math3D.RotateY(cubePoints, yRotation); //rotations is the source
            cubePoints = Math3D.RotateZ(cubePoints, zRotation); //of Gimbal Lock
            cubePoints = Math3D.Translate(cubePoints, point0, cubeOrigin);

            //Convert 3D Points to 2D
            Math3D.Point3D vec;
            for (int i = 0; i < point3D.Length; i++)
            {
                vec = cubePoints[i];
                if (vec.Z - camera1.Position.Z >= 0)
                {
                    point3D[i].X = (int)((double)-(vec.X - camera1.Position.X) / (-0.1f) * zoom) + drawOrigin.X;
                    point3D[i].Y = (int)((double)(vec.Y - camera1.Position.Y) / (-0.1f) * zoom) + drawOrigin.Y;
                }
                else
                {
                    tmpOrigin.X = (int)((double)(cubeOrigin.X - camera1.Position.X) / (double)(cubeOrigin.Z - camera1.Position.Z) * zoom) + drawOrigin.X;
                    tmpOrigin.Y = (int)((double)-(cubeOrigin.Y - camera1.Position.Y) / (double)(cubeOrigin.Z - camera1.Position.Z) * zoom) + drawOrigin.Y;

                    point3D[i].X = (float)((vec.X - camera1.Position.X) / (vec.Z - camera1.Position.Z) * zoom + drawOrigin.X);
                    point3D[i].Y = (float)(-(vec.Y - camera1.Position.Y) / (vec.Z - camera1.Position.Z) * zoom + drawOrigin.Y);

                    point3D[i].X = (int)point3D[i].X;
                    point3D[i].Y = (int)point3D[i].Y;
                }
            }
Вложения
Тип файла: zip EulerRotation.zip (12.7 Кб, 8 просмотров)
Тамерлан Абилов вне форума Ответить с цитированием
Старый 31.12.2014, 06:32   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Начать можно отсюда http://habrahabr.ru/post/131931/
Или вот http://gameinstitute.ru/resources/le...ovyi-direct3d/ (хоть про директ, но математика-то едина в графике)
И вообще с любого мануала по "компьютерной трёхмерной графике".
Если так хочется GDI+ использовать, то есть msdn , но, имо, проще брать сразу DirectX или OpenGL или даже более высокоуровневые инструменты.

Последний раз редактировалось phomm; 31.12.2014 в 06:38.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование часов в числа, а так же преобразование время PeMeHb Microsoft Office Excel 5 19.10.2014 17:04
Преобразование Stasiksis Общие вопросы C/C++ 2 28.02.2013 10:27
преобразование Drulya Помощь студентам 0 05.01.2011 18:17
Преобразование в С++ Davlet M Помощь студентам 3 03.10.2009 14:30