我正在尝试使用游戏手柄在Three.js中旋转相机,使用第一人称射击风格的控制。
浏览器检测到游戏手柄并识别它的输入,但相机的旋转顺序是错误的。当我在相机的本地Y轴上旋转时,它也会考虑本地X轴旋转,这是不必要的。
看起来我和this guy有同样的问题,但他的问题是用Three.js r54解决的,我用的是r60。他设置了camera.eulerOrder = "YXZ";
来让它工作,但目前等效的camera.rotation.order = "YXZ";
似乎对我不起作用。
我知道Three.js内置的“FirstPersonControls”类,但它不适合我,因为它不接受控制器输入,而且以后再把其他非移动控件硬塞进去会很麻烦。我也知道gamepad.js,对使用它没有兴趣。
有人能帮忙吗?
我的轮换代码:
function pollGamepad()
{
gamepad = navigator.webkitGetGamepads()[0];
//Rotation
if(gamepad.axes[3] > 0.20)
{
camera.rotateX(-gamepad.axes[3] * 0.02);
}
if(gamepad.axes[3] < -0.20)
{
camera.rotateX(-gamepad.axes[3] * 0.02);
}
if(gamepad.axes[2] < -0.20)
{
camera.rotateY(-gamepad.axes[2] * 0.02);
}
if(gamepad.axes[2] > 0.20)
{
camera.rotateY(-gamepad.axes[2] * 0.02);
}
}
字符串
3条答案
按热度按时间bvjxkvbb1#
PointerLockControls
使用的方法是创建对象的层次结构:yawObject
包含pitchObject
包含camera
。然后水平鼠标(或操纵杆)移动将改变偏航对象的Y旋转,垂直鼠标(或操纵杆)移动将改变俯仰对象的X旋转,相机的旋转将保持固定在默认的(0, 0, -1)
。这只是手动模拟EulerYXZ
排序,但它可能更适合你。如果你需要获得整体旋转,它确实会产生一些尴尬。在我最近编写的一个自定义控制器中,我通过将相机
add()
设置为单个父对象并将父对象的Euler阶数设置为YXZ
来实现相同的结果。我不记得为什么这比直接在相机上设置更好,但确实如此。30byixjq2#
我自己也遇到了这个问题,我想出了一个简单的解决方案。在执行y旋转之前,总是将相机的x旋转重置为零。然后,恢复x旋转。所以:
字符串
hlswsv353#
我按了每个按钮直到它工作这是它弹出的代码
字符串