CSDN真恶心

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在今天早上的时候,我就已经实现了

当方块在0,0,0点时的自由拖动

pic

"请大家自动忽略头顶一行上下左右,那是我蠢了

一开始我为方块的每一个面都定义了一个material,但后来我发现其实只用定义一个material,不同地方的贴图用不同的纹理坐标就可以解决"

 

然后今天一整个下午都在研究

方块不在0,0,0 点时的自由拖动

实在是很头疼,主要碰到的问题有以下两个:

1.当方块不在0,0,0点时,旋转要先加上偏移量。本身我对四元数就不熟,弄了半天它还是再瞎转。

2.在我看来这个问题要比上个问题严重,那就是当物体靠近摄像机的边缘时,会发生很严重的形变

就像这样:

这实在是太2b了(不要问为什么头顶那一行不会发生形变,因为头顶那一行是2D图片,不归SceneManager管,而我的立方体是3D实体)

 

为了解决这两个问题我首先想到的是使用RTT技术生成一张纹理图,因为2D纹理是不会发生形变的

而且立方体因为要被RTT,所以无所谓摆放的位置

但这个想法被我否决了,原因也有三点:

1.纹理图是不透明的,我不想右下角有一块长方形多出来……(也许可以通过某些方法把纹理图的某一种颜色完全扣掉以实现透明,不过感觉太麻烦了)

2.使用这种方法就无法使用Ogre提供的鼠标拾取功能了,比较麻烦

3.3dsMax的导航立方体点钟某个面时那个面会高亮,而且整个镜头会移动到相应视角(比如我点左,那么镜头就会切换到左视图)。如果使用RTT,这点貌似很难实现……

 

既然用不了RTT,我想到的解决方法就是用Ogre的Overlay,因为我在Ogre的Manual里面看到它说,Overlay是可以放置3D物体的

可是悲剧的是…我居然在Ogre官网上找不到关于Overlay的教程!

我估计是因为,Overlay本质上就是Ogre老版本中做界面的东西,后来有了CEGUI,所以Ogre就抛弃了Overlay……

于是我这一个下午时间都花在到处找资料外加尝试使用Overlay上面了

在大概六点的时候我终于成功了……但是我发现使用了Overlay以后物体该形变的还是会形变

事实上上面那幅图就是我Overlay成功以后的截图……

 

那么现在我既不能用Overlay,又不能用RTT,一切都打回原型,我要使用最2B的方法来解决形变和旋转角度问题

 

首先我要解决的是物体形变

物体形变是由于Ogre十分忠实地反映了镜头形变所导致的

普通单反镜头在镜头边缘的图像也会产生形变,尤其是广角镜头边缘产生的形变更加明显

所以我想到的2B解决方法就是通过设置镜头的FOV把镜头给变成长焦

我重载了_createCamera()函数,并把镜头的FOV从0.785(大概是45度)设置到0.4

虽然还是有那么一点形变,不过已经很不明显了

而且我也不准备继续把FOV的值降低了……再降就要变成正交投影了……

 

好吧,大体上结果就是这样子

把物体挂载到cloverRoot节点上,再通过拖动立方体,就可以实现视角的变换

其实依旧存在一些问题:在几次拖动之后我并没有重新计算旋转轴,所以之后的拖动会很不准确

不过考虑到这个只是个骨架系统,我就没必要求精了,不过最好还是把一些待完成的细节记下来

1.每次拖动的时候重新计算旋转轴

2.当鼠标悬停在某个面时,高亮该面

3.当鼠标点击某个面时,视角切换到那个面

4.换个漂亮点的立方体……

 

ogre模型边缘高亮传送门:http://www.cnblogs.com/lai3d/archive/2010/01/21/1653128.html

 

接下来要做的事:

编写MousePicker模块,当鼠标点中折纸时,高亮选中的顶点,边或面

我预感到这是一个百年基业,以后所有的工具都是派生自我的MousePicker哇咔咔

能遇见到的两个困难:

1.ogre只能定位到movable object,剩下的工作要我自己完成

2.我并没有折纸的逻辑层数据结构,这要我和我的组员多加沟通

posted on 2012-02-02 18:59  Kid桑  阅读(209)  评论(0编辑  收藏  举报