Balder 3D开发系列之--建立本身的primitives

1、About primitiveshtml

 

        在Balder中,有不少已经建立好了的基本体,你只要直接调用就能够了,这和3DMax等软件相似,里面也提供了一系列的基本体,给设计者扩展使用。目前,Balder的Geometries命名空间下已经有Box,Cylinder,Ring等等基本体。在以前的文章中,咱们已经使用过了其中的Box,也就是那个立方体。固然,若是就这么些基本体,对于愈来愈复杂的需求,是不够的,所以Balder提供更大的扩展性。那么,该如何实现呢?请往下看...express

 

2、How to create your own primitivesvim

 

        想要建立自定义的基本体,其实很简单,基本体,说到底其实就是一个Geometry(几何体)。而在Balder中,每一个Geometry拥有一个实现了IGeometryContext  接口的GeometryContext类的属性,经过GeometryContext就能够建立被称为GeometryDetailLevel的东西。那么GeometryDetailLevel又是什么东西呢?它其实就是按照Balder想要进行渲染的细分级别来被渲染的一个对象。在大部分状况下,balder使用full detail level来进行渲染。在Geometry中有一个FullDetailLevel 属性,经过它,咱们就能够方便的来产生一个几何体了。浏览器

 

3、a demo for creating a primitiveapp

        接下来,经过一个实例,来示范下基本体的建立过程,这里,咱们经过建立一个三棱锥来做为例子:ide

首先,你须要建立一个你本身的基本体类继承自Geometry类函数

using  Balder.Objects.Geometries;
 
namespace  MeshDemo
{
    
public   class  MyMesh:Geometry
    {
    }
}

这样,你就能够把该对象加到页面中去了,就像这样:spa

 1  < UserControl  x:Class ="MeshDemo.MainPage"
 2      xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3      xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
 4      xmlns:d ="http://schemas.microsoft.com/expression/blend/2008"
 5      xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6      xmlns:Execution ="clr-namespace:Balder.Execution;assembly=Balder"
 7      xmlns:View ="clr-namespace:Balder.View;assembly=Balder"
 8      xmlns:Lighting ="clr-namespace:Balder.Lighting;assembly=Balder"          
 9      xmlns:Local ="clr-namespace:MeshDemo"
10      mc:Ignorable ="d"
11      d:DesignHeight ="300"  d:DesignWidth ="400" >
12 
13       < Grid  x:Name ="LayoutRoot" >
14           < Execution:Game  Width ="640"  Height ="480"   >
15               < Execution:Game.Camera >
16                   < View:Camera  Position ="-10,5,-10" />
17               </ Execution:Game.Camera >
18                   < Local:MyMesh />               <!-- 加进去的基本体对象 -->
19           </ Execution:Game >
20       </ Grid >
21  </ UserControl >

可是,你此时编译运行它,在浏览器中,什么都看不到。由于,如今在几何体类中,没有建立任何的几何数据,为了建立这些,你须要实现重载Prepare()方法:设计

1  public   override   void  Prepare(Viewport viewport)
2  {
3  }
4 

 经过该方法,咱们将加入3D网格数据,以建立基本体三棱锥,这里主要由三部分组成:code

1.Vertices( 顶点)

2.Lines (线)

3.Face(面)

为了使得结构更清晰,咱们把它们分别封装在三函数中:

private void GenerateVertices()  //建立顶点

private void GenerateLines()   //建立线

 private void GenerateFaces()  //建立面

接下来,咱们一个个来分别完成,首先是建立顶点的:

 1    private   void  GenerateVertices()
 2          {
 3              var dimensionAsVector  =   new  Vertex(5f, 5f, 5f);
 4              var halfDimension  =   new  Vertex( 2.5f 2.5f 2.5f );
 5              var Top  =   new  Vertex(0f, dimensionAsVector.Y, 0f);
 6              var backBottomLeft  =   new  Vertex( - (halfDimension.X / 2 ) * sqt, 0f, halfDimension.Z / 2 );
 7              var backBottomRight  =   new  Vertex(halfDimension.X / 2 * sqt, 0f, halfDimension.Z / 2 );
 8              var frontBottom  =   new  Vertex(0f, 0f,  - halfDimension.Z);
 9              FullDetailLevel.AllocateVertices( 4 );
10              FullDetailLevel.SetVertex( 0 , Top);
11              FullDetailLevel.SetVertex( 1 , backBottomLeft);
12              FullDetailLevel.SetVertex( 2 , backBottomRight);
13              FullDetailLevel.SetVertex( 3 , frontBottom);
14 
15              
16          }
在balder中的3D点是经过Vertex(x,y,z)对象生成的,其参数表明在所在坐标。前面两行只是实例化了两个Vertex对象,在后面能够经过其的X,Y,Z属性进行初始化三棱锥顶点坐标位置。三棱锥一共有4个顶点,因此FullDetailLevel.AllocateVertices(4);分配了4个顶点。其中的sqt是一个常量,为了控制在空间中的位置,没必要理会,你能够本身定义基本体的空间位子。
对于线的函数,与之相似,就不详细介绍,直接看代码:
 1      private   void  GenerateLines()
 2          {
 3              FullDetailLevel.AllocateLines( 6 );
 4              FullDetailLevel.SetLine( 0 new  Line( 0 1 ));
 5              FullDetailLevel.SetLine( 1 new  Line( 1 3 ));
 6              FullDetailLevel.SetLine( 2 new  Line( 0 2 ));
 7              FullDetailLevel.SetLine( 3 new  Line( 3 2 ));
 8              FullDetailLevel.SetLine( 4 new  Line( 1 2 ));
 9              FullDetailLevel.SetLine( 5 new  Line( 0 3 ));
10          
11 
12          }

完成这两个函数,咱们在 Prepare函数中调用它们,运行后你会看到这样的结果:

 这样一个基本体就建立好了,固然,若是想要看到实体的话,就还须要完成面的组成函数:

  private   void  GenerateFaces()
        {

            FullDetailLevel.AllocateFaces(
4 );
            FullDetailLevel.SetFace(
0 new  Face( 3 1 0 ));
            FullDetailLevel.SetFace(
1 new  Face( 2 3 0 ));
            FullDetailLevel.SetFace(
2 new  Face( 2 0 1 ));
            FullDetailLevel.SetFace(
3 new  Face( 3 2 1 ));
          

        }

 

 

 

 在建立面的时候须要注意,就是顶点的链接顺序,每一个面由三个顶点组成的,依次链接它们,在balder中链接顺序是按照顺时针方向的(这和Opengl正好相反),并且是你必须在几何体的外面来观察它。本身画个图形,应该容易理解,弄好后,别忘了加入到Prepare函数,运行,看结果:

 

你会发现,怎么是黑的?主要有两个缘由:一是尚未给场景添加灯光照亮,二是须要法向量。balder中提供了一个 GeometryHelper对象,经过它,就能够方便的建立法向量:

在建立好顶点和面后加入:    GeometryHelper.CalculateNormals(FullDetailLevel); 

而后咱们在修改xaml文件:

1  < Grid  x:Name ="LayoutRoot" >
2           < Execution:Game  Width ="640"  Height ="480"   >
3               < Execution:Game.Camera >
4                   < View:Camera  Position ="-10,5,-10" />
5               </ Execution:Game.Camera >
6               < Lighting:OmniLight   Position ="10,20,-15"    />
7               < Local:MyMesh  InteractionEnabled ="True"  Color ="Blue" />
8           </ Execution:Game >
9       </ Grid >

 

加入灯光和物体颜色,ok,搞定,看看最后效果:

相关文章
相关标签/搜索