Clover CubeNav基本实现"/>
2月2日 Clover CubeNav基本实现
2月2日 Clover CubeNav基本实现在今天早上的时候,我就已经实现了
当方块在0,0,0点时的自由拖动
"请大家自动忽略头顶一行上下左右,那是我蠢了
一开始我为方块的每一个面都定义了一个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模型边缘高亮传送门:.html
接下来要做的事:
编写MousePicker模块,当鼠标点中折纸时,高亮选中的顶点,边或面
我预感到这是一个百年基业,以后所有的工具都是派生自我的MousePicker哇咔咔
能遇见到的两个困难:
1.ogre只能定位到movable object,剩下的工作要我自己完成
2.我并没有折纸的逻辑层数据结构,这要我和我的组员多加沟通
posted on 2012-02-02 18:59 Kid桑 阅读( ...) 评论( ...) 编辑 收藏转载于:.html
更多推荐
2月2日 Clover CubeNav基本实现
发布评论