本节内容是在第一人称漫游上完成的,请先了解上文中第一人称漫游的实现.
这一节讲下第三人称漫游是如何实现,第三人称,简单来说,就是在你后面会跟着一台摄像机顺着你拍摄。
先看一下失败的尝试。这个方法是把人定在摄像机方向的前面,结合前面第一人称漫游的实现,如果只是前后左右移动,人和摄像机是一起的,这样是不用改动,关键是原来以摄像机为原点旋转,而这个我们要以人为原点来旋转,先来看下水平左右的的旋转实现,如下图:
根据上面关系,我们主要代码如下,大致过程如下,人左右旋转,然后得到摄像机的新位置,摄像机再调整方向,根据摄像机的方向与人的距离设定人的位置。
1 type ThreeCamera() = 2 let camera = new Camera() 3 let mutable toEye = 1.f 4 member this.Eye with get() = camera.Eye 5 member this.Target with get() = camera.Target 6 member this.Location 7 with get() = 8 let mutable tv = camera.Target-camera.Eye 9 tv.Normalize() 10 camera.Eye + tv * toEye 11 member this.ToEye with get() = toEye and set value = toEye <- value 12 member this.Transelt (x,y,z) = 13 camera.Transelt(x,y,z) 14 //左右对中心转 15 member this.RightAndLeft x = 16 let origin = this.Location 17 let oe = camera.Eye - origin 18 let length = oe.Length 19 let oex = Vector2(oe.X,oe.Z) 20 let oez = Vector2(-oe.Z,oe.X) 21 let sinLR =length * float32 (Math.Sin(x)) 22 let cosLR =length * float32 (Math.Cos(x)) 23 //得到摄像机新位置 24 let newEye = oex * cosLR + oez * sinLR + Vector2(origin.X,origin.Z) 25 camera.Eye <- Vector3(newEye.X,camera.Eye.Y,newEye.Y) 26 //重新调整摄像机的方向 27 camera.XAngle <- camera.XAngle + x