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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2018, 23:15   #11
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 169
По умолчанию

Хотел отправить скриншот.Но программа с танком стала выдавать ошибку
Divide by zero.Вот файлы программы после того как она стала выдавать ошибку.
Вложения
Тип файла: rar loadobj.rar (2.5 Кб, 9 просмотров)
Timurkh77 вне форума Ответить с цитированием
Старый 05.11.2018, 22:43   #12
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 169
По умолчанию

Программа непонятно работает.Ставишь на вывод другой файл plg она его
выводит.Другую фигуру она рисует.При выводе же танка программа выдает
сообщение Деление на ноль в MessageBox.Хотя структура вроде бы считы-вается. Файл программы выше.В чем может быть дело?
Timurkh77 вне форума Ответить с цитированием
Старый 06.11.2018, 09:40   #13
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 147
По умолчанию Проблема в деление на ноль

Проблема в следующем участке кода:

Код:
for(int vertex=0;vertex<obj.num_vertices;vertex++)
{
 float z=obj.vlist_trans[vertex].z;

 obj.vlist_trans[vertex].x=VIEW_DISTANCE*obj.vlist_trans[vertex].x/z;
 obj.vlist_trans[vertex].y=VIEW_DISTANCE*obj.vlist_trans[vertex].y/z;
}
Ты изменяешь значение переменной z нажимая клавиши. В какой-то момент переменная z принимает значение 0 и по указанному коду выше происходит деление на ноль и программа падает.

Последний раз редактировалось ichi; 06.11.2018 в 10:00.
ichi вне форума Ответить с цитированием
Старый 06.11.2018, 15:49   #14
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 169
По умолчанию

Почему же тогда для другого файла plg tower1.plg вывод осуществляется
правильно и все рисуется.Вот пример файлов программы во вложениях.
Вложения
Тип файла: rar loadobj.rar (2.4 Кб, 11 просмотров)
Timurkh77 вне форума Ответить с цитированием
Старый 06.11.2018, 19:15   #15
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 147
По умолчанию

Файл tank1.plg у меня рисуется. Я просто хочу сказать, что проблема "ошибка деления на ноль" возникает в этой части кода:

Код:
for(int vertex=0;vertex<obj.num_vertices;vertex++)
{
 float z=obj.vlist_trans[vertex].z;

 obj.vlist_trans[vertex].x=VIEW_DISTANCE*obj.vlist_trans[vertex].x/z;
 obj.vlist_trans[vertex].y=VIEW_DISTANCE*obj.vlist_trans[vertex].y/z;
}
По-этому попробуй закомментировать этот участок кода и проверить будет ли возникать ошибка деления на ноль с различными plg файлами.
ichi вне форума Ответить с цитированием
Старый 07.11.2018, 22:25   #16
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 169
По умолчанию

Деление на z необходимо для перспективы , для рисования в 3-х измерени-ях.Не выводится только файл tank1.plg,файл tower1.plg выводится , хотя в
нем тоже есть деление на z.В чем дело?Пример программы с файлом tower1.plg в последнем вложении.
Timurkh77 вне форума Ответить с цитированием
Старый 09.11.2018, 08:18   #17
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 147
По умолчанию

Сделай в коде проверку на z равно 0. Добавь в код присвоение z=0.1, если z равно 0 и после этого программа не будет падать:
Код:
for(int vertex=0;vertex<obj.num_vertices;vertex++)
{
 float z=obj.vlist_trans[vertex].z;
	if (z==0) z=0.1;
 obj.vlist_trans[vertex].x=VIEW_DISTANCE*obj.vlist_trans[vertex].x/z;
 obj.vlist_trans[vertex].y=VIEW_DISTANCE*obj.vlist_trans[vertex].y/z;
}
ichi вне форума Ответить с цитированием
Старый 11.11.2018, 22:39   #18
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 169
По умолчанию

Пробовал сделать как ты сказал.Почему-то танк растягивается на весь экран и за него.Что делать?Возможно ошибка действительно в этой части кода.Но почему же тогда в самом начале с первым вариантом ошибка не выдавалась и танк рисовался.К тому же с другими plg файлами ошибки деления на ноль не выдается.Пример с файлом tower1.plg в последнем вложении loadobj.rar.

