Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помощь с нахождением бага в 3D движке. 8-D 
V
    Опции темы
Elfet
  Дата 19.6.2007, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: 1
Всего: 16



Балуюсь тут всё со своим движком smile Реализовано только отображение полигонов на плоскость просмотра камеры. Сделал возможность двигать камеры клавиатурой и мышкой менять направление её взгляда. Нарисовал простую фигуру - смотрю любуюсь на неё начинаю двигаться вокруг неё - всё правильно отображается, но когда я захожу за фигуру сзади она начинает мигать и вовсе исчезает smile 
Как найти ошибку я не знаю. Что делать?  smile 


--------------------
PM MAIL WWW Skype   Вверх
Ryoga
Дата 19.6.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 3
Всего: 6



Насколько я помню, отображаться треугольник будет с той стороны, куда нормали направлены. Может дело в этом...
PM MAIL   Вверх
Elfet
Дата 19.6.2007, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: 1
Всего: 16



Кажется нашёл smile Камуру нельзя назад развернуть почемуто smile Всем спасибо! 


--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 20.6.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: 1
Всего: 16



Цитата(Elfet @  19.6.2007,  23:56 Найти цитируемый пост)
Кажется нашёл smile Камуру нельзя назад развернуть почемуто smile Всем спасибо!  

Не, это вся нормально работает :/ 

Почему то я не могу разместить камеру в отрицательном положении - вот в этом глюк.

Вот как у меня вся работает:
Есть класс Camera с методом ResetCameraCoordinates()
Код

        public void ResetCameraCoordinates()
        {
            n = My3D.Constans.I;
            u = My3D.Constans.K;
            v = My3D.Constans.J;

            if (look.X == 0 && look.Y != 0)
                Pitch((look.Y > 0) ? Math.PI / 2 : -Math.PI / 2);
            else if (look.X != 0 && look.Y != 0)
                Pitch(Math.Atan(look.Y / look.X));  // вращаем орты камеры

            if (look.X == 0 && look.Y == 0 && look.Z != 0)
                Yaw((look.Z > 0) ? Math.PI / 2 : -Math.PI / 2);
            else if ((look.X != 0 || look.Y != 0) && look.Z != 0)
                Yaw(Math.Atan(look.Z / Math.Sqrt(look.X * look.X + look.Y * look.Y)));

            if (rotationAngle != 0)
                Roll(rotationAngle * Math.PI / 180);

            viewMatrix = new MyMatrix(new float[4, 4]    // матрица моделирования вида
                {
                    {n.X, n.Y, n.Z, Vector.ScalarProduct(-eye, n)},
                    {v.X, v.Y, v.Z, Vector.ScalarProduct(-eye, v)},
                    {u.X, u.Y, u.Z, Vector.ScalarProduct(-eye, u)},
                    {0, 0, 0, 0}
                });
        }

Который позиционирует координаты камеры по заданным параметрам и создаёт матрицу моделирования вида.

И есть функция Paint которая умножает все точки треугольников на матрицу моделирования вида и рисует эти треугольники.
Код

        public void Paint(Graphics graph, float sx, float sy)
        {
            List<Trians2Draw> buff = new List<Trians2Draw>();

            foreach (Camera camera in camers)
                foreach (Triangle[] triangles in trianglesBase.Values)   //
                {                                                                                   //
                    foreach (Triangle trian in triangles)                           // проходим циклом по всем треугольникам
                    {
                        bool visable = true;

                        PointF[] points = new PointF[3];

                        float depth = 0;

                        for (int i = 0; i < 3; i++)
                        {
                            Vector view = MyMatrix.MatrixMultiplication(camera.ViewMatrix, MyMatrix.Transposition(GetMatrixFromVector(trian[i]))); // Умножаем матрицу моделирования вида на точку и получаем новую точку

                            if (view.X > camera.ProjectionDistance)
                            {
                                points[i] = new PointF(sx * camera.ProjectionDistance * view.Y / view.X, sy * camera.ProjectionDistance * view.Z / view.X); // получаем проекцию точки
                                depth += 1 / view.X;
                            }
                            else
                            {
                                visable = false;
                                break;
                            }
                        }

                        if (visable)
                        {
                            depth /= 3;
                            buff.Add(new Trians2Draw(depth, points, trian.Color)); // А как насчёт такой вот глубины? - (101 * depth + 200) / (99 * depth)
                        }
                    }
                }


            buff.Sort();

            foreach (Trians2Draw triangle in buff)
            {
                GraphicsPath path = new GraphicsPath();

                path.AddLines(new PointF[4] { triangle.points[0], triangle.points[1], triangle.points[2], triangle.points[0] });

                SolidBrush brush = new SolidBrush(triangle.color);

                graph.FillPath(brush, path);
            }
        }
 
Где может быть ошибка зарыта?  smile 


