主贴链接:https://tieba.baidu.com/p/6574833207
既然要移动视角,那么肯定要捕获光标(即鼠标指针),那就得用到Input类下的get_mouse_mode和set_mouse_mode
其中我们需要知道的参数只有两个:
Input.MOUSE_MODE_CAPTURED捕获
Input.MOUSE_MODE_VISIBLE释放
在脚本中添加以下代码:
这样,在节点加载完成时,就会将鼠标模式改成“捕获”(将光标隐藏,并固定在中心)
这样是将鼠标捕获了,可你会发现:你不能关闭游戏了!因为光标固定在中心!
当然,你可以通过键盘关闭游戏。但,这对玩家来说是糟糕的体验!
所以你还得添加这段代码到_process()函数下:
就是每帧检测你是否按下绑定的按键,按下后则获取鼠标模式并判读是否为“释放”,如果是(真)则将鼠标模式设置为“捕获”。如果不是(假)则将鼠标模式设置为“释放”
这样,你就可以正常地游玩了。
接下来我们就说一下:怎么移动视角?
我们只需要认识“欧拉角”就行了,
编辑器中的欧拉角:
红色:X轴,“上下点头”
绿色:Y轴,“左右摇头”
蓝色:Z轴,额...算了,想不出形容词
听起来好像只需要转转XYZ轴,但实际麻烦多了
而其中新手最容易出问题的是“轴顺序”问题:
1.先向前10像素,再向右5像素
2.先向右5像素,再向前10像素
上面两个例子好像终点相同,可在欧拉角中,三个轴所经过的区域是个球面!而球面是曲面!它并不平整,所以轴的旋转是有顺序的!
了解欧拉角后,我们直接来看一下视角旋转的代码:
注:我们这里并不是将旋转作用于一个节点的,而是:左右旋转时,旋转KinematicBody;上下旋转时,旋转eye
这样可以显得更自然,并且为简化了后续操作(如全局坐标移动)
短短5行代码,含金量却很高
首先,声明一个“光标移动速度”为0.2
然后,调用内置函数_input()它在玩家输入时被调用,它可以传入一个参数,这个参数为:当前玩家输入类型(如,按键输入,鼠标点击,鼠标移动)
接下来,做一个判断:参数event是否为属于InputEventMouseMotion类
(底下的relative属性属于InputEventMouseMotion类,为了防止玩家输入其他类型时报错[如鼠标点击],所以判断)
并且此时的鼠标模式为“捕获”
后两行解释:
relative属性返回的是此时鼠标相对于上一帧的位置(二维向量)
例:鼠标相对于上一帧向左移动了10,则返回(-10,0),而relative.x即为-10
然后将其乘以“鼠标移动速度”
再乘-1(变为相反数)因为欧拉角“向左为正”,而编辑器中“向左为负”
然后用deg2rad()将它们转化为弧度,这一步并不重要,只不过是因为即使将relative乘0.2,它的值以弧度来说,依旧大的出奇,而我并不喜欢将“鼠标速度”设置得特别小(例如0.025),所以我默认它是角度,以此来降低灵敏度。当然你完全可以修改mouse_speed的值来替代这一步。
rotate_y和rotate_x就是以y和x轴旋转
这样,人物就可以在三维世界中自由得观察了
当然,到这还并不完美,比如人物的eye可以360度旋转,在下试了clamp(),但闪屏严重,暂未找到完美解决方案
还是请教一下吧主吧@人类的大敌
虽然人物可以观察四周了,但你会发现,人物不会朝着看的方向行进,这是因为move_and_slide()是按照全局坐标移动的,下节我们就研究一下“全局坐标”
既然要移动视角,那么肯定要捕获光标(即鼠标指针),那就得用到Input类下的get_mouse_mode和set_mouse_mode
其中我们需要知道的参数只有两个:
Input.MOUSE_MODE_CAPTURED捕获
Input.MOUSE_MODE_VISIBLE释放
在脚本中添加以下代码:
这样,在节点加载完成时,就会将鼠标模式改成“捕获”(将光标隐藏,并固定在中心)
这样是将鼠标捕获了,可你会发现:你不能关闭游戏了!因为光标固定在中心!
当然,你可以通过键盘关闭游戏。但,这对玩家来说是糟糕的体验!
所以你还得添加这段代码到_process()函数下:
就是每帧检测你是否按下绑定的按键,按下后则获取鼠标模式并判读是否为“释放”,如果是(真)则将鼠标模式设置为“捕获”。如果不是(假)则将鼠标模式设置为“释放”
这样,你就可以正常地游玩了。
接下来我们就说一下:怎么移动视角?
我们只需要认识“欧拉角”就行了,
编辑器中的欧拉角:
红色:X轴,“上下点头”
绿色:Y轴,“左右摇头”
蓝色:Z轴,额...算了,想不出形容词
听起来好像只需要转转XYZ轴,但实际麻烦多了
而其中新手最容易出问题的是“轴顺序”问题:
1.先向前10像素,再向右5像素
2.先向右5像素,再向前10像素
上面两个例子好像终点相同,可在欧拉角中,三个轴所经过的区域是个球面!而球面是曲面!它并不平整,所以轴的旋转是有顺序的!
了解欧拉角后,我们直接来看一下视角旋转的代码:
注:我们这里并不是将旋转作用于一个节点的,而是:左右旋转时,旋转KinematicBody;上下旋转时,旋转eye
这样可以显得更自然,并且为简化了后续操作(如全局坐标移动)
短短5行代码,含金量却很高
首先,声明一个“光标移动速度”为0.2
然后,调用内置函数_input()它在玩家输入时被调用,它可以传入一个参数,这个参数为:当前玩家输入类型(如,按键输入,鼠标点击,鼠标移动)
接下来,做一个判断:参数event是否为属于InputEventMouseMotion类
(底下的relative属性属于InputEventMouseMotion类,为了防止玩家输入其他类型时报错[如鼠标点击],所以判断)
并且此时的鼠标模式为“捕获”
后两行解释:
relative属性返回的是此时鼠标相对于上一帧的位置(二维向量)
例:鼠标相对于上一帧向左移动了10,则返回(-10,0),而relative.x即为-10
然后将其乘以“鼠标移动速度”
再乘-1(变为相反数)因为欧拉角“向左为正”,而编辑器中“向左为负”
然后用deg2rad()将它们转化为弧度,这一步并不重要,只不过是因为即使将relative乘0.2,它的值以弧度来说,依旧大的出奇,而我并不喜欢将“鼠标速度”设置得特别小(例如0.025),所以我默认它是角度,以此来降低灵敏度。当然你完全可以修改mouse_speed的值来替代这一步。
rotate_y和rotate_x就是以y和x轴旋转
这样,人物就可以在三维世界中自由得观察了
当然,到这还并不完美,比如人物的eye可以360度旋转,在下试了clamp(),但闪屏严重,暂未找到完美解决方案
还是请教一下吧主吧@人类的大敌
虽然人物可以观察四周了,但你会发现,人物不会朝着看的方向行进,这是因为move_and_slide()是按照全局坐标移动的,下节我们就研究一下“全局坐标”