编译器版本 3.5.2
这里使用鼠标右键滑动监听视角转动,定义上下角度不超过8度,左右不超过20度,避免晃动太剧烈。按下和抬起的时候记录位置,然后进行方向转动
private rotax:number=8;
private rotay:number=20;
private mouseDownX:number=0;
private mouseDownY:number=0;
private mouseUpX:number=0;
private mouseUpY:number=0;
private box=new BoxCollider();
start() {
input.on(Input.EventType.MOUSE_DOWN, this.onMouseDownRight, this);
input.on(Input.EventType.MOUSE_UP, this.onMouseUpRight, this);
}
onMouseDownRight(event:EventMouse){
if(event.getButton()==2){
this.mouseDownX=event.getLocationX();
this.mouseDownY=event.getLocationY();
}
}
onMouseUpRight(event:EventMouse){
if(event.getButton()==2){
this.mouseUpX=event.getLocationX();
this.mouseUpY=event.getLocationY();
viewUtil.viewTransfer(this.mouseUpY-this.mouseDownY,this.mouseUpX-this.mouseDownX,this.node,this.rotay,this.rotax)
}
}
/**
* 处理视角移动
* @param x 鼠标垂直移动距离
* @param y 鼠标水平移动距离
* @param node 当前节点
* @param rotay 水平限定角度
* @param rotax 垂直限定角度
*/
static viewTransfer(x:number,y:number,node:Node,rotay:number,rotax:number){
let rota_move=new Quat();
let rota_cur=new Quat();
x=x*360/1000;
y=-y*360/1000;
node.getRotation(rota_cur);
Quat.toEuler(rota_move,rota_cur)
let tempx=0;
if(rota_move.x+x>rotax){
tempx=rotax;
} else if(rota_move.x+x<-rotax){
tempx=-rotax;
}else{
tempx=x
}
let tempy=0;
if(y>rotay){
tempy=rota_move.y+rotay;
} else if(y<-rotay){
tempy=rota_move.y-rotay;
}else{
tempy=rota_move.y+y
}
let rota_target=new Vec3(-tempx,tempy,0);
node.setRotationFromEuler(rota_target);
}
还是将四元数转为欧拉角,比人物移动要简单一些,只需要设置方向就行。