
人工智能和行为
|
273
//
算出我们的朝向(正面方向)
let forward = CGPoint(x: 0, y: 1).rotatedBy(radians: self.zRotation)
//
计算需要旋转的角度
var angle = toTarget.dot(other: forward)
angle /= acos(toTarget.length * forward.length)
//
将这个角度限制在最大转向速度之内
angle = min(angle, CGFloat(self.turningSpeed))
angle = max(angle, CGFloat(-self.turningSpeed))
//
进行转向
self.zRotation += angle * deltaTime
讨论
我们可以先将两个向量进行点乘(点积运算),将点乘结果除以两者长度之积的反
余弦值,即可计算出两个向量之间的夹角。
要达到慢慢转向的效果,我们可以用一个最大转向速度来限制要转的角度(以防止
我们的对象一下就转到目标位置),最后再乘以转向时间,以秒为单位。
9.8
隐蔽点问题
问题
我们想找出一个对象能够达到并不被其他对象发现的地方。
解决方案
首先,统计一张列表,罗列对象(即“猎物”)附近有可能够移动到的位置点。
然后,绘制出从其他对象(即“捕猎者”)到达这些点的线路。检查是否有某条线
路能够被一个对象遮挡。如果是,这个点就有可能是一个隐蔽点。
然后,设计出从当前位置到达每个潜在隐蔽点的路径(见
9.9 ...