Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Ответ
 
Опции темы
Старый 15.11.2017, 20:26   #1
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 61
Репутация: 10
По умолчанию Проблема с загрузкой файла plg

Здравствуйте!Программа написана на 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();
}
Timurkh77 вне форума   Ответить с цитированием
Старый 10.12.2017, 00:01   #2
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 61
Репутация: 10
По умолчанию

Не могу понять почему функция Load_OBJECT4DV1_PLG не считывает параметры файла tank1.plg в структуру obj.Где ошибка?
Вложения
Тип файла: rar tank1.rar (594 байт, 2 просмотров)
Timurkh77 вне форума   Ответить с цитированием
Старый 24.01.2018, 00:02   #3
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 61
Репутация: 10
По умолчанию

В функции Load_OBJECT4DV1_PLG я построчно считываю параметры файла.
Считывание осуществляется функцией Get_Line_PLG.
Timurkh77 вне форума   Ответить с цитированием
Старый 16.09.2018, 17:58   #4
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 61
Репутация: 10
По умолчанию

Программу делаю по книге Программирование трехмерных игр для Windows. Советы профессионала.-А.Ламота .Включил проект loadobject.cpp и plg файл
tank1.plg.Программа должна рисовать 3-х мерный танк в окне.Данные долж-ны из plg файла переписываться в структуру obj.Но этого не происходит.
В plg файле указываются координаты вершин и номера вершин в полигоне-
треугольнике.
Вложения
Тип файла: zip loadobj.zip (1.8 Кб, 3 просмотров)
Тип файла: rar tank1.rar (594 байт, 3 просмотров)
Timurkh77 вне форума   Ответить с цитированием
Старый 02.10.2018, 00:18   #5
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 61
Репутация: 10
По умолчанию

Функция Get_Line_PLG считывает строку из файла.Пропускает пустые строки
и строки с комментариями начинающимися на #.Возращает строку и присваивает ее переменной token_string.Возможно проблема в том , что
файл в html форме разные строки записаны вместе и все воспринимаются как комментарии.В реальности в plg файле все строки должны быть разделены .Не знаю почему они компонуются.
Timurkh77 вне форума   Ответить с цитированием
Старый 08.10.2018, 12:30   #6
ichi
Пользователь
 
Регистрация: 14.03.2012
Сообщений: 32
Репутация: 10
По умолчанию

Как бы программа отрабатывает, из файла данные загружаются, линии рисуются, но в итоге получается какая-то фигня из линий. Картинку прикрепил, то что получается. По-моему если ориентироваться на книгу, то надо еще реализовывать c 2-го по 4-й пункт.

0. загрузка и размещение объекта
1. преобразование локальных координат в мировые
2. удаление лишних объектов и обработка поверхностей
3. преобразование мировых координат в координаты камеры
4. преобразование координат камеры в аксонометрические координаты

5. преобразование аксонометрических координат в экранные
6. визуализация геометрии

Цитата:
Сообщение от Timurkh77 Посмотреть сообщение
Не могу понять почему функция Load_OBJECT4DV1_PLG не считывает параметры файла tank1.plg в структуру obj.Где ошибка?
Судя по всему ты не можешь загрузить plg-файл из-за не правильно переданного названия файла. В функции Load_OBJECT4DV1_PLG название файла передается tank01.plg, а файл в архиве лежит tank1.plg, без ноля.
Изображения
Тип файла: png tank1.png (47.2 Кб, 0 просмотров)

Последний раз редактировалось ichi; 08.10.2018 в 13:12. Причина: Доболнение к посту
ichi вне форума   Ответить с цитированием
Старый 09.10.2018, 23:31   #7
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 61
Репутация: 10
По умолчанию

Программа заработала ,считывается файл, после того как исправил название файла на tank1.plg.Не знаю почему у тебя выводится не такая
фигура.У меня выводится другая фигура , более менее похожая на танк.
По поводу других пунктов нужно ли их реализовывать?Можно не преобразовывать в координаты камеры,т.е. я не использую камеру.И нет необходимости преобразовывать в аксонометрические координаты.
Есть ли необходимость реализовывать эти пункты?
Единственно танк повернут налево,а хотелось ,чтобы он был вперед.Не представляю как его развернуть.
Как можно скинуть картинку того , что рисует программа?Правильно ли рисует танк?

Последний раз редактировалось Timurkh77; 09.10.2018 в 23:55.
Timurkh77 вне форума   Ответить с цитированием
Старый 10.10.2018, 05:45   #8
ichi
Пользователь
 
Регистрация: 14.03.2012
Сообщений: 32
Репутация: 10
По умолчанию

Реализовывать другие пункты, я думаю, нужно. Если я правильно понял, автор книги, таким образом, придает объемный вид объекту (для это используется камера и перспектива). Чтобы повернуть объект тебе придется создать матрицу поворота. Чтобы прикрепить картинку к сообщению, тебе необходимо нажать кнопку "Загрузить файлы", в открывшемся окне выбрать загружаемую картинку на своем компьютере и нажать кнопку загрузить.
ichi вне форума   Ответить с цитированием
Старый 10.10.2018, 23:45   #9
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 61
Репутация: 10
По умолчанию

Я имею в виду как сфотографировать экран программы.
Timurkh77 вне форума   Ответить с цитированием
Старый 11.10.2018, 05:31   #10
ichi
Пользователь
 
Регистрация: 14.03.2012
Сообщений: 32
Репутация: 10
По умолчанию

Цитата:
Сообщение от Timurkh77 Посмотреть сообщение
Я имею в виду как сфотографировать экран программы.
Эта информация легко ищется с помощью поиска в Google.
ichi вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# Тестирование Блокнота. Проблема с загрузкой из файла .csv StudentTestC# Помощь студентам 3 05.03.2015 13: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


17:22.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru