Nebula Device - Урок 3
Автор: Daddy
WEB-сайт: http://daddy.mirgames.ru
Объект SceneGraph для визуализации 3-х мерной модели.
Привет! Сегодня мы будем рассматривать высококачественный процесс визуализации в Небуле: SceneGraph. Цель этого урока дать вам понять как в Небуле работает SceneGraph и как создать текстурируемую модель(3D).
Немного теории
- SceneGraph-объект для работы с процессом рендеринга. Процесс рендеринга Небулы-heirarchie.
- SceneGraph-объект для обращения с процессом рендеринга. Процесс рендеринга Небулы-heirarchie. - n3Dnode содержит информацию преобразования. Это центр выполняющейся информации. Это единственный объект который вы должны прикрепить на форму.
- nMeshNode - Меш готовый к визуализации, содержащий вершину, координаты текстуры и т.д.
- nTexArrayNode содержит текстуры, которые использует nShaderNode.
- Есть и другие большие объекты, но сейчас они не нужны.
Иерархия, которую мы собираемся устанавливать:
Usr-очистка директории
\trans1- n3Dnode-основной объект нашей сети
\mesh1-nMeshNode-сеть, содержащая геометрию
\shader1-nShaderNode-программа построения теней
\texture1-nTexArrayNode-объект содержащий нашу текстуру
Процесс визуализации. scenegraph визуализирует узлы, но как? - Вы прикрепляете их между gfx-> BeginScene () и gfx-> EndScene () у вас будет SceneGraph-> BeginScene () и SceneGraph-> EndScene (). SceneGraph-> BeginScene () возвращает nSGNode, который является в настоящее время свободным узлом в Пул узла Сценеграфа. Вы передаете это к объекту n3DNode, через Attach. Это заполнит nSGNode его позиционной информацией, например, nMeshNode дочерние записи это передало бы nSGNode указатель на них, так они заполнили бы сеть data.nTexArray, узел заполняет данные текстуры, и т.д.
Теперь вы имеете достаточно теории чтобы приниматься за практику.
На сей раз я только представлю здесь новые части кода
#include
#include
#include
#include
#include
n3DNode *TNode = 0l;
nMeshNode *Mesh = 0l;
nShaderNode *Shader = 0l;
nTexArrayNode *TexArray = 0l;
в Init цикле, после создания
SceneGraph =
(nSceneGraph *)Kernel->New("nscenegraph","/sys/servers/sgraph");
// create the scenegraph
TNode = (n3DNode *) Kernel->New("n3dnode","/usr/trans1");
Mesh = (nMeshNode *) Kernel->New("nmeshnode","/usr/trans1/mesh1");
Shader = (nShaderNode *) Kernel->New("nshadernode",
"/usr/trans1/shader1");
TexArray = (nTexArrayNode *) Kernel->New("ntexarraynode",
"/usr/trans1/texture1");
// create our objects just like regular nebula objects
// take a look on where goes the heirarchie
Shader->SetNumStages(1);
Shader->SetColorOp(0, "mul tex prev");
// simple texturing, only one render stage
Shader->SetLightEnable(false);
// disable lights or our model will be all black
// cos we're not gonna set up lights
TexArray->SetTexture(0, "texture.bmp", NULL);
// set texture file to be loaded(in compute() i think)
Mesh->SetFilename("Box.n3d");
// set mesh file to be loaded(in compute())
// feel free to change the file's name
// get some at data\texdemos\meshes\
в основном цикле, между gfx-> beginscene () *gfx-> endscene (): (вычистите существующий код между ними кроме счетчика FPS)
Gfx->BeginScene();
rangle+=0.2f; // increase rotation angle
ViewMatrix.ident();
// set the view to the identity
// there are alot of cares we do not need now (like inverting the view matrix)
// cause were only gonna setup a single mesh, not
// a big world
TNode->Txyz(0,0,0);
TNode->Rxyz(df,df*0.5,df*0.75);
TNode->Sxyz(0.25f,0.25f,0.25f);
// Set the T info (position) , the R (rotation) and S(scaling)
// so that it can build a matrix for the transformation
// phase
// create a nSGNode & get it from BeginScene
nSGNode *sgn;
if((sgn = SGraph->BeginScene(ViewMatrix)) != 0)
{
TNode->Attach(SGraph,sgn);
// only attach the n3DNode, cos it will pass the
// nSGNode to its children
SGraph->EndScene(); // call compute(), light, transform, render.
}
// put here the fps counter
Gfx->EndScene(); // end rendering loop
Теперь End. Это было самое тяжёлое, но оно того стоит.
Исходник можно скачать тут: tutor3.rar
|