设为首页收藏本站新闻投稿

MOD中国同盟社

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 811|回复: 5

[原创] [vs2010-vc]实现用Ogre读取mdl模型了 [复制链接]

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

帖子
1011
精华
2
声望
24573 点
金币
154 Mold
被赞许
14 次
注册时间
2008-8-7

新人进步奖 Modchina元老 可爱小猫 懒人勋章

发表于 2012-4-23 19:33:14 |显示全部楼层
事实上模型是用Opengl渲染的,并没有用到Ogre函数

实现是这样的
1、DrawMDL 继承  Ogre:: RenderQueueListener  ,
2、在类的构造时候进行一些Opengl的初始化
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);   
glClearDepth(1.0f);

// misc
glDisable(GL_POLYGON_SMOOTH);
glDisable(GL_POLYGON_STIPPLE);
glDisable(GL_DITHER);
glDisable(GL_NORMALIZE);
glDisable(GL_LOGIC_OP);

// texture settings
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);        
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

// depth buffer
glEnable(GL_DEPTH_TEST);        // Hidden surface removal
glDepthFunc(GL_LESS);
glDepthMask(GL_TRUE);

// nice perspective
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

// culling
glCullFace(GL_FRONT);
glEnable(GL_CULL_FACE);


3、然后在Ogre渲染队列直接加进Opengl代码就可以

//
class DrawMDL : public Ogre::RenderQueueListener
//
virtual void  renderQueueStarted(Ogre::uint8 queueGroupId, const Ogre::String &invocation, bool &skipThisInvocation)
        {
                glPushMatrix();
                glRotatef(90,-1,0,0);
                glRotatef(90,0,0,-1);
                float current        = GetTickCount()/1000.0f;
                static float        previous;
                mModel->SetBlending(0, 0.0f);
                mModel->SetBlending(1, 0.0f);
                mModel->AdvanceFrame(current - previous);
                mModel->DrawModel();
                previous        = current;
                glPopMatrix();
        }


不用装OgreSDK也可以编译,因为文件包含了小部分的sdk资源,所以可以用vs2010直接编译,
代码里面也实现了一些第一人称的Camera,(用Ogre很简单就实现了)
框架是用旁观者 madmarx 的教程修改的,主要修改了他的视口创建和添加第一人称Camera部分
将来会用这种简单的方法显示bspv30文件。

[hide]

[/

hi

de

]


































附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Honorary Member

冇有模型的斑竹

Rank: 7Rank: 7Rank: 7

帖子
2870
精华
0
声望
14751 点
金币
255 Mold
被赞许
195 次
注册时间
2011-6-15

MTT职员 可爱小猫 懒人勋章 Modchina灌水王

发表于 2012-4-23 19:49:46 |显示全部楼层
沙发,看不懂的东西

点评

小炀火线  Me too!  发表于 2012-4-24 18:00:14

使用道具 举报

Rank: 7Rank: 7Rank: 7

帖子
565
精华
0
声望
2971 点
金币
52 Mold
被赞许
36 次
注册时间
2010-2-13
发表于 2012-4-23 20:50:39 |显示全部楼层
强悍.....................
欢迎加入讨论群 164384320

使用道具 举报

Rank: 5Rank: 5

帖子
297
精华
0
声望
895 点
金币
144 Mold
被赞许
1 次
注册时间
2011-6-1
发表于 2012-4-24 18:30:04 |显示全部楼层
7分卷要14威望呢
不过是好东西

使用道具 举报

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

帖子
1011
精华
2
声望
24573 点
金币
154 Mold
被赞许
14 次
注册时间
2008-8-7

新人进步奖 Modchina元老 可爱小猫 懒人勋章

发表于 2012-4-24 19:23:18 |显示全部楼层
本帖最后由 p5248891 于 2012-4-24 19:26 编辑

补充一个第三人称的相机
  1. {
  2.    lMouse->capture();
  3.    const OIS::MouseState& lMouseState = lMouse->getMouseState();
  4.    float lMouseX = float(lMouseState.X.rel);
  5.    float lMouseY = float(lMouseState.Y.rel);
  6.    float lMouseSensitivity=0.2f;
  7.    //把鼠标移动的距离化为相机移动的角度
  8.    Ogre::Degree angleX (lMouseX  *lMouseSensitivity);  
  9.    Ogre::Degree angleY (lMouseY  *lMouseSensitivity);
  10.    static Ogre::Degree lAngleYCalculate(0);
  11.    static Ogre::Degree lAngleXCalculate(0);
  12.    lAngleYCalculate+=angleY;
  13.    //控制角度的范围
  14.    if(lAngleYCalculate>Ogre::Degree(89.9f))
  15.     lAngleYCalculate=Ogre::Degree(89.9f);
  16.    else if(lAngleYCalculate<Ogre::Degree(-89.9f))
  17.     lAngleYCalculate=Ogre::Degree(-89.9f);
  18.    lAngleXCalculate+=angleX;
  19.    if (lAngleXCalculate> Ogre::Degree(360))
  20.    {
  21.     lAngleXCalculate=Ogre::Degree(0);
  22.    }
  23.    //设置相机的目标点和与目标点的固定距离
  24.    Ogre::Vector3 lLookAt(0,0,0);
  25.    float lDistance=100;
  26.    //第三人称算法
  27.    Ogre::Vector3 lXComponent(lDistance*Ogre::Math::Sin(-lAngleXCalculate),0,lDistance*Ogre::Math::Cos(-lAngleXCalculate));
  28.    lXComponent.normalise();
  29.    lXComponent=lXComponent*lDistance*Ogre::Math::Cos(lAngleYCalculate);
  30.    Ogre::Vector3 lYComponent(0,lDistance*Ogre::Math::Sin(lAngleYCalculate),0);
  31.    Ogre::Vector3 lTpPosition=lXComponent+lYComponent;
  32.    lCamera->setPosition(lTpPosition+lLookAt);
  33.    lCamera->lookAt(lLookAt);
  34.   }
复制代码
细心看一下图,
黑色线所在的 相机为原始相机,
绿色线所在的相机是鼠标往 Y 轴移动后方位
红色线所在的相机是鼠标往 X 轴移动后方位
而蓝绿色所在的相机 即是所求的第三人称相机位置




附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 7Rank: 7Rank: 7

帖子
567
精华
0
声望
2374 点
金币
344 Mold
被赞许
15 次
注册时间
2011-4-7

可爱小猫 懒人勋章

发表于 2012-4-25 13:02:02 |显示全部楼层
p5248891  你学 VC++ 好强悍,佩服....
START /在我右心房的中心街部位,保留着那一份属于我们的仅存的记忆。有一种幸福叫等待,我要旳是爱不是安

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

回顶部