![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 16.02.2013
Сообщений: 179
|
![]()
Здравствуйте!Программа написана на Borland C++ 4.5.Я загружаю графичес-кий файл plg функцией Load_OBJECT4DV1_PLG в структуру obj для вывода функцией Paint этой структуры. Но почему-то параметры файла не записы-ваются в структуру.Кто разбирается пусть проверят функцию Load_OBJECT_PLG , почему не осуществляется запись из файла . Для проверки я поставил функцию dc.TextOut в функции Paint для вывода одного из параметров файла.
#include<owl/applicat.h> #include<owl/framewin.h> #include<owl/dc.h> #include <windows.h> // include important windows stuff #include <windowsx.h> #include <mmsystem.h> #include <iostream.h> // include important C/C++ stuff #include <conio.h> #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <string.h> #include <stdarg.h> #include <stdio.h> #include <math.h> #include <io.h> #include <fcntl.h> #define VIEW_DISTANCE 320 typedef struct VECTOR4D_TYP { float x,y,z,w; } POINT4D,VECTOR4D,*VECTOR4D_PTR, *POINT4D_PTR; typedef struct POLY4DV1_TYP { int state; int attr; int color; POINT4D_PTR vlist; int vert[3]; } POLY4DV1,*POLY4DV1_PTR; typedef struct OBJECT4DV1_TYP { int id; char name[64]; int state; int attr; float avg_radius; float max_radius; POINT4D world_pos; VECTOR4D dir; VECTOR4D ux,uy,uz; int num_vertices; POINT4D vlist_local[64]; POINT4D vlist_trans[64]; int num_polys; POLY4DV1 plist[128]; } OBJECT4DV1,*OBJECT4DV1_PTR; VECTOR4D vscale={1.0,1.0,1.0,1}, vpos = {400,400,400,1}, vrot = {0,0,0,1}; OBJECT4DV1 obj; void VECTOR4D_Add(VECTOR4D_PTR , VECTOR4D_PTR , VECTOR4D_PTR ); char *Get_Line_PLG(char *,int,FILE *); int Load_OBJECT4DV1_PLG(OBJECT4DV1_PTR, char *,VECTOR4D_PTR,VECTOR4D_PTR,VECTOR4 D_PTR); class TMyWin : public TFrameWindow { public: TMyWin():TFrameWindow(0,"LoadObject ") { //Load_OBJECT4DV1_PLG(&obj, "tank01.plg",&vscale, &vpos, &vrot); } private: void Paint(TDC &,BOOL,TRect&); }; void TMyWin::Paint(TDC &dc,BOOL,TRect&) { char work_string[256]; Load_OBJECT4DV1_PLG(&obj, "tank01.plg",&vscale, &vpos, &vrot); TRect rect; GetClientRect(rect); TBrush brBlack(TColor::Black); dc.SelectObject(brBlack); dc.FillRect(rect,brBlack); sprintf(work_string,"%d вершин",obj.num_vertices); dc.TextOut(0,0,work_string); for(int vertex=0;vertex<obj.num_vertices;ve rtex++) { VECTOR4D_Add(&obj.vlist_local[vertex],&obj.world_pos,&obj.vlist_trans[vertex]); } for(vertex=0;vertex<obj.num_vertice s;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; } /* TRect rect; GetClientRect(rect); TBrush brBlack(TColor::Black); dc.SelectObject(brBlack); dc.FillRect(rect,brBlack);*/ TPen brGreen(TColor::LtGreen); dc.SelectObject(brGreen); for(int poly=0;poly<obj.num_polys;poly++) { int vindex_0=obj.plist[poly].vert[0]; int vindex_1=obj.plist[poly].vert[1]; int vindex_2=obj.plist[poly].vert[2]; sprintf(work_string," %f вершина ",obj.vlist_trans[vindex_0].x); dc.TextOut(0,poly,"Polys"); dc.MoveTo(obj.vlist_trans[vindex_0].x,obj.vlist_trans[vindex_0].y); dc.LineTo(obj.vlist_trans[vindex_1].x,obj.vlist_trans[vindex_1].y); dc.MoveTo(obj.vlist_trans[vindex_1].x,obj.vlist_trans[vindex_1].y); dc.LineTo(obj.vlist_trans[vindex_2].x,obj.vlist_trans[vindex_2].y); dc.MoveTo(obj.vlist_trans[vindex_2].x,obj.vlist_trans[vindex_2].y); dc.LineTo(obj.vlist_trans[vindex_0].x,obj.vlist_trans[vindex_0].y); } dc.TextOut(0,20,"1"); sprintf(work_string,"%d вершин",obj.num_vertices); dc.TextOut(0,40,work_string); } char *Get_Line_PLG(char *buffer,int maxlength,FILE *fp) { int index=0; int length=0; while(1) { if(!fgets(buffer,maxlength,fp)) return(NULL); for(length=strlen(buffer),index=0;i sspace(buffer[index]);index++) if(index>=length||buffer[index]=='#') continue; return(&buffer[index]); } } int Load_OBJECT4DV1_PLG(OBJECT4DV1_PTR obj,char *filename,VECTOR4D_PTR scale,VECTOR4D_PTR pos,VECTOR4D_PTR rot) { FILE *fp; char buffer[256]; char* token_string; memset(obj,0,sizeof(OBJECT4DV1)); obj->world_pos.x=pos->x; obj->world_pos.y=pos->y; obj->world_pos.z=pos->z; obj->world_pos.w=pos->w; if(!(fp=fopen(filename,"r"))) { printf("Couldn't open PLG file %s.",filename); return(0); } if(!(token_string=Get_Line_PLG(buff er,255,fp))) return(0); sscanf(token_string,"%s %d %d",obj->name,&obj->num_vertices,&obj->num_polys); for(int vertex=0;vertex<obj->num_vertices;vertex++) { if(!(token_string=Get_Line_PLG(buff er,255,fp))) return(0); sscanf(token_string,"%f %f %f",&obj->vlist_local[vertex].x,&obj->vlist_local[vertex].y,&obj->vlist_local[vertex].z); obj->vlist_local[vertex].w=1; obj->vlist_local[vertex].x*=scale->x; obj->vlist_local[vertex].y*=scale->y; obj->vlist_local[vertex].z*=scale->z; } int poly_num_verts=0; char tmp_string[8]; for(int poly=0;poly<obj->num_polys;poly++) { if(!(token_string=Get_Line_PLG(buff er,255,fp))) return(0); sscanf(token_string,"%s %d %d %d %d",tmp_string,&poly_num_verts,&o bj->plist[poly].vert[0],&obj->plist[poly].vert[1],&obj->plist[poly].vert[2]); obj->plist[poly].vlist=obj->vlist_local; } fclose(fp); return(1); } void VECTOR4D_Add(VECTOR4D_PTR va, VECTOR4D_PTR vb, VECTOR4D_PTR vsum) { // this function adds va+vb and return it in vsum vsum->x = va->x + vb->x; vsum->y = va->y + vb->y; vsum->z = va->z + vb->z; vsum->w = 1; } class TMyApp : public TApplication { public: TMyApp():TApplication(){}; private: void InitMainWindow(); }; void TMyApp::InitMainWindow() { MainWindow=new TMyWin(); } int OwlMain(int,char*[]) { TMyApp app; return app.Run(); } |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 16.02.2013
Сообщений: 179
|
![]()
Не могу понять почему функция Load_OBJECT4DV1_PLG не считывает параметры файла tank1.plg в структуру obj.Где ошибка?
|
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 16.02.2013
Сообщений: 179
|
![]()
В функции Load_OBJECT4DV1_PLG я построчно считываю параметры файла.
Считывание осуществляется функцией Get_Line_PLG. |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 16.02.2013
Сообщений: 179
|
![]()
Программу делаю по книге Программирование трехмерных игр для Windows. Советы профессионала.-А.Ламота .Включил проект loadobject.cpp и plg файл
tank1.plg.Программа должна рисовать 3-х мерный танк в окне.Данные долж-ны из plg файла переписываться в структуру obj.Но этого не происходит. В plg файле указываются координаты вершин и номера вершин в полигоне- треугольнике. |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 16.02.2013
Сообщений: 179
|
![]()
Функция Get_Line_PLG считывает строку из файла.Пропускает пустые строки
и строки с комментариями начинающимися на #.Возращает строку и присваивает ее переменной token_string.Возможно проблема в том , что файл в html форме разные строки записаны вместе и все воспринимаются как комментарии.В реальности в plg файле все строки должны быть разделены .Не знаю почему они компонуются. |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 14.03.2012
Сообщений: 147
|
![]()
Как бы программа отрабатывает, из файла данные загружаются, линии рисуются, но в итоге получается какая-то фигня из линий. Картинку прикрепил, то что получается. По-моему если ориентироваться на книгу, то надо еще реализовывать c 2-го по 4-й пункт.
0. загрузка и размещение объекта 1. преобразование локальных координат в мировые 2. удаление лишних объектов и обработка поверхностей 3. преобразование мировых координат в координаты камеры 4. преобразование координат камеры в аксонометрические координаты 5. преобразование аксонометрических координат в экранные 6. визуализация геометрии Судя по всему ты не можешь загрузить plg-файл из-за не правильно переданного названия файла. В функции Load_OBJECT4DV1_PLG название файла передается tank01.plg, а файл в архиве лежит tank1.plg, без ноля. Последний раз редактировалось ichi; 08.10.2018 в 12:12. Причина: Доболнение к посту |
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 16.02.2013
Сообщений: 179
|
![]()
Программа заработала ,считывается файл, после того как исправил название файла на tank1.plg.Не знаю почему у тебя выводится не такая
фигура.У меня выводится другая фигура , более менее похожая на танк. По поводу других пунктов нужно ли их реализовывать?Можно не преобразовывать в координаты камеры,т.е. я не использую камеру.И нет необходимости преобразовывать в аксонометрические координаты. Есть ли необходимость реализовывать эти пункты? Единственно танк повернут налево,а хотелось ,чтобы он был вперед.Не представляю как его развернуть. Как можно скинуть картинку того , что рисует программа?Правильно ли рисует танк? Последний раз редактировалось Timurkh77; 09.10.2018 в 22:55. |
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 14.03.2012
Сообщений: 147
|
![]()
Реализовывать другие пункты, я думаю, нужно. Если я правильно понял, автор книги, таким образом, придает объемный вид объекту (для это используется камера и перспектива). Чтобы повернуть объект тебе придется создать матрицу поворота. Чтобы прикрепить картинку к сообщению, тебе необходимо нажать кнопку "Загрузить файлы", в открывшемся окне выбрать загружаемую картинку на своем компьютере и нажать кнопку загрузить.
|
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 16.02.2013
Сообщений: 179
|
![]()
Я имею в виду как сфотографировать экран программы.
|
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 14.03.2012
Сообщений: 147
|
![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |