[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: MiniTiv2008  
Форум » Создание игр » Программирование » Уроки по написанию проги для загрузки 3DS Модели (Уроки по написанию проги для загрузки 3DS Модели)
Уроки по написанию проги для загрузки 3DS Модели
nkn-coderДата: Суббота, 28.11.2009, 15:46 | Сообщение # 1
лошара
Группа: Заблокированный
Сообщений: 35
Награды: 0
Репутация: 0
Статус:
И так начну писать урок на С++ Для загрузки 3DS Модели

#include "stdafx.h"
#include "windows.h"
#include "conio.h"

3DObjectModel3DS lpModel3DSFile;

BOOL bShow = true;

bool GetShablonFunct()
{
return n;
}

DWORD Array = 1;
DWORD pszStat = 1;

ZeroMemory(sizeof("lpByffer/"LP3DAPIWINDOW3D"));

3ds.load = model.3ds;
3ds.render = true;
3ds.x = 5.00;
3ds.z = 2.00;
3ds.y = 1.00;
3ds.viev.to.monitor = true;

SendMessage(&3ds, "ls", 9, bool GetShablonFunct = true);
hWnd HWND;
CreateWindow(hWnd, "3D Model", "MODELS 3D", "SndMsg&3ds);

void RenderAll(3DObjectModels3Ds);
{
if(S_OK)
{}
}

Тут происходит вызов Api 3D и считывание файла и вывод файла на Экран как Модель.
PS:Скоро будет много уроков с подробным описанием.


Aim Writing in C++,Delphi,HTML,PHP,PASCAL,CSS
 
LepardChihДата: Вторник, 01.12.2009, 23:11 | Сообщение # 2
Сержант
Группа: Пользователь
Сообщений: 12
Награды: 0
Репутация: 0
Статус:
1. Какой компилятор/среда?(где отлаживалось)
2. Какая библиотека/движок?(что использовалось)

Неплохо было бы писать это перед приведением листинга.

Да и комментариев можно несколько привести с объяснением что-откуда. Например так:
#include "stdafx.h" //это заголовочный файл - оттуда-то, предназначенный для сего-то...
...
//Это то-то для того-то....
3DObjectModel3DS lpModel3DSFile;
...
3ds.load = model.3ds; //это для того-то
3ds.render = true; //это для того-то
3ds.x = 5.00; //это не ноль потому-то...
и т.д.

И ещё один лично мне не ясный вопрос. Я к сожалению давно уже на C++ не программировал, но:
//похоже на стандартную библиотеку std или как её там? Стандартное пространство имён?
//или та stdcall была... вот ведь память...
#include "stdafx.h"
#include "windows.h" //стандартная библиотека виндовс
#include "conio.h" //тоже стандартная библиотека C++, кажется знакомой

1. Я прав?
2. А где же графическая библиотека? Или работа с графическими объектами встроена в стандартную библиотеку?

Добавлено (01.12.2009, 23:11)
---------------------------------------------
О, ещё несколько вопросиков образовалось.
1. Зачем инициировать переменную lpModel3DSFile; , если она далее нигде не используется? Кстати, lp в начале имени переменной означает, что это ссылка на переменную? А bShow, что Show булёвая переменная? Тогда указатель надо обозначать ptr..? А psz что означает? И зачем BOOL bShow = true; было нужно если это вообще не используется?

2. ZeroMemory(sizeof("lpByffer/"LP3DAPIWINDOW3D")); освобождается память, а подо что? И откуда? И для чего? И что означает конструкция .../"...?

3.
bool GetShablonFunct()
{
return n;
}
Откуда взялось булёвое n, если ф-я ничего не принимает? Для этого:
SendMessage(&3ds, "ls", 9, bool GetShablonFunct = true);
Но надо пояснить. И если не ошибаюсь SendMessage() должна принимать то ли ссылку то ли указатель на ф-ю.
Полагаю &3ds это передача параметра как ссылки? А ..."ls", 9,... шо значит?

В CreateWindow(hWnd, "3D Model", "MODELS 3D", "SndMsg&3ds);
А куда подевалась закрывающая кавычка в ..."SndMsg&3ds); ?

3. Откуда взялись переменные 3ds и model; ? Типы 3DObjectModel3DS, LP3DAPIWINDOW3D, DWORD?

И мне это кажется или попросту пропущена загрузка объекта из файла? Или загрузка должна быть в SendMessage(&3ds, "ls", 9, bool GetShablonFunct = true); . Но её ж вроде там нет. И сразу открывается окно виндовс, в него передаётся загруженная модель. А собственно загружена она откуда и во что и когда и где?
Возможно что-то пропущено тут:
...
DWORD Array = 1;
DWORD pszStat = 1;

ZeroMemory(sizeof("lpByffer/"LP3DAPIWINDOW3D"));

3ds.load = model.3ds;
...

Сообщение отредактировал LepardChih - Среда, 02.12.2009, 07:07
 
zxRaspДата: Пятница, 04.12.2009, 01:53 | Сообщение # 3
Рядовой
Группа: Пользователь
Сообщений: 4
Награды: 0
Репутация: 0
Статус:
Аффтар жжот....

LepardChih, не пытайтесь понять этот код, это невозможно... Но давайте по пунктам.

1) "stdafx.h" - это хидер не от стандартной библотеки Си. Стандартнаый - stdlib.h
2) "conio.h" - библиотека КОНСОЛЬНОГО ввода-вывода. НЕ используется в данном примере.
3) psz согласно венгерской нотации - это Pointer to String, terminated by Zero (указатель на строку, оканчивающуюся нулем). Почему такой префикс используется для переменной DWORD я не знаю...
4) функция ZeroMemory должна принимать два параметра, а не один (о том, что передается ей хрен знает что, я промолчу)
Это меня просто убило:
bool GetShablonFunct()
{
return n;
}
лежал под столом....
ф-я возвращает непонятно что... точнее, она просто не комилицца, т.к. локальная переменная "эн" не объявлена... Ну если её и объявить, толку то что?

SendMessage(&3ds, "ls", 9, bool GetShablonFunct = true); - это вообще бред, который в никакие ворота не лезет

if(S_OK)
{}

охрененный код! зачем эта проверка?

Добавлено (04.12.2009, 01:53)
---------------------------------------------
nkn-coder, может объяснишь мне, программисту на "отстойном Блице", что это всё значит?

 
LepardChihДата: Пятница, 04.12.2009, 19:31 | Сообщение # 4
Сержант
Группа: Пользователь
Сообщений: 12
Награды: 0
Репутация: 0
Статус:
Quote (zxRasp)
4) функция ZeroMemory должна принимать два параметра, а не один (о том, что передается ей хрен знает что, я промолчу)

Quote (LepardChih)
ZeroMemory(sizeof("lpByffer/"LP3DAPIWINDOW3D"));

Может быть как-то так(проверить не могу, нет C++ компилятора):
ZeroMemory(lpByffer,sizeof(LP3DAPIWINDOW3D));

lpBuffer - указатель на буфер с данными кадра.
Источник:
"7. Запись видео данных"
http://www.gamedev.ru/code/articles/Avi_Record_Windows

LP3DAPIWINDOW3D - API тип(type) из windows.h ? lpBuffer оттуда же?

А вообще этот кода похож на манипуляции с DirectX или с API. Возможно из windows.h.

Вот только zxRasp прав:
bool GetShablonFunct()
{
return n;
}
Это, в принципе, не должно компилироваться вообще. Ибо n не объявлена. Большинство компиляторов должно показать ошибку.

Quote (zxRasp)
Ну если её и объявить, толку то что?

Если объявить программа в принципе должна откомпилироваться, но выдав сообщение(warning) "Переменная не инициирована".
По умолчанию это будет кусок памяти возможно обнулённый, тогда перем. = false. А, возможно, содержащий какие-то обрывки информации, тогда булеан = true.


Сообщение отредактировал LepardChih - Пятница, 04.12.2009, 19:35
 
MolchДата: Пятница, 04.12.2009, 21:55 | Сообщение # 5
Сержант
Группа: Пользователь
Сообщений: 12
Награды: 0
Репутация: 5
Статус:
Н-да уж, повесилил =)

Добавлено (04.12.2009, 21:53)
---------------------------------------------
З.Ы.
Вот, пожалуй, лучший урок по загрузке 3DS, который я видел:
Статья на Render.ru

Добавлено (04.12.2009, 21:55)
---------------------------------------------
^
| - Вот это, я понимаю, урок, а то, что написал автор - бред сумасшедшего...

 
LepardChihДата: Суббота, 05.12.2009, 00:01 | Сообщение # 6
Сержант
Группа: Пользователь
Сообщений: 12
Награды: 0
Репутация: 0
Статус:
Тут написано как загружать простенькие объекты в OpenGL, в оконном режиме, аж на трёх компиляторах(Delphy, Borland C++ и VC++).
http://www.gamedev.ru/code/articles/?id=4170

Как загрузить из SMD формата(HalfLife2, CS):
http://www.gamedev.ru/code/faq/?id=3577

Как ни странно в этой статье почти нифига нет о структуре SMD. Или если есть надо очень долго и упорно разбираться в дебрях кода.

Вот эти статейки попроще:
Проблемы конвертирования из 3DSM в SMD формат. Часть 1. Конвертирование «базового» smd файла.
http://glscene.ru/content.php?article.90

Проблемы конвертирования из 3DS Max в SMD формат. Часть 2. Конвертирование АНИМАЦИИ из 3DS Studio Max в smd формат.
http://glscene.ru/content.php?article.99

Что надо знать по последним двум статьям:
1. Из-за того, что PHP процессор сайта кое-где в коде 3DSM скриптов убрал значки "больше"/"меньше" и из-за того, что буква i в скобочках расценивается им как "курсив"
(например так когда так)

Code
Arr[i]

вставить код методом копипаста не получится.

2. Не в самой статье, но в комментах говорится, что ориентация костей высчитывается НЕ в кватернионах.
А В УГЛАХ ЭЙЛЕРА.:

ninth | 06.04.09 - 04:10
Ыыы...я последние 3 дня бился головой ап стену - корректировал свой экспортёр в SMD для Блендера. У меня та же фигня с анимацией оказалась - для простых движений вроде всё нормально, но более сложные отображались не совсем корректно, как ты пояснил "как будто не до конца". В общем, буквально 10 минут назад я его победил - оказалось, что SMD для задания ориентации кости использует углы эйлера в радианах, причём в локальных координатах родительской кости. До этого я тщетно пытался спецификацию формата найти, но так и не нашёл, поэтому пробовал использовать для задания ориентации сначала вектор, потом кватернион и, как уже сказал - получал похожий результат, но не совсем.

Так что на данный момент я испытываю чувство эйфории от одержанной победы ))) И надеюсь, что новых косяков не всплывёт. Ещё потестю скрипт и выкину на сайт для пользования - если кому нужно будет.

Очень неплохая статья посвящённая скелетной анимации(хоть и устаревшая, но приводятся очен ценные формулы по работе с кватернионами):
http://www.gamedev.ru/code/articles/?id=4273

Вот и всё про форматы на пока.

 
Форум » Создание игр » Программирование » Уроки по написанию проги для загрузки 3DS Модели (Уроки по написанию проги для загрузки 3DS Модели)
  • Страница 1 из 1
  • 1
Поиск: