Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Nebula Device - Урок 3

Автор: Daddy
WEB-сайт: http://daddy.mirgames.ru

Объект SceneGraph для визуализации 3-х мерной модели.

Привет! Сегодня мы будем рассматривать высококачественный процесс визуализации в Небуле: SceneGraph. Цель этого урока дать вам понять как в Небуле работает SceneGraph и как создать текстурируемую модель(3D).


Немного теории

  1. SceneGraph-объект для работы с процессом рендеринга. Процесс рендеринга Небулы-heirarchie.
  2. 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

Проект Delphi World © Выпуск 2002 - 2024
Автор проекта: USU Software
Вы можете выкупить этот проект.