3D模型的载入在前面已经说过了,jpct-ae中的方法非常简单。
这里要说的是第三人称视角的3D场景漫游。第三人称视角是说在3D场景中有一个漫游的物体,这个物体并非我们当前的camera,如果是camara的话,就是第一人称视角了。
以第三人称视角漫游的时候要注意几个问题,或者说实现一下的几个效果。
1、当物体漫游时,我们的视角(即当前camera)也随之移动。
2、当物体旋转时,我们的视角也随之旋转。
3、该物体的center(中心)与视角是相对静止的。
4、3D空间中的物体往往被看做一个点来进行操作,而我们可能希望它是有体积的,并且移动的时候遵循一些规则。例如,这个物体是一辆车,我们总是希望车是从头尾相连的连线的方向移动,或前或后。而不希望它横着移动,那就成漂移了。
为了实现以上几点,我找了很多资料,可是什么也没找到。自己也想了很多算法,可是往往会出现问题。值得注意的一点是要移动物体只有一个Object3D类中的translate方法可以使用,不过很容易是我们的车子横着就走了——我曾经通过角度计算来计算物体移动的X,Y分量,可是效果横不好,用translate移动时会有误差。所以建议大家不要用这个方法。
这里介绍一个我已经实践成功的方法。
其实1、2点较易实现,只要让物体、camera二者先对准一个方向,然后同时旋转、移动即可。
比较难的是3、4点,想要实现相对静止,就要使从物体原点(这里是相对坐标)到camera的向量不变。想要实现它,我们就必须知道这个向量是什么,通过它找到物体相对坐标中的那个点,然后将camera的位置设置到那里。下面介绍几个用到的方法,肯定对你有用,我也了解这些方法后才想出这个方法的。
设置物体中心setCenter,它用来设置物体的中心,初始为(0,0,0)这是相对坐标,我们直接把这个参数设为物体原点(这里是相对坐标)到camera的向量。这样这个物体的中心就是这个点了。
获取物体中心的世界坐标,getTransformeCenter.
设置camera位置,setPosition,只要将参数设置为getTransformeCenter的返回值就可以了。
通过以上方法,我们无论怎么动物体,camera总是与它相对静止的。
第4点的实现
其实我们可以发现,我们的camera在移动时可以做到我们的视线射出的方向总是与移动的方向同线(不是旋转的时候,只是移动),这是因为camera的一个移动的方法是world.getCamera().moveCamera(world.getCamera().getDirection(),move)——就是这个moveCamera方法。而我们的物体(例如小车),头尾连线与我们视线射出的方向是一致的,只要我们让小车跟着camera走,就能实现第4个要求。要实现小车跟着camera走还是很容易的,我们可以先获得camera的位置p1,然后减去一个向量,就是我们之前setCenter中设的那个向量,就得到了小车的应该移动到的位置。然后再用该位置减去小车现在的位置就得到了小车的移动向量,或者说是translate方法的参数x、y、z分量。
第4点不是一定要实现的,视情况而定。
值得注意的一个问题,由于实现相对静止时是camera跟着小车,而实现按规则移动时是小车跟着camera,所以要注意这里面的顺序问题,可能会引起小车不能动。
最后如果觉得里面的方法有些不太了解,可以看下我前面关于世界坐标与相对坐标的文章,相信会有些帮助的。