我要发帖 回复

中级会员

24

主题

923

积分

0

专家分

:

私信
发表时间 : 2009-3-4 17:23:13 | 浏览 : 4137    评论 : 23
以前曾在论坛上发过一篇OpenFlight API开发教程,只是简单介绍了下OpenFlight API,并没有源代码实例分析,今天继续完善下教程,给大家提供些例子程序吧。
如果需要下载源码,请登陆我的论坛http://www.fg-china.net/
1.最简单的例子,生成一个蓝颜色的矩形面[cpp]// simple.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <stdlib.h>

/* include all API headers */
#include "mgapiall.h"

void main(int argc, char* argv[])
{
        mgrec *db;              /* 根节点 */
        mgrec *GroupNode;                /* 组节点 */
        mgrec *ObjectNode;                /* 体节点 */
        mgrec *PolygonNode;                /* 面节点 */

        unsigned int blue;                /* color indices */
        float inten;                /* color intensity */

        /* 初始化 */
        mgInit (&argc, argv);
       
        /*覆盖已存在的文件 */
        mgSetNewOverwriteFlag (MG_TRUE);

        /*新建文件 */
        if (!(db = mgNewDb ("test.flt")))
        {
                char msgbuf [1024];
                mgGetLastError (msgbuf, 1024);
                printf ("%s\n", msgbuf);
                exit (EXIT_FAILURE);
        }

        /* 新建组节点,父节点为根节点db */
        GroupNode = mgNewRec (fltGroup);
        mgAttach (db, GroupNode);

        /* 新建体节点,父节点为组节点GroupNode */
        ObjectNode = mgNewRec (fltObject);
        mgAttach (GroupNode, ObjectNode);

        /* 得到颜色索引 */
        mgRGB2Index (db, 0, 0, 255, &blue, &inten);

        double ic0[3] = {0., 0., 0.};
        double ic1[3] = {100., 0., 0.};
        double ic2[3] = {100., 100., 0.};
        double ic3[3] = {0., 100., 0.};

        /* 新建面节点,父节点为体节点ObjectNode */
        PolygonNode = mgNewRec (fltPolygon);
        mgAttach (ObjectNode,PolygonNode);

        /* 定义面PolygonNode的四个顶点 */
        mgrec *VrecNode0 = mgNewRec (fltVertex);
        mgAppend (PolygonNode, VrecNode0);
        mgSetVtxCoord (VrecNode0, ic0[0], ic0[1], ic0[2]);

        mgrec *VrecNode1 = mgNewRec (fltVertex);
        mgAppend (PolygonNode, VrecNode1);
        mgSetVtxCoord (VrecNode1, ic1[0], ic1[1], ic1[2]);

        mgrec *VrecNode2 = mgNewRec (fltVertex);
        mgAppend (PolygonNode, VrecNode2);
        mgSetVtxCoord (VrecNode2, ic2[0], ic2[1], ic2[2]);

        mgrec *VrecNode3 = mgNewRec (fltVertex);
        mgAppend (PolygonNode, VrecNode3);
        mgSetVtxCoord (VrecNode3, ic3[0], ic3[1], ic3[2]);

        /* 定义面PolygonNode的颜色 */
        mgSetAttList (PolygonNode, fltPolyPrimeColor, blue, MG_NULL);

        /* 写入文件 */
        mgWriteDb (db);

        /* 关闭文件 */
        mgCloseDb (db);

        /* 程序退出 */
        mgExit ();

}[/cpp]

2.为面添加材质[cpp]// simple.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <stdlib.h>

/* include all API headers */
#include "mgapiall.h"

