昆特牌Online——客户端用到的一些技术

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了昆特牌Online——客户端用到的一些技术相关的知识,希望对你有一定的参考价值。

[1]    通过建模软件(如3D Max)对游戏场景中的静态对象和动态角色进行建模。

 

游戏的牌桌和右下角的工作室标志使用了3ds Max建模

 

牌桌:

 技术分享

 

标志:

 技术分享

 

 

[2]    基于Phong光照模型实现场景的实时光照。

 

游戏中使用了两个光源:

 

一个静止的无向光源,放置于与摄像机相同的位置;

 

一个运动的有向聚光灯,会追踪鼠标的运动,效果如下:

 

 技术分享

技术分享

 

 

可以看出,截图中鼠标经过的部分(鼠标未在截图中显示)物体被照亮。

 

代码方面,使用osg::Light和osg::LightSource来指定光源,聚光灯的部分代码如下:

light2_obj = new osg::Light;
light2_obj->setLightNum( 1 );  
light2_obj->setAmbient(osg::Vec4(0.5,0.5,0.5,1.0));
light2_obj->setDiffuse( osg::Vec4(1.0,1.0,1.0,1.0) ); 
light2_obj->setSpecular( osg::Vec4(1.0,1.0,1.0,1.0) ); 
light2_obj->setPosition( osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f) ); 
light2_obj->setSpotExponent(1.0);
light2_obj->setSpotCutoff(45.0);
light2_obj->setDirection(osg::Vec3(0.0,10.0,0.0));

osg::ref_ptr<osg::LightSource> lightSource2 = new osg::LightSource; 
lightSource2->setLight( light2_obj );
light2 = new osg::PositionAttitudeTransform;
light2->setPosition(osg::Vec3(0.0,0.0,0.0));
light2->addChild( lightSource2.get() );

 

[3]    利用基本纹理映射技术增强游戏场景的真实感。

 

从上面的截图中可以看出,游戏中的物体基本上都是使用了纹理映射的。

 

另外,我还为每个物体指定了材质信息,以实现一些特殊的光照效果,比如下面的自发光效果:(图中发红色的卡牌)

 技术分享

 

 

[4]    基于骨骼动画或者关键帧动画技术实现角色动画。

 

采用了有限动画机实现的关键帧动画。

 

例如,在玩家出牌的过程中,动画机指定了移动路径上的三个关键点:

 

卡牌被选中前自身所在的点、被选中后放大的点(15.5,2.2,0.5)、选中后将牌打出时卡牌运动的路径上的两个关键点(视卡牌类型而不同)。

 

当玩家进行了对应的输入操作后,卡牌会自动沿着指定的路径运动至目的地

 

示例过程如下:

 

1.选中卡牌

 技术分享

 

2.再次点击选中的卡牌,进行出牌动作

 技术分享

 

3.牌被打出

 技术分享

 

[5]    碰撞检测。

  技术分享

卡牌在被打出时,由于它的目的地所在行(黄框所示)可能会有之前先到的牌(蓝圈所示)阻挡其运动路径,每张牌在被打出时需要检测其是否有撞上前面的牌,如果撞上了则停下,没撞上则继续移动直至撞上前一张牌。上图卡牌的运动结果如下:

技术分享

 

[6]    凸凹纹理映射。

 

游戏中的牌桌使用了凹凸纹理技术,可以看出比较明显的效果。

 

有凹凸纹理的:

 技术分享

只有漫反射纹理的:

 技术分享

法线贴图:(使用Nvidia的Photoshop插件绘制)

 技术分享

使用osgFX::BumpMapping实现该效果。

以上是关于昆特牌Online——客户端用到的一些技术的主要内容,如果未能解决你的问题,请参考以下文章

团队项目:昆特牌Online

昆特牌Online——网络消息传输

昆特牌Onlinve——服务器

ACM_题目这么难,来局愉快的昆特牌吧

软工学习笔记——代码规范

第二次作业