在MFC框架中使用Coin3D

这里写图片描述
效果图如图所示,模型的创建过程可参考上一篇博文,COIN3D的安装和配置请参考网上教程,总体思路如下:
这里写图片描述
如何将模型添加到框架中参考以下步骤:
1.创建MFC工程
这里写图片描述
这里写图片描述
此时,运行会报错,原因不明,说ExitInstance()未在CrobApp()中声明,解决办法,即在CrobApp()中声明即可

public:
    virtual BOOL InitInstance();
    virtual int ExitInstance();

2.初始化,参考博客https://blog.csdn.net/RobinHao/article/details/1770580的第二步
3. 创建一个robot类,头文件如下:

#pragma once

#include <Inventor/Win/SoWin.h>
#include <Inventor/nodes/SoCube.h>  //方块
#include <Inventor/nodes/SoSphere.h> //球
#include <Inventor/nodes/SoTransform.h> //坐标转换

#include <Inventor/nodes/SoMaterial.h> //材质
#include <Inventor/nodes/SoCylinder.h> //圆柱
#include <Inventor/nodes/SoSeparator.h> //节点
class robot
{
public:
    robot(void);
    ~robot(void);
public:
    SoSeparator* robb;
    void MakeScene();
};

robot类的实现文件如下:

#include "StdAfx.h"
#include "robot.h"


robot::robot(void)
{
}


robot::~robot(void)
{
}

void robot::MakeScene()
{
    //先初始化下robb
    robb = new SoSeparator;
    robb->ref();

    SoSeparator* rob = new SoSeparator;
    SoSeparator* body = new SoSeparator;
    SoSeparator* head = new SoSeparator;
    SoSeparator* leftleg = new SoSeparator;
    SoSeparator* rightleg = new SoSeparator;
    SoSeparator* leg = new SoSeparator;

    //躯干 socylinder圆柱形
    SoCylinder* bodycylinder = new SoCylinder;
    bodycylinder->radius = 2.5;
    bodycylinder->height = 6;

    SoMaterial* bronze = new SoMaterial;  //设置躯干颜色材质
    bronze->ambientColor.setValue(0.33, 0.22, 0.27);
    bronze->diffuseColor.setValue(0.78, 0.57, 0.11);
    bronze->specularColor.setValue(0.99, 0.94, 0.81);
    bronze->shininess = 0.28;

    //创建机器人的基本腿群组,它由大腿、小腿、和脚构成
    SoCube* thigh = new SoCube;                          //大腿 socube方形
    thigh->width = 1.2;
    thigh->height = 2.2;
    thigh->depth = 1.1;

    SoCube* calf = new SoCube;                           //小腿
    calf->width = 1.0;
    calf->height = 2.2;
    calf->depth = 1.0;

    SoCube* foot = new SoCube;                          //脚
    foot->width = 0.8;
    foot->height = 0.8;
    foot->depth = 2.0;

    //创建机器人的头部
    SoSphere* headsphere = new SoSphere;
    SoMaterial* sliver = new SoMaterial;
    sliver->ambientColor.setValue(0.2, 0.2, 0.2);
    sliver->diffuseColor.setValue(0.6, 0.6, 0.6);
    sliver->specularColor.setValue(0.5, 0.5, 0.5);
    sliver->shininess = 0.5;

    //坐标系建立,自顶向下,方便理解坐标系,设置使所有零件接触
    SoTransform* bodytransform = new SoTransform;  //默认body坐标系与世界坐标系重合

    bodytransform->translation.setValue(0.0, 0.0, 0.0); 

    SoTransform* headtransform = new SoTransform;
    headtransform->translation.setValue(0.0, 4.0, 0.0); //头部默认半径为1,躯干高为6,所以坐标系应该Y轴走4

    SoTransform* lefttransform = new SoTransform;      
    lefttransform->translation.setValue(1.0, -4.1 , 0.0); //因为左腿坐标系和大腿坐标系重合的,所以Y轴3+1.1 = 4.1

    SoTransform* righttransform = new SoTransform;         
    righttransform->translation.setValue(-1.0, -4.1, 0.0);

    //同一行的坐标系是相对的,soseparator中
    SoTransform* thightransform = new SoTransform;
    thightransform->translation.setValue(0.0, 0.0, 0.0);  //大腿坐标系与leg的坐标系重合

    SoTransform* calfTransform = new SoTransform;          //小腿1.1+1.1
    calfTransform->translation.setValue(0.0, -2.2, 0.0);

    SoTransform* foottransform = new SoTransform;            //脚1.1+0.4
    foottransform->translation.setValue(0.0, -1.5, 0.5);

    //组建层次结构,从底向下
    leg->addChild(thightransform);
    leg->addChild(thigh);
    leg->addChild(calfTransform);
    leg->addChild(calf);
    leg->addChild(foottransform);
    leg->addChild(foot);

    leftleg->addChild(lefttransform);
    leftleg->addChild(leg);

    rightleg->addChild(righttransform);
    rightleg->addChild(leg);

    body->addChild(bodytransform);
    body->addChild(bronze);
    body->addChild(bodycylinder);
    body->addChild(leftleg);
    body->addChild(rightleg);


    head->addChild(headtransform);
    head->addChild(sliver);
    head->addChild(headsphere);


    rob->addChild(body);
    rob->addChild(head);

    robb->addChild(rob);
}

4.在CrobView类的头文件中增加两个成员变量

public:
    SoWinExaminerViewer* viewer; //定义了COIN3D的显示
    robot* root;   //定义了一个robot类的变量,即对象

`
在实现文件的构造函数和析构函数中输入:

 CrobView 构造/析构

CrobView::CrobView()
{
    // TODO: 在此处添加构造代码
    viewer = NULL;
    root = new robot;
    root->MakeScene();



}

CrobView::~CrobView()
{
    if (viewer != NULL)
    {
        delete viewer;
        root->robb->unref();
    }
}
  1. 在 CrobView::OnDraw函数中添加如下:
void CrobView::OnDraw(CDC* pDC)
{
    CrobDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    //此处插入代码
    if (viewer == NULL)
    {
        viewer = new SoWinExaminerViewer(GetSafeHwnd());
        viewer->setSceneGraph(root->robb);
        viewer->show();
        viewer->viewAll();
    }


    //
    if (!pDoc)
        return;

    // TODO: 在此处为本机数据添加绘制代码
}

通过本次练习,更加明白C++是面向对象的程序设计

robot* root;
root = new robot;// 建立了一个robot类的新对象

源码下载链接如下:https://download.csdn.net/download/weixin_42355349/10657645

猜你喜欢

转载自blog.csdn.net/weixin_42355349/article/details/82594418