Последний раз редактировалось Timurkh77; 11.11.2018 в 22:45.
Timurkh77 вне форума Ответить с цитированием
Старый 12.11.2018, 12:19   #19
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 147
По умолчанию

Тебе необходимо по больше экспериментировать со своим кодом, не бойся менять параметры, которые ты задаешь в начале программы. Так проще понять, что у тебя выходит и как подогнать к тому что ты хочешь получить. Я имею в виду такие параметры как:

vscale={4.0,4.0,4.0,1},
vpos = {400,400,400,1},
vrot = {0,0,0,1};

#define VIEW_DISTANCE 320


Например, если посмотреть на изначальные данные файлов tank1.plg и tower1.plg то они имеют разные значения координат построения, это значит при одинаковых условиях вывода этих фигур на экран, у них буду разные размеры, поэтому танк выглядит больше по размеру. Если к этому еще добавить масштаб, который ты применил к объектам, то выходит вообще, что танк растягивается по координате z на все окно программы. Масштаб ты меняешь в этой строчке кода vscale={4.0,4.0,4.0,1}.

Танк растягивается не из-за того, что ты добавил в код строчку if (z==0) z=0.1; а из-того что-ты установил такой масштаб для танка.

Теперь на счет падения программы.

Код:
for(int vertex=0;vertex<obj.num_vertices;vertex++)
{
 float z=obj.vlist_trans[vertex].z;
 obj.vlist_trans[vertex].x=VIEW_DISTANCE*obj.vlist_trans[vertex].x/z;
 obj.vlist_trans[vertex].y=VIEW_DISTANCE*obj.vlist_trans[vertex].y/z;
}
Если в этом участке кода программа падает значит где-то выше по коду есть участок кода где z принимает значение 0. Выше по коду идет строчка:

Код:
for(int vertex=0;vertex<obj.num_vertices;vertex++)
{
 VECTOR4D_Add(&obj.vlist_local[vertex],&obj.world_pos,&obj.vlist_trans[vertex]);
}
в этой строчке происходит сложение координат объекта (&obj.vlist_local[vertex]) с координатами точки куда перемещается объкт &obj.world_pos).

Как получается эта точка &obj.world_pos, если смотреть выше по коду данная точка берется с параметров которые ты определил выше, в частности vpos = {400,400,400,1}.

Теперь посмотрим как формируется координаты объекта &obj.vlist_local[vertex]. Если смотреть выше, то данные координаты формируются путем умножения координат, которые загружаются из файла tank1.plg, на значения параметра масштаба, который ты определил в начале программы, в частности vscale={4.0,4.0,4.0,1}.

То есть в этой строчке кода VECTOR4D_Add(&obj.vlist_local[vertex],&obj.world_pos,&obj.vlist_trans[vertex]); формируется координата z таким образом

z = obj.vlist_local[vertex].z * vscale.z + vpos.z
z = -100*4+400 = -400+400 = 0


в файле tank1.plg берется значение z=-100 умножается на масштаб vscale.z=4 и прибавляется vpos.z=400 получаем падение программы.

И используй чаще отладчик Borland C++, он очень хорошо помогает в нахождение такого рода проблем.
ichi вне форума Ответить с цитированием
Старый 12.11.2018, 20:27   #20
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 169
По умолчанию

Уменьшил масштаб vscale до 1.Танк стал выводится нормально.Правильно ли рисуется танк,так ли он должен выглядеть?Достигнута ли конечная цель.Пример работы программы в архиве в скриншоте.
Вложения
Тип файла: rar Скриншот 12-11-2018 200112.rar (749.2 Кб, 11 просмотров)
Timurkh77 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# Тестирование Блокнота. Проблема с загрузкой из файла .csv StudentTestC# Помощь студентам 3 05.03.2015 12:30
Проблема с загрузкой!! Plamer-007 Компьютерное железо 3 23.06.2010 14:52
Проблема с загрузкой ОС Vali_T Операционные системы общие вопросы 18 07.04.2010 18:50
Проблема с загрузкой параметров из ini-файла Nomad Помощь студентам 6 03.08.2009 16:04
Проблема с загрузкой XP. hebu Windows 11 20.07.2009 14:33