--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 20.6.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: 1
Всего: 16



Кажется с позиционированием камеры проблема :/

Добавлено через 41 секунду
Код

        /// <summary>
        /// Вращение на угол с осью N
        /// </summary>
        /// <param name="angle">Угол в радианах</param>
        private void Roll(double angle)
        {
            float cosAngle = (float)Math.Cos(angle);
            float sinAngle = (float)Math.Sin(angle);
            Vector newU = cosAngle * u + sinAngle * v;
            Vector newV = -sinAngle * u + cosAngle * v;
            u = newU;
            v = newV;
        }

        /// <summary>
        /// Вращение на угол с осью V
        /// </summary>
        /// <param name="angle">Угол в радианах</param>
        private void Yaw(double angle)
        {
            float cosAngle = (float)Math.Cos(angle);
            float sinAngle = (float)Math.Sin(angle);
            Vector newN = cosAngle * n + sinAngle * u;
            Vector newU = -sinAngle * n + cosAngle * u;
            n = newN;
            u = newU;
        }

        /// <summary>
        /// Вращение на угол с осью U
        /// </summary>
        /// <param name="angle">Угол в радианах</param>
        private void Pitch(double angle)
        {
            float cosAngle = (float)Math.Cos(angle);
            float sinAngle = (float)Math.Sin(angle);
            Vector newN = cosAngle * n + sinAngle * v;
            Vector newV = -sinAngle * n + cosAngle * v;
            n = newN;
            v = newV;
        }



--------------------
PM MAIL WWW Skype   Вверх
Elfet
  Дата 20.6.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: 1
Всего: 16



Цитата(Elfet @  20.6.2007,  18:51 Найти цитируемый пост)
if (look.X == 0 && look.Y != 0)
                Pitch((look.Y > 0) ? Math.PI / 2 : -Math.PI / 2);
            else if (look.X != 0 && look.Y != 0)
                Pitch(Math.Atan(look.Y / look.X));  // вращаем орты камеры
            if (look.X == 0 && look.Y == 0 && look.Z != 0)
                Yaw((look.Z > 0) ? Math.PI / 2 : -Math.PI / 2);
            else if ((look.X != 0 || look.Y != 0) && look.Z != 0)
                Yaw(Math.Atan(look.Z / Math.Sqrt(look.X * look.X + look.Y * look.Y)));

Вот это вот криво по всей видимости работает smile

Вот это работает: Pitch(ST++ * Math.PI / 180); - Pitch работает верно smile

Добавлено через 6 минут и 51 секунду
А может быть просто с наведением проблемы?
Верно ли вот это вот написано?
Меняем вектор направления камеры с поворотом её:
Код

Vector look  = camera.Look;
                    look = new Vector(look.X * (float)Math.Cos(zDelta) * (float)Math.Cos(yDelta) - look.Z * (float)Math.Cos(yDelta) * (float)Math.Sin(zDelta) + look.Y * (float)Math.Sin(yDelta), look.Y * (float)Math.Cos(yDelta) - look.X * (float)Math.Cos(zDelta) * (float)Math.Sin(yDelta) + look.Z * (float)Math.Sin(zDelta) * (float)Math.Sin(yDelta), look.Z * (float)Math.Cos(zDelta) + look.X * (float)Math.Sin(zDelta));
                    camera.Look = look; 



--------------------
PM MAIL WWW Skype   Вверх
Elfet
  Дата 20.6.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: 1
Всего: 16



Вот этот вот угол изменяется не на все 360 градусов, а от 0 и до 180 градусов только, почемуто 
Код

Vector.Angle(Constans.I, new Vector(look.X, look.Y, 0))



--------------------
PM MAIL WWW Skype   Вверх
Elfet
  Дата 20.6.2007, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: 1
Всего: 16



вот эта функция (Vector.Angle) не выдаёт отрицательных углов :/

Добавлено через 7 минут и 34 секунды
Что то я туплю с определение угла между векторами :/

user posted image


--------------------
PM MAIL WWW Skype   Вверх
arilou
Дата 20.6.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Elfet, клевый у тебя монолог! Жаль, что некому помочь...


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Elfet
  Дата 20.6.2007, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: 1
Всего: 16



arilou,  smile

Добавлено через 2 минуты и 10 секунд
проблема с поворотом камеры назад, так как в сверических координатах угол изменяется только от -пи и до пи, а мне нужно что бы от 0 и до 360  smile 


--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 21.6.2007, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: 1
Всего: 16





--------------------
PM MAIL WWW Skype   Вверх
Ryoga
Дата 21.6.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 3
Всего: 6



Elfet, нравятся мне Ваши посты... задал вопрос, никто ничего ответить не успел, а он уже понаписал комментариев, дополнений и решение в конце...  smile  smile  smile 
Вам надо FAQ начать писать, или типо того... ;)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0706 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.