本节内容是在第一人称漫游上完成的,请先了解上文中第一人称漫游的实现.

这一节讲下第三人称漫游是如何实现,第三人称,简单来说,就是在你后面会跟着一台摄像机顺着你拍摄。

先看一下失败的尝试。这个方法是把人定在摄像机方向的前面,结合前面第一人称漫游的实现,如果只是前后左右移动,人和摄像机是一起的,这样是不用改动,关键是原来以摄像机为原点旋转,而这个我们要以人为原点来旋转,先来看下水平左右的的旋转实现,如下图:

 

Opengl绘制我们的小屋(四)第三人称漫游

根据上面关系,我们主要代码如下,大致过程如下,人左右旋转,然后得到摄像机的新位置,摄像机再调整方向,根据摄像机的方向与人的距离设定人的位置。

 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
View Code

相关文章: