Rotation velocity drag coeffient [0 .. 1] 0: Spins forever 1: Instantly stops spinning
右键旋转系数
清理控制器的eventValues和自定义数据结构
计算摄像机Z方向
:摄像机位置
:摄像机Z方向(归一化)
判断前后 计算 camera Z向量与 up方向 的点积(cos),orbiteControl中使用 1、camera在上半球,cos 正值 2、camera在下半球,cos 负值
| Y cross
|
|
|_________________________________________________X (原来的 Y up)
camera /
。 / 。camera的Z轴向量(求xy与(1,0)的点积)
/
/
/
/ Z (camera -X )
:摄像机位置
:Up向量与Z向量的点积(标量值,共面二维化)
计算摄像机Up向量与Z向量的点积,orbiteControl中使用
| Y不变
| 。point(求xy与(1,0)的点积)
|_________________________________________________X (X0Z)
/ / Z (cross)
:摄像机位置
:Up向量与Z向量的点积(标量值,共面二维化)
判断左右 计算 Y轴Up向量 与camera Z向量的叉积(sin),orbiteControl中使用 1、右侧:摄像机Z指向北极,sin 负值 2、左侧:摄像机Z指向南极,sin 正值;翻转了
|Y(cross)
|
| 。vector(point乘逆矩阵,忽略z值,xy与(1,—0)进行cross,即sin
——————————————————————————————————————————————————————————————————————————————————X(原来的Y轴)
/ 。point
/
/Z(camera -X)
:Up向量:固定,top时:(0,1,0),bottom时:(0,-1,0)
:摄像机位置
:Up向量与Z向量的叉积(标量值,共面二维化)
获取相机控制器的输入值 1、arcball、wasd相同,都是用此函数
接收输入事件,处理事件相关数据,并返回是否后续继续处理了该事件(仅独占intercept优先级) 1、接受输入event,并按需写入eventValues 2、或者控制器自定义的数据结构
事件对象
事件类型
返回true/false,取决于对应的优先级别。 true, A、broadcastStart|broadcastEnd优先级,返回不影响后续处理。 B、InputManager 将终止处理(仅独占intercept优先级)该事件(继续广播) false A、broadcastStart|broadcastEnd无影响 B、如果是intercept优先级,返回false,InputManager 将继续处理该事件(继续广播) 例如: 1、pickup 事件,只是获取点击和xy坐标,不影响其他控制器,返回false。pickup是举例,不在这里实现。 2、camera control,也是具有兼容性,在最后处理。如果有控制器截获并终止,camera control 就不会收到处理 3、object control,就会截获并终止,其他object control 就不会收到处理
注册控制器使用的input事件到ECS对应事件队列
事件类型
优先级
控制器
是否注册成功
更新相机位置,这里更新camera的position和dir 1、position是在camera的lookat位置为原点的坐标系下的位置 (最后调用camera的updateByPositionDirection()会转化为camera的local坐标系下的位置) 2、direction是在camera的lookat位置为原点的坐标系下的方向向量 A、lookat为原点的坐标系与camera的local坐标系是只有position是不一样的,各自为原点。view空间是一致的,即xyz的分量相对于camera的parent的坐标系一致
arcball 控制器