void main(int argc, char* argv[])
{
        mgrec *db;              /* 根节点 */
        mgrec *GroupNode;                /* 组节点 */
        mgrec *ObjectNode;                /* 体节点 */
        mgrec *PolygonNode;                /* 面节点 */

        /* 初始化 */
        mgInit (&argc, argv);
       
        /*覆盖已存在的文件 */
        mgSetNewOverwriteFlag (MG_TRUE);

        /*新建文件 */
        if (!(db = mgNewDb ("test.flt")))
        {
                char msgbuf [1024];
                mgGetLastError (msgbuf, 1024);
                printf ("%s\n", msgbuf);
                exit (EXIT_FAILURE);
        }

        /* 新建组节点,父节点为根节点db */
        GroupNode = mgNewRec (fltGroup);
        mgAttach (db, GroupNode);

        /* 新建体节点,父节点为组节点GroupNode */
        ObjectNode = mgNewRec (fltObject);
        mgAttach (GroupNode, ObjectNode);

        int newmatindex;
        mgrec        *newmat;
        /* 定义材质属性 */
        newmat = mgNewMaterial (db, "new mat", &newmatindex);
        mgSetNormColor (newmat, fltAmbient, .2f, .2f, .2f);
        mgSetNormColor (newmat, fltDiffuse, 0.f, 0.f, .8f);
        mgSetNormColor (newmat, fltSpecular, .5f, .5f, .5f);
        mgSetAttList (newmat, fltShininess, 100.f,
                fltMatAlpha, 1.0f, MG_NULL);
       
    //顶点坐标
        double ic0[3] = {0., 0., 0.};
        double ic1[3] = {100., 0., 0.};
        double ic2[3] = {100., 100., 0.};
        double ic3[3] = {0., 100., 0.};

        /* 新建面节点,父节点为体节点ObjectNode */
        PolygonNode = mgNewRec (fltPolygon);
        mgAttach (ObjectNode,PolygonNode);

        /* 定义面PolygonNode的四个顶点 */
        mgrec *VrecNode0 = mgNewRec (fltVertex);
        mgAppend (PolygonNode, VrecNode0);
        mgSetVtxCoord (VrecNode0, ic0[0], ic0[1], ic0[2]);

        mgrec *VrecNode1 = mgNewRec (fltVertex);
        mgAppend (PolygonNode, VrecNode1);
        mgSetVtxCoord (VrecNode1, ic1[0], ic1[1], ic1[2]);

        mgrec *VrecNode2 = mgNewRec (fltVertex);
        mgAppend (PolygonNode, VrecNode2);
        mgSetVtxCoord (VrecNode2, ic2[0], ic2[1], ic2[2]);

        mgrec *VrecNode3 = mgNewRec (fltVertex);
        mgAppend (PolygonNode, VrecNode3);
        mgSetVtxCoord (VrecNode3, ic3[0], ic3[1], ic3[2]);

        /* 定义面PolygonNode的材质 */
        mgSetAttList (PolygonNode, fltPolyMaterial, newmatindex,
                fltPolyPrimeColor, 0, MG_NULL);

        /* 写入文件 */
        mgWriteDb (db);

        /* 关闭文件 */
        mgCloseDb (db);

        /* 程序退出 */
        mgExit ();

}[/cpp]

3.为面添加纹理[cpp]// simple.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <stdlib.h>

/* include all API headers */
#include "mgapiall.h"

