效果图如图所示,模型的创建过程可参考上一篇博文,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();
}
}
- 在 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