void main(int argc, char* argv[])
{
        mgrec *db;              /* 根节点 */
        mgrec *GroupNode;                /* 组节点 */
        mgrec *ObjectNode;                /* 体节点 */
        mgrec *PolygonNode;                /* 面节点 */

        /* 初始化 */
        mgInit (&argc, argv);
       
        /*覆盖已存在的文件 */
        mgSetNewOverwriteFlag (MG_TRUE);

        /*新建文件 */
        if (!(db = mgNewDb ("test.flt")))
        {
                char msgbuf [1024];
                mgGetLastError (msgbuf, 1024);
                printf ("%s\n", msgbuf);
                exit (EXIT_FAILURE);
        }

        /* 新建组节点,父节点为根节点db */
        GroupNode = mgNewRec (fltGroup);
        mgAttach (db, GroupNode);

        /* 新建体节点,父节点为组节点GroupNode */
        ObjectNode = mgNewRec (fltObject);
        mgAttach (GroupNode, ObjectNode);

        int newmatindex;
        mgrec        *newmat;
        /* 定义材质属性 */
        newmat = mgNewMaterial (db, "new mat", &newmatindex);
        mgSetNormColor (newmat, fltAmbient, .2f, .2f, .2f);
        mgSetNormColor (newmat, fltDiffuse, 0.f, 0.f, .8f);
        mgSetNormColor (newmat, fltSpecular, .5f, .5f, .5f);
        mgSetAttList (newmat, fltShininess, 100.f,
                fltMatAlpha, 1.0f, MG_NULL);
       
        int newtexindex;
    newtexindex=mgInsertTexture(db, "ware_house2.rgb");

    //顶点坐标
        double ic0[3] = {0., 0., 0.};
        double ic1[3] = {100., 0., 0.};
        double ic2[3] = {100., 100., 0.};
        double ic3[3] = {0., 100., 0.};

        /* 新建面节点,父节点为体节点ObjectNode */
        PolygonNode = mgNewRec (fltPolygon);
        mgAttach (ObjectNode,PolygonNode);

        /* 定义面PolygonNode的四个顶点 */
        mgrec *VrecNode0 = mgNewRec (fltVertex);
        mgAppend (PolygonNode, VrecNode0);
        mgSetVtxCoord (VrecNode0, ic0[0], ic0[1], ic0[2]);
    mgSetAttList(VrecNode0, fltVU, 0.0, fltVV, 0.0, mgNULL);

        mgrec *VrecNode1 = mgNewRec (fltVertex);
        mgAppend (PolygonNode, VrecNode1);
        mgSetVtxCoord (VrecNode1, ic1[0], ic1[1], ic1[2]);
        mgSetAttList(VrecNode1, fltVU, 0.5, fltVV, 0.0, mgNULL);

        mgrec *VrecNode2 = mgNewRec (fltVertex);
        mgAppend (PolygonNode, VrecNode2);
        mgSetVtxCoord (VrecNode2, ic2[0], ic2[1], ic2[2]);
        mgSetAttList(VrecNode2, fltVU, 0.5, fltVV, 0.5, mgNULL);

        mgrec *VrecNode3 = mgNewRec (fltVertex);
        mgAppend (PolygonNode, VrecNode3);
        mgSetVtxCoord (VrecNode3, ic3[0], ic3[1], ic3[2]);
        mgSetAttList(VrecNode3, fltVU, 0.0, fltVV, 0.5, mgNULL);

        /* 定义面PolygonNode的材质 */
        mgSetAttList (PolygonNode, fltPolyMaterial, newmatindex,
                fltPolyPrimeColor, 0, MG_NULL);

        /* 定义面PolygonNode的纹理*/
        mgSetAttList(PolygonNode,fltPolyTexture,newtexindex,mgNULL);

        /* 写入文件 */
        mgWriteDb (db);

        /* 关闭文件 */
        mgCloseDb (db);

        /* 程序退出 */
        mgExit ();

}[/cpp]

总的来说,OpenFlight API的开发是比较简单的,自带的帮助文档提供了详细的开发过程,有什么问题可以查看帮助文档。

最近VR访客

TY
cygzr 评论于2009-3-10 14:03:44
收藏慢慢消化
mzhou 评论于2009-3-11 10:47:21

回复 1楼 的帖子

有几个问题:1、我怎么在 openflight API 中编程实现旋成体,比如导弹弹体之类的轴对称图形
            2、是不是在creator图形界面可以完成的操作基本都可以利用编程实现?
麻烦高手了,期待!
acuiping 评论于2009-3-13 08:14:45
下载了,慢慢学习
again3747 评论于2009-3-14 10:42:10
这些才是高手啊,编程的
phoenix 评论于2009-4-9 16:03:50
太感谢了,最近在做课题,正对它饥渴呢!
soar 评论于2009-5-12 14:03:34
先留着,慢慢学习!
sofina_ywm 评论于2009-5-12 15:38:28
虽然不明白,但还是感谢楼主!
新手 评论于2009-5-15 09:16:39
先收下,学习ing
3q
fiso826 评论于2010-4-3 21:10:47
楼主,谢谢嗷!
fiso826 评论于2010-4-3 21:11:31
楼主,谢谢嗷!
hhqxxh 评论于2010-4-13 20:24:52
佩服编程者。不过鄙人觉得,能够用软件实现的就不要编程咯。浪费时间是不是?
lovehunter 评论于2010-4-23 09:25:18
老弟,那是你的论坛吗?
以假代真 评论于2010-8-23 21:24:12
先收藏了。。。
mihlin 评论于2010-12-14 10:14:18
帮我解决了难题,感谢哦~
fliedbird 评论于2010-12-17 13:04:42
有用api的必要吗...还没遇到..不过编程序的人确实有才
fanfulin 评论于2011-1-7 15:32:42
支持
taojiuyang 评论于2011-3-29 09:34:25
你的论坛找不到服务器啊
ggw0122 评论于2011-4-8 21:24:21
谢谢了,学习了
ggw0122 评论于2011-4-8 21:29:17
谢谢了,学习了

手机版|VR开发网 ( 津ICP备18009691号 ) 统计 网安备12019202000257

GMT+8, 2020-10-23 05:21 PM

返回顶部